| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772 |
- package com.dk.oauth.service.impl;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONObject;
- import com.baomidou.mybatisplus.core.metadata.IPage;
- import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
- import com.dk.common.exception.BaseBusinessException;
- import com.dk.common.infrastructure.constant.Constant;
- import com.dk.common.infrastructure.constant.OauthConstants;
- import com.dk.common.infrastructure.enums.ErrorCodeEnum;
- import com.dk.common.model.response.mst.StaffResponse;
- import com.dk.common.response.ResponseCodeEnum;
- import com.dk.common.response.ResponseResultUtil;
- import com.dk.common.response.ResponseResultVO;
- import com.dk.common.util.AESUtil;
- import com.dk.common.util.DateUtils;
- import com.dk.common.util.HttpUtils;
- import com.dk.oauth.config.WxConfig;
- import com.dk.oauth.dto.AuthAccessTokenDto;
- import com.dk.oauth.entity.*;
- import com.dk.oauth.feign.service.StaffFeign;
- import com.dk.oauth.mapper.AuthAccessTokenMapper;
- import com.dk.oauth.mapper.CompanyMapper;
- import com.dk.oauth.mapper.TradeMapper;
- import com.dk.oauth.mapper.UserMapper;
- import com.dk.oauth.service.IAuthAccessTokenService;
- import com.dk.oauth.shiro.jwt.JWTGenerator;
- import com.dk.oauth.util.AESSecurityUtil;
- import com.dk.oauth.util.UUID;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl;
- import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
- import org.apache.shiro.SecurityUtils;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.data.redis.core.StringRedisTemplate;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import javax.annotation.Resource;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.File;
- import java.time.LocalDate;
- import java.time.LocalDateTime;
- import java.util.*;
- import java.util.concurrent.TimeUnit;
- import java.util.stream.Collectors;
- /**
- * (AuthAccessToken)表服务实现类
- *
- * @author dapeng
- * @since 2022-07-01 09:41:05
- */
- @Slf4j
- @Service("authAccessTokenService")
- public class AuthAccessTokenServiceImpl extends ServiceImpl<AuthAccessTokenMapper, AuthAccessToken> implements IAuthAccessTokenService {
- private final Logger logger = LoggerFactory.getLogger(this.getClass());
- @Resource
- private AuthAccessTokenMapper authAccessTokenMapper;
- @Resource
- private UserMapper userMapper;
- @Resource
- private CompanyMapper companyMapper;
- @Value("${aes-key}")
- private String AESKey;
- @Resource
- private StringRedisTemplate stringRedisTemplate;
- @Autowired
- private WxConfig config;
- @Autowired
- private TradeMapper tradeMapper;
- @Resource
- private StaffFeign staffFeign;
- /**
- * 分页查询
- *
- * @param
- * @return
- */
- @Override
- public ResponseResultVO pageQuery(AuthAccessTokenDto authAccessTokenDto) {
- if (null == authAccessTokenDto.getPage()) {
- authAccessTokenDto.setPage(new Page(0, 10));
- }
- IPage<AuthAccessTokenDto> authAccessTokenDtos = authAccessTokenMapper.pageQuery(authAccessTokenDto.getPage(), authAccessTokenDto);
- return ResponseResultUtil.success(authAccessTokenDtos);
- }
- /**
- * @desc : 查询用户最新token
- * @author : 洪旭东
- * @date : 2022-08-02 17:30
- */
- public String getCurrentToken(Long userId) {
- return authAccessTokenMapper.getCurrentToken(userId);
- }
- /**
- * @desc : 登录凭证校验
- * @author : 姜永辉
- * @date : 2022/5/12 9:33
- */
- public ResponseResultVO<JSONObject> loginWechat(Map<String, Object> map) {
- ResponseResultVO<JSONObject> res = HttpUtils.get(config.getCode2Session()
- + "appid=" + config.getAppId()
- + "&secret=" + config.getAppSecret()
- + "&js_code=" + map.get("code")
- + "&grant_type=authorization_code");
- if (res.getData() != null && res.getData().get("errcode") != null) {
- return ResponseResultUtil.error(ResponseCodeEnum.OPERATE_FAIL.getCode(),
- res.getData().get("errmsg") == null ? res.getData().getString("errcode")
- : "微信服务器异常:" + res.getData().getString("errmsg"));
- }
- return res;
- }
- /**
- * @desc : 获取token
- * @author : 洪旭东
- * @date : 2024-02-20 14:04
- */
- public ResponseResultVO token(HttpServletRequest request) {
- UserLogin userLogin = userMapper.getByPhone(request.getParameter("phone"));
- if (userLogin == null || (!userLogin.getUserPwd().equals(request.getParameter("password")))) {
- //无用户 或 密码错误
- return ResponseResultUtil.error(ErrorCodeEnum.USER_PASSWORD_ERROR.getCode(), ErrorCodeEnum.USER_PASSWORD_ERROR.getMessage());
- }
- userLogin.checkUserLogin();
- try {
- // 设置应用代码
- userLogin.setAppCode(Constant.AppCode.WEB.getCode());
- return createToken(userLogin,true);
- } catch (Exception e) {
- log.error("获取accessToken发生异常=", e);
- return ResponseResultUtil.error(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
- }
- }
- /**
- * @desc : 小程序通过微信openid登录
- * @author : 洪旭东
- * @date : 2024-02-20 14:04
- */
- @Transactional(rollbackFor = Exception.class)
- public ResponseResultVO wxToken(UserWxLogin userWxLogin) {
- // todo
- // userWxLogin.setUserWxid("1");
- UserLogin userLogin = userMapper.getByWxid(userWxLogin.getUserWxid());
- if (userLogin == null) {
- //无用户
- return ResponseResultUtil.error(ErrorCodeEnum.USER_NOT_EXIST.getCode(), ErrorCodeEnum.USER_NOT_EXIST.getMessage());
- }
- userLogin.checkUserLogin();
- try {
- // 设置应用代码
- userLogin.setAppCode(Constant.AppCode.WEIXIN.getCode());
- return createToken(userLogin,true);
- } catch (Exception e) {
- log.error("获取accessToken发生异常=", e);
- return ResponseResultUtil.error(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
- }
- }
- /**
- * @desc : 小程序通过微信openid登录--体验的账号
- * @author : 姜永辉
- * @date : 2024-02-20 14:04
- */
- @Transactional(rollbackFor = Exception.class)
- public ResponseResultVO wxFeignExperienceToken(UserWxLogin userWxLogin) {
- UserLogin userLogin = userMapper.getByWxid(userWxLogin.getUserWxid());
- if (userLogin == null) {
- //无用户
- return ResponseResultUtil.error(ErrorCodeEnum.USER_NOT_EXIST.getCode(), ErrorCodeEnum.USER_NOT_EXIST.getMessage());
- }
- try {
- // 设置应用代码
- userLogin.setAppCode(Constant.AppCode.WEIXIN.getCode());
- return createFeignExperienceToken(userLogin);
- } catch (Exception e) {
- log.error("获取accessToken发生异常=", e);
- return ResponseResultUtil.error(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
- }
- }
- /**
- * @desc : 登录验证成功,生成token
- * @author : 姜永辉
- * @date : 2024-02-20 10:31
- */
- private ResponseResultVO<?> createFeignExperienceToken(UserLogin userLogin) throws OAuthSystemException {
- String clientId = "dkic";
- AuthAccessToken authAccessToken = new AuthAccessToken();
- String username = "";
- String userId = "";
- username = userLogin.getUserName();
- userId = String.valueOf(userLogin.getUserId());
- //当前公司
- CompanyResponse company = null;
- String accessToken = "";
- if (userLogin.getCurrentCp() != null) {
- company = companyMapper.getByCpId(userLogin.getCurrentCp());
- if (company != null) {
- // 解析license信息
- String licenseStr = AESUtil.desEncrypt(company.getLicense());
- if(licenseStr != null ){
- Map<String,Object> licenseMap = JSON.parseObject(licenseStr,Map.class);
- LocalDate endDate = LocalDate.parse(licenseMap.get("end_date").toString());
- // 判断是否到期
- LocalDate nowDate = LocalDate.now();
- if(endDate.isBefore(nowDate)){
- return ResponseResultUtil.error(ErrorCodeEnum.LICENSE_OVER_DATE.getCode(), ErrorCodeEnum.LICENSE_OVER_DATE.getMessage());
- }
- if(licenseMap.get("web_max_num") != null){
- company.setWebMaxNum(Integer.parseInt(licenseMap.get("web_max_num").toString()));
- }
- if(licenseMap.get("wx_max_num") != null){
- company.setWxMaxNum(Integer.parseInt(licenseMap.get("wx_max_num").toString()));
- }
- company.setEndDate(endDate);
- if(licenseMap.get("user_end_date") != null){
- company.setUserEndDate(LocalDate.parse(licenseMap.get("user_end_date").toString()));
- }
- if(licenseMap.get("vip") != null){
- company.setVip(Boolean.parseBoolean(licenseMap.get("vip").toString()));
- }
- company.setGradeCode(licenseMap.get("grade_code").toString());
- }else{
- // 获取最近一次的交易记录
- List<TradeResponse> tradeResponses = tradeMapper.selectTrade(new Trade().setCpId(company.getCpId()));
- if(tradeResponses != null && tradeResponses.size() >0){
- company.setTrade(tradeResponses.get(0));
- }
- }
- JWTGenerator jwtGenerator = new JWTGenerator();
- jwtGenerator.setSalt(username);
- jwtGenerator.setUsername(username);
- jwtGenerator.setUserId(userId);
- jwtGenerator.setUserWxId(userLogin.getUserWxid());
- jwtGenerator.setClientId(clientId);
- jwtGenerator.setCpId(company.getCpId().toString());
- jwtGenerator.setCpCode(company.getCpCode());
- OAuthIssuerImpl oAuthIssuer = new OAuthIssuerImpl(jwtGenerator);
- accessToken = oAuthIssuer.accessToken();
- log.info("服务器生成的accessToken=" + accessToken);
- // 保存token
- authAccessToken.setId(UUID.uuid32());
- authAccessToken.setClientId(clientId);
- authAccessToken.setTokenId(accessToken);
- authAccessToken.setUserId(userId);
- authAccessToken.setUserWxId(userLogin.getUserWxid());
- authAccessToken.setCreateDate(new Date());
- authAccessToken.setCpId(company.getCpId().toString());
- authAccessToken.setCpCode(company.getCpCode());
- authAccessToken.setTokenExpiredSeconds(OauthConstants.EXPIRES_IN);
- log.info("---->>>SecurityUtils.getSubject().isAuthenticated() = " + SecurityUtils.getSubject().isAuthenticated());
- // endregion
- // region 加密accessToken
- try {
- accessToken = AESSecurityUtil.encrypt(AESKey, accessToken);
- } catch (Exception e) {
- logger.error("sorry,accessToken({}) encode faild!!", accessToken);
- }
- }
- }
- // 默认取体验公司的账号
- // Map<String, Object> collectQuery = new HashMap<>();
- // collectQuery.put("cpId", userLogin.getCurrentCp());
- // collectQuery.put("staffCode", "东科智云-体验");
- // ResponseResultVO<StaffResponse> feignExperience = staffFeign.getFeignExperience(collectQuery);
- // StaffResponse s = new StaffResponse();
- // log.info("---->>>getFeignExperience = " + feignExperience.toString());
- // //如果没有成功返回,状态设置为待审
- // if (feignExperience.getCode() != ResponseCodeEnum.SUCCESS.getCode()) {
- // //无用户
- // return ResponseResultUtil.error(ErrorCodeEnum.USER_NOT_EXIST.getCode(), ErrorCodeEnum.USER_NOT_EXIST.getMessage());
- // } else {
- // s = feignExperience.getData();
- // }
- UserLoginSuccess userLoginSuccess = new UserLoginSuccess()
- .setByUserLogin(userLogin)
- .setAccessToken(accessToken)
- .setCompany(company)
- ;
- return ResponseResultUtil.success(userLoginSuccess);
- }
- /**
- * @desc : 注册-创建员工的时候保存微信用户信息
- * @author : 姜永辉
- * @date : 2024-02-20 13:55
- */
- @Transactional(rollbackFor = Exception.class)
- public ResponseResultVO<?> registerFeign(Map<String, Object> map) {
- UserWxLogin userWxLogin = new UserWxLogin();
- userWxLogin.setCurrentCp(Integer.parseInt(map.get("currentCp") + ""));
- userWxLogin.setUserPhone(map.get("userPhone") + "");
- userWxLogin.setUserName(map.get("userName") + "");
- UserLogin userLogin = userMapper.getByPhone(userWxLogin.getUserPhone());
- if (userLogin == null) {
- //注册
- List<Integer> joinedCps = new ArrayList<>();
- joinedCps.add(userWxLogin.getCurrentCp());
- userWxLogin.setCurrentCp(userWxLogin.getCurrentCp());
- userWxLogin.setJoinedCps(joinedCps);
- userMapper.insert(userWxLogin);
- } else {
- List<Integer> joinedCps = userLogin.getJoinedCps();
- userWxLogin.setUserId(userLogin.getUserId());
- if (userLogin.getCurrentCp() == null) {
- userLogin.setCurrentCp(userWxLogin.getCurrentCp());
- }
- if (joinedCps == null) {
- joinedCps = new ArrayList<>();
- joinedCps.add(userWxLogin.getCurrentCp());
- userWxLogin.setJoinedCps(joinedCps);
- userMapper.updateCpid(userLogin.getUserId(), userLogin.getCurrentCp(), userWxLogin.getJoinedCps());
- }
- if (joinedCps != null && !joinedCps.contains(userWxLogin.getCurrentCp())) {
- Integer cp = userWxLogin.getCurrentCp();
- List<Integer> joinedCpsNew = new ArrayList<>();
- joinedCpsNew.addAll(joinedCps);
- joinedCpsNew.add(cp);
- userWxLogin.setJoinedCps(joinedCpsNew);
- userMapper.updateCpid(userLogin.getUserId(), userLogin.getCurrentCp(), userWxLogin.getJoinedCps());
- }
- }
- Map<String, Object> mapReturn = new HashMap<>();
- mapReturn.put("userId", userWxLogin.getUserId());
- mapReturn.put("userName", userWxLogin.getUserName());
- mapReturn.put("userPhone", userWxLogin.getUserPhone());
- return ResponseResultUtil.success(mapReturn);
- }
- /**
- * @desc :离职时候更新 用户的openid current_cp , "joined_cps" 缩减相应的cpid
- * @author : 姜永辉
- * @date : 2024-02-20 13:55
- */
- @Transactional(rollbackFor = Exception.class)
- public ResponseResultVO<?> updateClearOpenidFeign(Map<String, Object> map) {
- String userId = map.get("userId") + "";
- Integer cpId = Integer.parseInt(map.get("cpId") + "");
- UserLogin userLogin = userMapper.selectById(userId);
- Integer cpIdNew = null;
- if (userLogin != null) {
- List<Integer> joinedCps = new ArrayList<>();
- joinedCps = userLogin.getJoinedCps();
- if (joinedCps != null) {
- joinedCps = joinedCps.stream() // 将List转换为Stream
- .filter(n -> n != cpId) // 过滤掉我们不想要的元素
- .collect(Collectors.toList()); // 收集结果到新的List
- if (joinedCps != null && joinedCps.size() > 0) {
- cpIdNew = joinedCps.get(0);
- }
- }
- userMapper.updateClearOpenidFeign(userId, cpIdNew, joinedCps != null && joinedCps.size() == 0 ? null : joinedCps);
- }
- return ResponseResultUtil.success();
- }
- /**
- * @desc : 注册
- * @author : 洪旭东
- * @date : 2024-02-20 13:55
- */
- @Transactional(rollbackFor = Exception.class)
- public ResponseResultVO<?> register(UserWxLogin userWxLogin) {
- UserLogin userLogin = userMapper.getByWxid(userWxLogin.getUserWxid());
- //通过openid查到用户,但手机号为空
- if (userLogin != null && userLogin.getUserPhone() == null) {
- //将其他微信用户的相同电话清空
- userMapper.cleanPhone(userWxLogin.getUserPhone());
- //更新当前手机号
- userMapper.updatePhone(userLogin.getUserId(), userWxLogin.getUserPhone());
- }
- if (userLogin == null) {
- //openid没查到,用手机号再查一次
- userLogin = userMapper.getByPhone(userWxLogin.getUserPhone());
- } else if (userLogin.getUserWxid() == null) {
- //通过手机号查到了用户,但是openid是空,更新上当前的openid
- userMapper.updateWxid(userLogin.getUserId(), userWxLogin.getUserWxid());
- }
- //用户无法通过openid或手机号查到 或 通过手机号查到了,但openid不同
- if (userLogin == null) {
- //将其他微信用户的相同电话清空
- userMapper.cleanPhone(userWxLogin.getUserPhone());
- //注册
- userMapper.insert(userWxLogin);
- userLogin = userMapper.getByWxid(userWxLogin.getUserWxid());
- }
- if (!userWxLogin.getUserWxid().equals(userLogin.getUserWxid())) {
- //通过手机号查到了用户,但是openid是空,更新上当前的openid
- userMapper.updateWxid(userLogin.getUserId(), userWxLogin.getUserWxid());
- userLogin.setUserWxid(userWxLogin.getUserWxid());
- }
- userLogin.checkUserLogin();
- try {
- return createToken(userLogin,false);
- } catch (Exception e) {
- log.error("获取accessToken发生异常=", e);
- return ResponseResultUtil.error(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
- }
- }
- /**
- * @desc : 退出登录
- * @author : 洪旭东
- * @date : 2024-02-20 13:55
- */
- @Transactional(rollbackFor = Exception.class)
- public ResponseResultVO logout(UserWxLogin userWxLogin) {
- // userMapper.updateWxid(userWxLogin.getUserId(), null);
- // 更新cpid为空 240701
- userMapper.updateCpid(userWxLogin.getUserId(), null, null);
- return ResponseResultUtil.success();
- }
- /**
- * @desc : 验证当前扫码登录是否匹配到openid
- * @author : 洪旭东
- * @date : 2024-02-20 14:04
- */
- public ResponseResultVO<?> checkLoginOpenId(String uuid) {
- String openId = stringRedisTemplate.opsForValue().get(Constant.RedisConstant.REDIS_LOGIN_UUID.getName() + uuid);
- if (openId != null && !"".equals(openId)) {
- UserLogin userLogin = userMapper.getByWxid(openId);
- if (userLogin == null) {
- stringRedisTemplate.opsForValue().set(Constant.RedisConstant.REDIS_LOGIN_UUID.getName() + uuid, "", 5, TimeUnit.MINUTES);
- //无用户
- return ResponseResultUtil.error(ErrorCodeEnum.USER_NOT_EXIST.getCode(), ErrorCodeEnum.USER_NOT_EXIST.getMessage());
- }
- userLogin.checkUserLogin();
- try {
- return createToken(userLogin,false);
- } catch (OAuthSystemException e) {
- e.printStackTrace();
- log.error("获取accessToken发生异常=", e);
- return ResponseResultUtil.error(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
- }
- } else {
- return ResponseResultUtil.error(ResponseCodeEnum.NO_LOGIN);
- }
- }
- /**
- * @desc : 切换企业
- * @author : 周兴
- * @date : 2024-03-19 14:04
- */
- public ResponseResultVO<?> changeCp(UserLogin userLogin) throws OAuthSystemException {
- // 更新用户的当前企业
- if (userLogin.getCurrentCp() != Constant.Experience.profession.getName()
- && userLogin.getCurrentCp() != Constant.Experience.Standard.getName()) {
- userMapper.updateCpid(userLogin.getUserId(), userLogin.getCurrentCp(), userLogin.getJoinedCps());
- }
- //当前公司
- CompanyResponse company = null;
- String accessToken = "";
- String clientId = "dkic";
- AuthAccessToken authAccessToken = new AuthAccessToken();
- String userId = userLogin.getUserId();
- String username = userLogin.getUserName();
- // 生成token
- company = companyMapper.getByCpId(userLogin.getCurrentCp());
- if (company != null) {
- JWTGenerator jwtGenerator = new JWTGenerator();
- jwtGenerator.setSalt(username);
- jwtGenerator.setUsername(username);
- jwtGenerator.setUserId(userId);
- jwtGenerator.setClientId(clientId);
- jwtGenerator.setCpId(company.getCpId().toString());
- jwtGenerator.setCpCode(company.getCpCode());
- jwtGenerator.setAppCode(userLogin.getAppCode());
- OAuthIssuerImpl oAuthIssuer = new OAuthIssuerImpl(jwtGenerator);
- accessToken = oAuthIssuer.accessToken();
- log.info("服务器生成的accessToken=" + accessToken);
- // 保存token
- authAccessToken.setId(UUID.uuid32());
- authAccessToken.setClientId(clientId);
- authAccessToken.setTokenId(accessToken);
- authAccessToken.setCreateDate(new Date());
- authAccessToken.setUserId(userId);
- authAccessToken.setCpId(company.getCpId().toString());
- authAccessToken.setCpCode(company.getCpCode());
- authAccessToken.setAppCode(userLogin.getAppCode());
- authAccessToken.setTokenExpiredSeconds(OauthConstants.EXPIRES_IN);
- log.info("---->>>SecurityUtils.getSubject().isAuthenticated() = " + SecurityUtils.getSubject().isAuthenticated());
- // endregion
- // region 加密accessToken
- try {
- accessToken = AESSecurityUtil.encrypt(AESKey, accessToken);
- // 往redis记录缓存
- Map<String, Object> ul = new HashMap<>();
- ul.put("accessToken", accessToken);
- ul.put("opUpdateTime", LocalDateTime.now());
- stringRedisTemplate.opsForValue().set(Constant.RedisConstant.REDIS_USER_LOGIN.getName() + '_' + userId + '_' + userLogin.getAppCode(), JSONObject.toJSONString(ul));
- } catch (Exception e) {
- logger.error("sorry,accessToken({}) encode faild!!", accessToken);
- }
- }
- return ResponseResultUtil.success(accessToken);
- }
- /**
- * @desc : 登录验证成功,生成token
- * @author : 洪旭东
- * @date : 2024-02-20 10:31
- */
- private ResponseResultVO<?> createToken(UserLogin userLogin,Boolean checkOverDate) throws OAuthSystemException {
- String clientId = "dkic";
- AuthAccessToken authAccessToken = new AuthAccessToken();
- // region 开始生成Access Token
- String username = "";
- String userId = "";
- username = userLogin.getUserName();
- userId = String.valueOf(userLogin.getUserId());
- // endregion
- //当前公司
- CompanyResponse company = null;
- String accessToken = "";
- if (userLogin.getCurrentCp() != null) {
- company = companyMapper.getByCpId(userLogin.getCurrentCp());
- if (company != null) {
- // 解析license信息
- String licenseStr = AESUtil.desEncrypt(company.getLicense());
- if(licenseStr != null ){
- Map<String,Object> licenseMap = JSON.parseObject(licenseStr,Map.class);
- LocalDate endDate = LocalDate.parse(licenseMap.get("end_date").toString());
- if(checkOverDate){
- // 判断是否到期
- LocalDate nowDate = LocalDate.now();
- if(endDate.isBefore(nowDate)){
- return ResponseResultUtil.error(ErrorCodeEnum.LICENSE_OVER_DATE.getCode(), ErrorCodeEnum.LICENSE_OVER_DATE.getMessage(),userLogin);
- }
- }
- if(licenseMap.get("web_max_num") != null){
- company.setWebMaxNum(Integer.parseInt(licenseMap.get("web_max_num").toString()));
- }
- if(licenseMap.get("wx_max_num") != null){
- company.setWxMaxNum(Integer.parseInt(licenseMap.get("wx_max_num").toString()));
- }
- company.setEndDate(endDate);
- if(licenseMap.get("user_end_date") != null){
- company.setUserEndDate(LocalDate.parse(licenseMap.get("user_end_date").toString()));
- }
- if(licenseMap.get("vip") != null){
- company.setVip(Boolean.parseBoolean(licenseMap.get("vip").toString()));
- }
- company.setGradeCode(licenseMap.get("grade_code").toString());
- }else{
- // 获取最近一次的交易记录
- List<TradeResponse> tradeResponses = tradeMapper.selectTrade(new Trade().setCpId(company.getCpId()));
- if(tradeResponses != null && tradeResponses.size() >0){
- company.setTrade(tradeResponses.get(0));
- }
- }
- JWTGenerator jwtGenerator = new JWTGenerator();
- jwtGenerator.setSalt(username);
- jwtGenerator.setUsername(username);
- jwtGenerator.setUserId(userId);
- jwtGenerator.setUserWxId(userLogin.getUserWxid());
- jwtGenerator.setClientId(clientId);
- jwtGenerator.setCpId(company.getCpId().toString());
- jwtGenerator.setCpCode(company.getCpCode());
- jwtGenerator.setAppCode(userLogin.getAppCode());
- OAuthIssuerImpl oAuthIssuer = new OAuthIssuerImpl(jwtGenerator);
- accessToken = oAuthIssuer.accessToken();
- log.info("服务器生成的accessToken=" + accessToken);
- // 保存token
- authAccessToken.setId(UUID.uuid32());
- authAccessToken.setClientId(clientId);
- authAccessToken.setTokenId(accessToken);
- authAccessToken.setCreateDate(new Date());
- authAccessToken.setUserId(userId);
- authAccessToken.setUserWxId(userLogin.getUserWxid());
- authAccessToken.setCpId(company.getCpId().toString());
- authAccessToken.setCpCode(company.getCpCode());
- authAccessToken.setAppCode(userLogin.getAppCode());
- authAccessToken.setTokenExpiredSeconds(OauthConstants.EXPIRES_IN);
- log.info("---->>>SecurityUtils.getSubject().isAuthenticated() = " + SecurityUtils.getSubject().isAuthenticated());
- // endregion
- // region 加密accessToken
- try {
- accessToken = AESSecurityUtil.encrypt(AESKey, accessToken);
- // 往redis记录缓存
- Map<String, Object> ul = new HashMap<>();
- ul.put("accessToken", accessToken);
- ul.put("opUpdateTime", LocalDateTime.now());
- stringRedisTemplate.opsForValue().set(Constant.RedisConstant.REDIS_USER_LOGIN.getName() + '_' + userId + '_' + userLogin.getAppCode(), JSONObject.toJSONString(ul));
- } catch (Exception e) {
- logger.error("sorry,accessToken({}) encode faild!!", accessToken);
- }
- }
- }
- UserLoginSuccess userLoginSuccess = new UserLoginSuccess()
- .setByUserLogin(userLogin)
- .setAccessToken(accessToken)
- .setCompany(company);
- return ResponseResultUtil.success(userLoginSuccess);
- }
- /**
- * @desc : 生成微信临时二维码
- * @author : 洪旭东
- * @date : 2024-02-20 17:00
- */
- public ResponseResultVO<?> getQrCode(String uuid) {
- //获取access token
- String accessToken = stringRedisTemplate.opsForValue().get(Constant.RedisConstant.REDIS_WECHAT_ACCESS_TOKEN.getName());
- if (accessToken == null) {
- ResponseResultVO<JSONObject> tokenRes = HttpUtils.get(config.getAccessToken() + "appid=" + config.getOffiAccountAppId() + "&secret=" + config.getOffiAccountAppSecret());
- if (tokenRes.getCode() == ResponseCodeEnum.SUCCESS.getCode()) {
- stringRedisTemplate.opsForValue().set(Constant.RedisConstant.REDIS_WECHAT_ACCESS_TOKEN.getName(), tokenRes.getData().getString("access_token"), 5, TimeUnit.MINUTES);
- accessToken = tokenRes.getData().getString("access_token");
- } else {
- return tokenRes;
- }
- }
- //生成临时二维码
- String ticket;
- JSONObject json = new JSONObject();
- //有效期30天,最大可设置30天
- json.put("expire_seconds", 2592000);
- json.put("action_name", "QR_STR_SCENE");
- JSONObject scene = new JSONObject();
- scene.put("scene_str", "dkic-scan-login-" + uuid);
- JSONObject actionInfo = new JSONObject();
- actionInfo.put("scene", scene);
- json.put("action_info", actionInfo);
- ResponseResultVO<JSONObject> ticketRes = HttpUtils.post(config.getQrcodeCreate() + accessToken, json);
- if (ticketRes.getCode() == ResponseCodeEnum.SUCCESS.getCode()) {
- ticket = ticketRes.getData().getString("ticket");
- } else {
- return ticketRes;
- }
- stringRedisTemplate.opsForValue().set(Constant.RedisConstant.REDIS_LOGIN_UUID.getName() + uuid, "", 5, TimeUnit.MINUTES);
- return ResponseResultUtil.success(config.getShowQrCode() + ticket);
- }
- /**
- * @desc : 生成微信小程序二维码
- * @author : 姜永辉
- * @date : 2024-02-20 17:00
- */
- public ResponseResultVO<?> getWxQrCode(Map<String, Object> map) {
- log.info("getWxQrCode=", map);
- //获取access token
- String accessToken = stringRedisTemplate.opsForValue().get(Constant.RedisConstant.REDIS_WECHAT_QRCODE_ACCESS_TOKEN.getName());
- if (accessToken == null) {
- ResponseResultVO<JSONObject> tokenRes = HttpUtils.get(config.getAccessToken()
- + "appid=" + config.getAppId()
- + "&secret=" + config.getAppSecret());
- if (tokenRes.getCode() == ResponseCodeEnum.SUCCESS.getCode()) {
- stringRedisTemplate.opsForValue().set(Constant.RedisConstant.REDIS_WECHAT_QRCODE_ACCESS_TOKEN.getName(),
- tokenRes.getData().getString("access_token"), 5, TimeUnit.MINUTES);
- accessToken = tokenRes.getData().getString("access_token");
- } else {
- return tokenRes;
- }
- }
- //二维码参数
- Map<String, Object> param = new HashMap<>();
- param.put("page", "pages/welcome/welcome");
- param.put("scene", map.get("openid").toString());
- param.put("check_path", false);
- log.info("二维码参数=123: {}", param);
- //生成二维码接口地址
- String url = config.getUnlimitedQRCode() + accessToken;
- //文件名称
- String fileName = java.util.UUID.randomUUID().toString() + ".png";
- //文件绝对路径 - 写
- String absolutelyPath = this.createDirByPath("qr_code") + fileName;
- //调接口写图片
- ResponseResultVO<String> responseResultVO = HttpUtils.postReturnFile(url, param, absolutelyPath);
- if (responseResultVO.getCode() == ResponseCodeEnum.SUCCESS.getCode()) {
- return ResponseResultUtil.success(absolutelyPath.replace(config.getUploadPath(), ""));
- } else {
- return responseResultVO;
- }
- }
- private String createDirByPath(String type) {
- /**
- * @date_time 2020-07-31 09:42
- * @author H_x_d
- * @description 根据类型创建目录文件夹
- * @param [type]
- * @return java.lang.String
- */
- String path = type + "/" + DateUtils.formatNow("yyyy-MM-dd") + "/";
- String base = config.getUploadPath();
- File baseDir = new File(base);
- if (!baseDir.exists()) {
- baseDir.mkdir();
- }
- String[] paths = path.split("/");
- for (int i = 0; i < paths.length; i++) {
- base = base + "/" + paths[i];
- File dir = new File(base);
- if (!dir.exists()) {
- dir.mkdir();
- }
- }
- return base + "/";
- }
- /**
- * @desc : 获取公司的所有者的数量
- * @author : jyh
- * @date : 2024-02-20 17:00
- */
- public ResponseResultVO<?> getOwnerCount(String uuid) {
- Company company = new Company().setOwner(uuid).setFlgValid(true);
- List<Company> companies = companyMapper.selectByCond(company);
- int count = (companies!=null && companies.size() > 0)?companies.size():0;
- return ResponseResultUtil.success(count);
- }
- }
|