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 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 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 loginWechat(Map map) { ResponseResultVO 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 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 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 collectQuery = new HashMap<>(); // collectQuery.put("cpId", userLogin.getCurrentCp()); // collectQuery.put("staffCode", "东科智云-体验"); // ResponseResultVO 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 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 joinedCps = new ArrayList<>(); joinedCps.add(userWxLogin.getCurrentCp()); userWxLogin.setCurrentCp(userWxLogin.getCurrentCp()); userWxLogin.setJoinedCps(joinedCps); userMapper.insert(userWxLogin); } else { List 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 joinedCpsNew = new ArrayList<>(); joinedCpsNew.addAll(joinedCps); joinedCpsNew.add(cp); userWxLogin.setJoinedCps(joinedCpsNew); userMapper.updateCpid(userLogin.getUserId(), userLogin.getCurrentCp(), userWxLogin.getJoinedCps()); } } Map 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 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 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 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 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 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 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 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 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 map) { log.info("getWxQrCode=", map); //获取access token String accessToken = stringRedisTemplate.opsForValue().get(Constant.RedisConstant.REDIS_WECHAT_QRCODE_ACCESS_TOKEN.getName()); if (accessToken == null) { ResponseResultVO 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 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 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 companies = companyMapper.selectByCond(company); int count = (companies!=null && companies.size() > 0)?companies.size():0; return ResponseResultUtil.success(count); } }