AuthAccessTokenServiceImpl.java 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  1. package com.dk.oauth.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.dk.common.exception.BaseBusinessException;
  8. import com.dk.common.infrastructure.constant.Constant;
  9. import com.dk.common.infrastructure.constant.OauthConstants;
  10. import com.dk.common.infrastructure.enums.ErrorCodeEnum;
  11. import com.dk.common.model.response.mst.StaffResponse;
  12. import com.dk.common.response.ResponseCodeEnum;
  13. import com.dk.common.response.ResponseResultUtil;
  14. import com.dk.common.response.ResponseResultVO;
  15. import com.dk.common.util.AESUtil;
  16. import com.dk.common.util.DateUtils;
  17. import com.dk.common.util.HttpUtils;
  18. import com.dk.oauth.config.WxConfig;
  19. import com.dk.oauth.dto.AuthAccessTokenDto;
  20. import com.dk.oauth.entity.*;
  21. import com.dk.oauth.feign.service.StaffFeign;
  22. import com.dk.oauth.mapper.AuthAccessTokenMapper;
  23. import com.dk.oauth.mapper.CompanyMapper;
  24. import com.dk.oauth.mapper.TradeMapper;
  25. import com.dk.oauth.mapper.UserMapper;
  26. import com.dk.oauth.service.IAuthAccessTokenService;
  27. import com.dk.oauth.shiro.jwt.JWTGenerator;
  28. import com.dk.oauth.util.AESSecurityUtil;
  29. import com.dk.oauth.util.UUID;
  30. import lombok.extern.slf4j.Slf4j;
  31. import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl;
  32. import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
  33. import org.apache.shiro.SecurityUtils;
  34. import org.slf4j.Logger;
  35. import org.slf4j.LoggerFactory;
  36. import org.springframework.beans.factory.annotation.Autowired;
  37. import org.springframework.beans.factory.annotation.Value;
  38. import org.springframework.data.redis.core.StringRedisTemplate;
  39. import org.springframework.stereotype.Service;
  40. import org.springframework.transaction.annotation.Transactional;
  41. import javax.annotation.Resource;
  42. import javax.servlet.http.HttpServletRequest;
  43. import javax.servlet.http.HttpServletResponse;
  44. import java.io.File;
  45. import java.time.LocalDate;
  46. import java.time.LocalDateTime;
  47. import java.util.*;
  48. import java.util.concurrent.TimeUnit;
  49. import java.util.stream.Collectors;
  50. /**
  51. * (AuthAccessToken)表服务实现类
  52. *
  53. * @author dapeng
  54. * @since 2022-07-01 09:41:05
  55. */
  56. @Slf4j
  57. @Service("authAccessTokenService")
  58. public class AuthAccessTokenServiceImpl extends ServiceImpl<AuthAccessTokenMapper, AuthAccessToken> implements IAuthAccessTokenService {
  59. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  60. @Resource
  61. private AuthAccessTokenMapper authAccessTokenMapper;
  62. @Resource
  63. private UserMapper userMapper;
  64. @Resource
  65. private CompanyMapper companyMapper;
  66. @Value("${aes-key}")
  67. private String AESKey;
  68. @Resource
  69. private StringRedisTemplate stringRedisTemplate;
  70. @Autowired
  71. private WxConfig config;
  72. @Autowired
  73. private TradeMapper tradeMapper;
  74. @Resource
  75. private StaffFeign staffFeign;
  76. /**
  77. * 分页查询
  78. *
  79. * @param
  80. * @return
  81. */
  82. @Override
  83. public ResponseResultVO pageQuery(AuthAccessTokenDto authAccessTokenDto) {
  84. if (null == authAccessTokenDto.getPage()) {
  85. authAccessTokenDto.setPage(new Page(0, 10));
  86. }
  87. IPage<AuthAccessTokenDto> authAccessTokenDtos = authAccessTokenMapper.pageQuery(authAccessTokenDto.getPage(), authAccessTokenDto);
  88. return ResponseResultUtil.success(authAccessTokenDtos);
  89. }
  90. /**
  91. * @desc : 查询用户最新token
  92. * @author : 洪旭东
  93. * @date : 2022-08-02 17:30
  94. */
  95. public String getCurrentToken(Long userId) {
  96. return authAccessTokenMapper.getCurrentToken(userId);
  97. }
  98. /**
  99. * @desc : 登录凭证校验
  100. * @author : 姜永辉
  101. * @date : 2022/5/12 9:33
  102. */
  103. public ResponseResultVO<JSONObject> loginWechat(Map<String, Object> map) {
  104. ResponseResultVO<JSONObject> res = HttpUtils.get(config.getCode2Session()
  105. + "appid=" + config.getAppId()
  106. + "&secret=" + config.getAppSecret()
  107. + "&js_code=" + map.get("code")
  108. + "&grant_type=authorization_code");
  109. if (res.getData() != null && res.getData().get("errcode") != null) {
  110. return ResponseResultUtil.error(ResponseCodeEnum.OPERATE_FAIL.getCode(),
  111. res.getData().get("errmsg") == null ? res.getData().getString("errcode")
  112. : "微信服务器异常:" + res.getData().getString("errmsg"));
  113. }
  114. return res;
  115. }
  116. /**
  117. * @desc : 获取token
  118. * @author : 洪旭东
  119. * @date : 2024-02-20 14:04
  120. */
  121. public ResponseResultVO token(HttpServletRequest request) {
  122. UserLogin userLogin = userMapper.getByPhone(request.getParameter("phone"));
  123. if (userLogin == null || (!userLogin.getUserPwd().equals(request.getParameter("password")))) {
  124. //无用户 或 密码错误
  125. return ResponseResultUtil.error(ErrorCodeEnum.USER_PASSWORD_ERROR.getCode(), ErrorCodeEnum.USER_PASSWORD_ERROR.getMessage());
  126. }
  127. userLogin.checkUserLogin();
  128. try {
  129. // 设置应用代码
  130. userLogin.setAppCode(Constant.AppCode.WEB.getCode());
  131. return createToken(userLogin,true);
  132. } catch (Exception e) {
  133. log.error("获取accessToken发生异常=", e);
  134. return ResponseResultUtil.error(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
  135. }
  136. }
  137. /**
  138. * @desc : 小程序通过微信openid登录
  139. * @author : 洪旭东
  140. * @date : 2024-02-20 14:04
  141. */
  142. @Transactional(rollbackFor = Exception.class)
  143. public ResponseResultVO wxToken(UserWxLogin userWxLogin) {
  144. // todo
  145. // userWxLogin.setUserWxid("1");
  146. UserLogin userLogin = userMapper.getByWxid(userWxLogin.getUserWxid());
  147. if (userLogin == null) {
  148. //无用户
  149. return ResponseResultUtil.error(ErrorCodeEnum.USER_NOT_EXIST.getCode(), ErrorCodeEnum.USER_NOT_EXIST.getMessage());
  150. }
  151. userLogin.checkUserLogin();
  152. try {
  153. // 设置应用代码
  154. userLogin.setAppCode(Constant.AppCode.WEIXIN.getCode());
  155. return createToken(userLogin,true);
  156. } catch (Exception e) {
  157. log.error("获取accessToken发生异常=", e);
  158. return ResponseResultUtil.error(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
  159. }
  160. }
  161. /**
  162. * @desc : 小程序通过微信openid登录--体验的账号
  163. * @author : 姜永辉
  164. * @date : 2024-02-20 14:04
  165. */
  166. @Transactional(rollbackFor = Exception.class)
  167. public ResponseResultVO wxFeignExperienceToken(UserWxLogin userWxLogin) {
  168. UserLogin userLogin = userMapper.getByWxid(userWxLogin.getUserWxid());
  169. if (userLogin == null) {
  170. //无用户
  171. return ResponseResultUtil.error(ErrorCodeEnum.USER_NOT_EXIST.getCode(), ErrorCodeEnum.USER_NOT_EXIST.getMessage());
  172. }
  173. try {
  174. // 设置应用代码
  175. userLogin.setAppCode(Constant.AppCode.WEIXIN.getCode());
  176. return createFeignExperienceToken(userLogin);
  177. } catch (Exception e) {
  178. log.error("获取accessToken发生异常=", e);
  179. return ResponseResultUtil.error(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
  180. }
  181. }
  182. /**
  183. * @desc : 登录验证成功,生成token
  184. * @author : 姜永辉
  185. * @date : 2024-02-20 10:31
  186. */
  187. private ResponseResultVO<?> createFeignExperienceToken(UserLogin userLogin) throws OAuthSystemException {
  188. String clientId = "dkic";
  189. AuthAccessToken authAccessToken = new AuthAccessToken();
  190. String username = "";
  191. String userId = "";
  192. username = userLogin.getUserName();
  193. userId = String.valueOf(userLogin.getUserId());
  194. //当前公司
  195. CompanyResponse company = null;
  196. String accessToken = "";
  197. if (userLogin.getCurrentCp() != null) {
  198. company = companyMapper.getByCpId(userLogin.getCurrentCp());
  199. if (company != null) {
  200. // 解析license信息
  201. String licenseStr = AESUtil.desEncrypt(company.getLicense());
  202. if(licenseStr != null ){
  203. Map<String,Object> licenseMap = JSON.parseObject(licenseStr,Map.class);
  204. LocalDate endDate = LocalDate.parse(licenseMap.get("end_date").toString());
  205. // 判断是否到期
  206. LocalDate nowDate = LocalDate.now();
  207. if(endDate.isBefore(nowDate)){
  208. return ResponseResultUtil.error(ErrorCodeEnum.LICENSE_OVER_DATE.getCode(), ErrorCodeEnum.LICENSE_OVER_DATE.getMessage());
  209. }
  210. if(licenseMap.get("web_max_num") != null){
  211. company.setWebMaxNum(Integer.parseInt(licenseMap.get("web_max_num").toString()));
  212. }
  213. if(licenseMap.get("wx_max_num") != null){
  214. company.setWxMaxNum(Integer.parseInt(licenseMap.get("wx_max_num").toString()));
  215. }
  216. company.setEndDate(endDate);
  217. if(licenseMap.get("user_end_date") != null){
  218. company.setUserEndDate(LocalDate.parse(licenseMap.get("user_end_date").toString()));
  219. }
  220. if(licenseMap.get("vip") != null){
  221. company.setVip(Boolean.parseBoolean(licenseMap.get("vip").toString()));
  222. }
  223. company.setGradeCode(licenseMap.get("grade_code").toString());
  224. }else{
  225. // 获取最近一次的交易记录
  226. List<TradeResponse> tradeResponses = tradeMapper.selectTrade(new Trade().setCpId(company.getCpId()));
  227. if(tradeResponses != null && tradeResponses.size() >0){
  228. company.setTrade(tradeResponses.get(0));
  229. }
  230. }
  231. JWTGenerator jwtGenerator = new JWTGenerator();
  232. jwtGenerator.setSalt(username);
  233. jwtGenerator.setUsername(username);
  234. jwtGenerator.setUserId(userId);
  235. jwtGenerator.setUserWxId(userLogin.getUserWxid());
  236. jwtGenerator.setClientId(clientId);
  237. jwtGenerator.setCpId(company.getCpId().toString());
  238. jwtGenerator.setCpCode(company.getCpCode());
  239. OAuthIssuerImpl oAuthIssuer = new OAuthIssuerImpl(jwtGenerator);
  240. accessToken = oAuthIssuer.accessToken();
  241. log.info("服务器生成的accessToken=" + accessToken);
  242. // 保存token
  243. authAccessToken.setId(UUID.uuid32());
  244. authAccessToken.setClientId(clientId);
  245. authAccessToken.setTokenId(accessToken);
  246. authAccessToken.setUserId(userId);
  247. authAccessToken.setUserWxId(userLogin.getUserWxid());
  248. authAccessToken.setCreateDate(new Date());
  249. authAccessToken.setCpId(company.getCpId().toString());
  250. authAccessToken.setCpCode(company.getCpCode());
  251. authAccessToken.setTokenExpiredSeconds(OauthConstants.EXPIRES_IN);
  252. log.info("---->>>SecurityUtils.getSubject().isAuthenticated() = " + SecurityUtils.getSubject().isAuthenticated());
  253. // endregion
  254. // region 加密accessToken
  255. try {
  256. accessToken = AESSecurityUtil.encrypt(AESKey, accessToken);
  257. } catch (Exception e) {
  258. logger.error("sorry,accessToken({}) encode faild!!", accessToken);
  259. }
  260. }
  261. }
  262. // 默认取体验公司的账号
  263. // Map<String, Object> collectQuery = new HashMap<>();
  264. // collectQuery.put("cpId", userLogin.getCurrentCp());
  265. // collectQuery.put("staffCode", "东科智云-体验");
  266. // ResponseResultVO<StaffResponse> feignExperience = staffFeign.getFeignExperience(collectQuery);
  267. // StaffResponse s = new StaffResponse();
  268. // log.info("---->>>getFeignExperience = " + feignExperience.toString());
  269. // //如果没有成功返回,状态设置为待审
  270. // if (feignExperience.getCode() != ResponseCodeEnum.SUCCESS.getCode()) {
  271. // //无用户
  272. // return ResponseResultUtil.error(ErrorCodeEnum.USER_NOT_EXIST.getCode(), ErrorCodeEnum.USER_NOT_EXIST.getMessage());
  273. // } else {
  274. // s = feignExperience.getData();
  275. // }
  276. UserLoginSuccess userLoginSuccess = new UserLoginSuccess()
  277. .setByUserLogin(userLogin)
  278. .setAccessToken(accessToken)
  279. .setCompany(company)
  280. ;
  281. return ResponseResultUtil.success(userLoginSuccess);
  282. }
  283. /**
  284. * @desc : 注册-创建员工的时候保存微信用户信息
  285. * @author : 姜永辉
  286. * @date : 2024-02-20 13:55
  287. */
  288. @Transactional(rollbackFor = Exception.class)
  289. public ResponseResultVO<?> registerFeign(Map<String, Object> map) {
  290. UserWxLogin userWxLogin = new UserWxLogin();
  291. userWxLogin.setCurrentCp(Integer.parseInt(map.get("currentCp") + ""));
  292. userWxLogin.setUserPhone(map.get("userPhone") + "");
  293. userWxLogin.setUserName(map.get("userName") + "");
  294. UserLogin userLogin = userMapper.getByPhone(userWxLogin.getUserPhone());
  295. if (userLogin == null) {
  296. //注册
  297. List<Integer> joinedCps = new ArrayList<>();
  298. joinedCps.add(userWxLogin.getCurrentCp());
  299. userWxLogin.setCurrentCp(userWxLogin.getCurrentCp());
  300. userWxLogin.setJoinedCps(joinedCps);
  301. userMapper.insert(userWxLogin);
  302. } else {
  303. List<Integer> joinedCps = userLogin.getJoinedCps();
  304. userWxLogin.setUserId(userLogin.getUserId());
  305. if (userLogin.getCurrentCp() == null) {
  306. userLogin.setCurrentCp(userWxLogin.getCurrentCp());
  307. }
  308. if (joinedCps == null) {
  309. joinedCps = new ArrayList<>();
  310. joinedCps.add(userWxLogin.getCurrentCp());
  311. userWxLogin.setJoinedCps(joinedCps);
  312. userMapper.updateCpid(userLogin.getUserId(), userLogin.getCurrentCp(), userWxLogin.getJoinedCps());
  313. }
  314. if (joinedCps != null && !joinedCps.contains(userWxLogin.getCurrentCp())) {
  315. Integer cp = userWxLogin.getCurrentCp();
  316. List<Integer> joinedCpsNew = new ArrayList<>();
  317. joinedCpsNew.addAll(joinedCps);
  318. joinedCpsNew.add(cp);
  319. userWxLogin.setJoinedCps(joinedCpsNew);
  320. userMapper.updateCpid(userLogin.getUserId(), userLogin.getCurrentCp(), userWxLogin.getJoinedCps());
  321. }
  322. }
  323. Map<String, Object> mapReturn = new HashMap<>();
  324. mapReturn.put("userId", userWxLogin.getUserId());
  325. mapReturn.put("userName", userWxLogin.getUserName());
  326. mapReturn.put("userPhone", userWxLogin.getUserPhone());
  327. return ResponseResultUtil.success(mapReturn);
  328. }
  329. /**
  330. * @desc :离职时候更新 用户的openid current_cp , "joined_cps" 缩减相应的cpid
  331. * @author : 姜永辉
  332. * @date : 2024-02-20 13:55
  333. */
  334. @Transactional(rollbackFor = Exception.class)
  335. public ResponseResultVO<?> updateClearOpenidFeign(Map<String, Object> map) {
  336. String userId = map.get("userId") + "";
  337. Integer cpId = Integer.parseInt(map.get("cpId") + "");
  338. UserLogin userLogin = userMapper.selectById(userId);
  339. Integer cpIdNew = null;
  340. if (userLogin != null) {
  341. List<Integer> joinedCps = new ArrayList<>();
  342. joinedCps = userLogin.getJoinedCps();
  343. if (joinedCps != null) {
  344. joinedCps = joinedCps.stream() // 将List转换为Stream
  345. .filter(n -> n != cpId) // 过滤掉我们不想要的元素
  346. .collect(Collectors.toList()); // 收集结果到新的List
  347. if (joinedCps != null && joinedCps.size() > 0) {
  348. cpIdNew = joinedCps.get(0);
  349. }
  350. }
  351. userMapper.updateClearOpenidFeign(userId, cpIdNew, joinedCps != null && joinedCps.size() == 0 ? null : joinedCps);
  352. }
  353. return ResponseResultUtil.success();
  354. }
  355. /**
  356. * @desc : 注册
  357. * @author : 洪旭东
  358. * @date : 2024-02-20 13:55
  359. */
  360. @Transactional(rollbackFor = Exception.class)
  361. public ResponseResultVO<?> register(UserWxLogin userWxLogin) {
  362. UserLogin userLogin = userMapper.getByWxid(userWxLogin.getUserWxid());
  363. //通过openid查到用户,但手机号为空
  364. if (userLogin != null && userLogin.getUserPhone() == null) {
  365. //将其他微信用户的相同电话清空
  366. userMapper.cleanPhone(userWxLogin.getUserPhone());
  367. //更新当前手机号
  368. userMapper.updatePhone(userLogin.getUserId(), userWxLogin.getUserPhone());
  369. }
  370. if (userLogin == null) {
  371. //openid没查到,用手机号再查一次
  372. userLogin = userMapper.getByPhone(userWxLogin.getUserPhone());
  373. } else if (userLogin.getUserWxid() == null) {
  374. //通过手机号查到了用户,但是openid是空,更新上当前的openid
  375. userMapper.updateWxid(userLogin.getUserId(), userWxLogin.getUserWxid());
  376. }
  377. //用户无法通过openid或手机号查到 或 通过手机号查到了,但openid不同
  378. if (userLogin == null) {
  379. //将其他微信用户的相同电话清空
  380. userMapper.cleanPhone(userWxLogin.getUserPhone());
  381. //注册
  382. userMapper.insert(userWxLogin);
  383. userLogin = userMapper.getByWxid(userWxLogin.getUserWxid());
  384. }
  385. if (!userWxLogin.getUserWxid().equals(userLogin.getUserWxid())) {
  386. //通过手机号查到了用户,但是openid是空,更新上当前的openid
  387. userMapper.updateWxid(userLogin.getUserId(), userWxLogin.getUserWxid());
  388. userLogin.setUserWxid(userWxLogin.getUserWxid());
  389. }
  390. userLogin.checkUserLogin();
  391. try {
  392. return createToken(userLogin,false);
  393. } catch (Exception e) {
  394. log.error("获取accessToken发生异常=", e);
  395. return ResponseResultUtil.error(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
  396. }
  397. }
  398. /**
  399. * @desc : 退出登录
  400. * @author : 洪旭东
  401. * @date : 2024-02-20 13:55
  402. */
  403. @Transactional(rollbackFor = Exception.class)
  404. public ResponseResultVO logout(UserWxLogin userWxLogin) {
  405. // userMapper.updateWxid(userWxLogin.getUserId(), null);
  406. // 更新cpid为空 240701
  407. userMapper.updateCpid(userWxLogin.getUserId(), null, null);
  408. return ResponseResultUtil.success();
  409. }
  410. /**
  411. * @desc : 验证当前扫码登录是否匹配到openid
  412. * @author : 洪旭东
  413. * @date : 2024-02-20 14:04
  414. */
  415. public ResponseResultVO<?> checkLoginOpenId(String uuid) {
  416. String openId = stringRedisTemplate.opsForValue().get(Constant.RedisConstant.REDIS_LOGIN_UUID.getName() + uuid);
  417. if (openId != null && !"".equals(openId)) {
  418. UserLogin userLogin = userMapper.getByWxid(openId);
  419. if (userLogin == null) {
  420. stringRedisTemplate.opsForValue().set(Constant.RedisConstant.REDIS_LOGIN_UUID.getName() + uuid, "", 5, TimeUnit.MINUTES);
  421. //无用户
  422. return ResponseResultUtil.error(ErrorCodeEnum.USER_NOT_EXIST.getCode(), ErrorCodeEnum.USER_NOT_EXIST.getMessage());
  423. }
  424. userLogin.checkUserLogin();
  425. try {
  426. return createToken(userLogin,false);
  427. } catch (OAuthSystemException e) {
  428. e.printStackTrace();
  429. log.error("获取accessToken发生异常=", e);
  430. return ResponseResultUtil.error(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
  431. }
  432. } else {
  433. return ResponseResultUtil.error(ResponseCodeEnum.NO_LOGIN);
  434. }
  435. }
  436. /**
  437. * @desc : 切换企业
  438. * @author : 周兴
  439. * @date : 2024-03-19 14:04
  440. */
  441. public ResponseResultVO<?> changeCp(UserLogin userLogin) throws OAuthSystemException {
  442. // 更新用户的当前企业
  443. if (userLogin.getCurrentCp() != Constant.Experience.profession.getName()
  444. && userLogin.getCurrentCp() != Constant.Experience.Standard.getName()) {
  445. userMapper.updateCpid(userLogin.getUserId(), userLogin.getCurrentCp(), userLogin.getJoinedCps());
  446. }
  447. //当前公司
  448. CompanyResponse company = null;
  449. String accessToken = "";
  450. String clientId = "dkic";
  451. AuthAccessToken authAccessToken = new AuthAccessToken();
  452. String userId = userLogin.getUserId();
  453. String username = userLogin.getUserName();
  454. // 生成token
  455. company = companyMapper.getByCpId(userLogin.getCurrentCp());
  456. if (company != null) {
  457. JWTGenerator jwtGenerator = new JWTGenerator();
  458. jwtGenerator.setSalt(username);
  459. jwtGenerator.setUsername(username);
  460. jwtGenerator.setUserId(userId);
  461. jwtGenerator.setClientId(clientId);
  462. jwtGenerator.setCpId(company.getCpId().toString());
  463. jwtGenerator.setCpCode(company.getCpCode());
  464. jwtGenerator.setAppCode(userLogin.getAppCode());
  465. OAuthIssuerImpl oAuthIssuer = new OAuthIssuerImpl(jwtGenerator);
  466. accessToken = oAuthIssuer.accessToken();
  467. log.info("服务器生成的accessToken=" + accessToken);
  468. // 保存token
  469. authAccessToken.setId(UUID.uuid32());
  470. authAccessToken.setClientId(clientId);
  471. authAccessToken.setTokenId(accessToken);
  472. authAccessToken.setCreateDate(new Date());
  473. authAccessToken.setUserId(userId);
  474. authAccessToken.setCpId(company.getCpId().toString());
  475. authAccessToken.setCpCode(company.getCpCode());
  476. authAccessToken.setAppCode(userLogin.getAppCode());
  477. authAccessToken.setTokenExpiredSeconds(OauthConstants.EXPIRES_IN);
  478. log.info("---->>>SecurityUtils.getSubject().isAuthenticated() = " + SecurityUtils.getSubject().isAuthenticated());
  479. // endregion
  480. // region 加密accessToken
  481. try {
  482. accessToken = AESSecurityUtil.encrypt(AESKey, accessToken);
  483. // 往redis记录缓存
  484. Map<String, Object> ul = new HashMap<>();
  485. ul.put("accessToken", accessToken);
  486. ul.put("opUpdateTime", LocalDateTime.now());
  487. stringRedisTemplate.opsForValue().set(Constant.RedisConstant.REDIS_USER_LOGIN.getName() + '_' + userId + '_' + userLogin.getAppCode(), JSONObject.toJSONString(ul));
  488. } catch (Exception e) {
  489. logger.error("sorry,accessToken({}) encode faild!!", accessToken);
  490. }
  491. }
  492. return ResponseResultUtil.success(accessToken);
  493. }
  494. /**
  495. * @desc : 登录验证成功,生成token
  496. * @author : 洪旭东
  497. * @date : 2024-02-20 10:31
  498. */
  499. private ResponseResultVO<?> createToken(UserLogin userLogin,Boolean checkOverDate) throws OAuthSystemException {
  500. String clientId = "dkic";
  501. AuthAccessToken authAccessToken = new AuthAccessToken();
  502. // region 开始生成Access Token
  503. String username = "";
  504. String userId = "";
  505. username = userLogin.getUserName();
  506. userId = String.valueOf(userLogin.getUserId());
  507. // endregion
  508. //当前公司
  509. CompanyResponse company = null;
  510. String accessToken = "";
  511. if (userLogin.getCurrentCp() != null) {
  512. company = companyMapper.getByCpId(userLogin.getCurrentCp());
  513. if (company != null) {
  514. // 解析license信息
  515. String licenseStr = AESUtil.desEncrypt(company.getLicense());
  516. if(licenseStr != null ){
  517. Map<String,Object> licenseMap = JSON.parseObject(licenseStr,Map.class);
  518. LocalDate endDate = LocalDate.parse(licenseMap.get("end_date").toString());
  519. if(checkOverDate){
  520. // 判断是否到期
  521. LocalDate nowDate = LocalDate.now();
  522. if(endDate.isBefore(nowDate)){
  523. return ResponseResultUtil.error(ErrorCodeEnum.LICENSE_OVER_DATE.getCode(), ErrorCodeEnum.LICENSE_OVER_DATE.getMessage(),userLogin);
  524. }
  525. }
  526. if(licenseMap.get("web_max_num") != null){
  527. company.setWebMaxNum(Integer.parseInt(licenseMap.get("web_max_num").toString()));
  528. }
  529. if(licenseMap.get("wx_max_num") != null){
  530. company.setWxMaxNum(Integer.parseInt(licenseMap.get("wx_max_num").toString()));
  531. }
  532. company.setEndDate(endDate);
  533. if(licenseMap.get("user_end_date") != null){
  534. company.setUserEndDate(LocalDate.parse(licenseMap.get("user_end_date").toString()));
  535. }
  536. if(licenseMap.get("vip") != null){
  537. company.setVip(Boolean.parseBoolean(licenseMap.get("vip").toString()));
  538. }
  539. company.setGradeCode(licenseMap.get("grade_code").toString());
  540. }else{
  541. // 获取最近一次的交易记录
  542. List<TradeResponse> tradeResponses = tradeMapper.selectTrade(new Trade().setCpId(company.getCpId()));
  543. if(tradeResponses != null && tradeResponses.size() >0){
  544. company.setTrade(tradeResponses.get(0));
  545. }
  546. }
  547. JWTGenerator jwtGenerator = new JWTGenerator();
  548. jwtGenerator.setSalt(username);
  549. jwtGenerator.setUsername(username);
  550. jwtGenerator.setUserId(userId);
  551. jwtGenerator.setUserWxId(userLogin.getUserWxid());
  552. jwtGenerator.setClientId(clientId);
  553. jwtGenerator.setCpId(company.getCpId().toString());
  554. jwtGenerator.setCpCode(company.getCpCode());
  555. jwtGenerator.setAppCode(userLogin.getAppCode());
  556. OAuthIssuerImpl oAuthIssuer = new OAuthIssuerImpl(jwtGenerator);
  557. accessToken = oAuthIssuer.accessToken();
  558. log.info("服务器生成的accessToken=" + accessToken);
  559. // 保存token
  560. authAccessToken.setId(UUID.uuid32());
  561. authAccessToken.setClientId(clientId);
  562. authAccessToken.setTokenId(accessToken);
  563. authAccessToken.setCreateDate(new Date());
  564. authAccessToken.setUserId(userId);
  565. authAccessToken.setUserWxId(userLogin.getUserWxid());
  566. authAccessToken.setCpId(company.getCpId().toString());
  567. authAccessToken.setCpCode(company.getCpCode());
  568. authAccessToken.setAppCode(userLogin.getAppCode());
  569. authAccessToken.setTokenExpiredSeconds(OauthConstants.EXPIRES_IN);
  570. log.info("---->>>SecurityUtils.getSubject().isAuthenticated() = " + SecurityUtils.getSubject().isAuthenticated());
  571. // endregion
  572. // region 加密accessToken
  573. try {
  574. accessToken = AESSecurityUtil.encrypt(AESKey, accessToken);
  575. // 往redis记录缓存
  576. Map<String, Object> ul = new HashMap<>();
  577. ul.put("accessToken", accessToken);
  578. ul.put("opUpdateTime", LocalDateTime.now());
  579. stringRedisTemplate.opsForValue().set(Constant.RedisConstant.REDIS_USER_LOGIN.getName() + '_' + userId + '_' + userLogin.getAppCode(), JSONObject.toJSONString(ul));
  580. } catch (Exception e) {
  581. logger.error("sorry,accessToken({}) encode faild!!", accessToken);
  582. }
  583. }
  584. }
  585. UserLoginSuccess userLoginSuccess = new UserLoginSuccess()
  586. .setByUserLogin(userLogin)
  587. .setAccessToken(accessToken)
  588. .setCompany(company);
  589. return ResponseResultUtil.success(userLoginSuccess);
  590. }
  591. /**
  592. * @desc : 生成微信临时二维码
  593. * @author : 洪旭东
  594. * @date : 2024-02-20 17:00
  595. */
  596. public ResponseResultVO<?> getQrCode(String uuid) {
  597. //获取access token
  598. String accessToken = stringRedisTemplate.opsForValue().get(Constant.RedisConstant.REDIS_WECHAT_ACCESS_TOKEN.getName());
  599. if (accessToken == null) {
  600. ResponseResultVO<JSONObject> tokenRes = HttpUtils.get(config.getAccessToken() + "appid=" + config.getOffiAccountAppId() + "&secret=" + config.getOffiAccountAppSecret());
  601. if (tokenRes.getCode() == ResponseCodeEnum.SUCCESS.getCode()) {
  602. stringRedisTemplate.opsForValue().set(Constant.RedisConstant.REDIS_WECHAT_ACCESS_TOKEN.getName(), tokenRes.getData().getString("access_token"), 5, TimeUnit.MINUTES);
  603. accessToken = tokenRes.getData().getString("access_token");
  604. } else {
  605. return tokenRes;
  606. }
  607. }
  608. //生成临时二维码
  609. String ticket;
  610. JSONObject json = new JSONObject();
  611. //有效期30天,最大可设置30天
  612. json.put("expire_seconds", 2592000);
  613. json.put("action_name", "QR_STR_SCENE");
  614. JSONObject scene = new JSONObject();
  615. scene.put("scene_str", "dkic-scan-login-" + uuid);
  616. JSONObject actionInfo = new JSONObject();
  617. actionInfo.put("scene", scene);
  618. json.put("action_info", actionInfo);
  619. ResponseResultVO<JSONObject> ticketRes = HttpUtils.post(config.getQrcodeCreate() + accessToken, json);
  620. if (ticketRes.getCode() == ResponseCodeEnum.SUCCESS.getCode()) {
  621. ticket = ticketRes.getData().getString("ticket");
  622. } else {
  623. return ticketRes;
  624. }
  625. stringRedisTemplate.opsForValue().set(Constant.RedisConstant.REDIS_LOGIN_UUID.getName() + uuid, "", 5, TimeUnit.MINUTES);
  626. return ResponseResultUtil.success(config.getShowQrCode() + ticket);
  627. }
  628. /**
  629. * @desc : 生成微信小程序二维码
  630. * @author : 姜永辉
  631. * @date : 2024-02-20 17:00
  632. */
  633. public ResponseResultVO<?> getWxQrCode(Map<String, Object> map) {
  634. log.info("getWxQrCode=", map);
  635. //获取access token
  636. String accessToken = stringRedisTemplate.opsForValue().get(Constant.RedisConstant.REDIS_WECHAT_QRCODE_ACCESS_TOKEN.getName());
  637. if (accessToken == null) {
  638. ResponseResultVO<JSONObject> tokenRes = HttpUtils.get(config.getAccessToken()
  639. + "appid=" + config.getAppId()
  640. + "&secret=" + config.getAppSecret());
  641. if (tokenRes.getCode() == ResponseCodeEnum.SUCCESS.getCode()) {
  642. stringRedisTemplate.opsForValue().set(Constant.RedisConstant.REDIS_WECHAT_QRCODE_ACCESS_TOKEN.getName(),
  643. tokenRes.getData().getString("access_token"), 5, TimeUnit.MINUTES);
  644. accessToken = tokenRes.getData().getString("access_token");
  645. } else {
  646. return tokenRes;
  647. }
  648. }
  649. //二维码参数
  650. Map<String, Object> param = new HashMap<>();
  651. param.put("page", "pages/welcome/welcome");
  652. param.put("scene", map.get("openid").toString());
  653. param.put("check_path", false);
  654. log.info("二维码参数=123: {}", param);
  655. //生成二维码接口地址
  656. String url = config.getUnlimitedQRCode() + accessToken;
  657. //文件名称
  658. String fileName = java.util.UUID.randomUUID().toString() + ".png";
  659. //文件绝对路径 - 写
  660. String absolutelyPath = this.createDirByPath("qr_code") + fileName;
  661. //调接口写图片
  662. ResponseResultVO<String> responseResultVO = HttpUtils.postReturnFile(url, param, absolutelyPath);
  663. if (responseResultVO.getCode() == ResponseCodeEnum.SUCCESS.getCode()) {
  664. return ResponseResultUtil.success(absolutelyPath.replace(config.getUploadPath(), ""));
  665. } else {
  666. return responseResultVO;
  667. }
  668. }
  669. private String createDirByPath(String type) {
  670. /**
  671. * @date_time 2020-07-31 09:42
  672. * @author H_x_d
  673. * @description 根据类型创建目录文件夹
  674. * @param [type]
  675. * @return java.lang.String
  676. */
  677. String path = type + "/" + DateUtils.formatNow("yyyy-MM-dd") + "/";
  678. String base = config.getUploadPath();
  679. File baseDir = new File(base);
  680. if (!baseDir.exists()) {
  681. baseDir.mkdir();
  682. }
  683. String[] paths = path.split("/");
  684. for (int i = 0; i < paths.length; i++) {
  685. base = base + "/" + paths[i];
  686. File dir = new File(base);
  687. if (!dir.exists()) {
  688. dir.mkdir();
  689. }
  690. }
  691. return base + "/";
  692. }
  693. /**
  694. * @desc : 获取公司的所有者的数量
  695. * @author : jyh
  696. * @date : 2024-02-20 17:00
  697. */
  698. public ResponseResultVO<?> getOwnerCount(String uuid) {
  699. Company company = new Company().setOwner(uuid).setFlgValid(true);
  700. List<Company> companies = companyMapper.selectByCond(company);
  701. int count = (companies!=null && companies.size() > 0)?companies.size():0;
  702. return ResponseResultUtil.success(count);
  703. }
  704. }