WeChatTokenGranter.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package org.springblade.modules.auth.granter;
  2. import com.alibaba.fastjson.JSONObject;
  3. import lombok.AllArgsConstructor;
  4. import org.springblade.common.cache.CacheNames;
  5. import org.springblade.common.cache.ParamCache;
  6. import org.springblade.common.enums.YesOrNoEnum;
  7. import org.springblade.core.log.exception.ServiceException;
  8. import org.springblade.core.redis.cache.BladeRedis;
  9. import org.springblade.core.tool.utils.Func;
  10. import org.springblade.modules.auth.enums.UserEnum;
  11. import org.springblade.modules.auth.provider.ITokenGranter;
  12. import org.springblade.modules.auth.provider.TokenParameter;
  13. import org.springblade.modules.auth.utils.TokenUtil;
  14. import org.springblade.modules.platform.service.UserAppService;
  15. import org.springblade.modules.system.entity.User;
  16. import org.springblade.modules.system.entity.UserApp;
  17. import org.springblade.modules.system.entity.UserInfo;
  18. import org.springblade.modules.system.entity.UserWeChat;
  19. import org.springblade.modules.system.service.IUserService;
  20. import org.springblade.modules.system.service.IUserWeChatService;
  21. import org.springframework.stereotype.Component;
  22. import javax.annotation.Resource;
  23. import java.math.BigDecimal;
  24. import java.time.Duration;
  25. import java.util.Objects;
  26. /**
  27. * Author pangqijun
  28. * Date 2022/11/21
  29. * Description 微信TokenGranter
  30. */
  31. @Component
  32. @AllArgsConstructor
  33. public class WeChatTokenGranter implements ITokenGranter {
  34. public static final String GRANT_TYPE = "wxAuth";
  35. public static final Integer FAIL_COUNT = 5;
  36. public static final String FAIL_COUNT_VALUE = "account.failCount";
  37. private final IUserService userService;
  38. private final IUserWeChatService userWeChatService;
  39. private final BladeRedis bladeRedis;
  40. @Resource
  41. private UserAppService userAppService;
  42. @Override
  43. public UserInfo grant(TokenParameter tokenParameter) {
  44. String tenantId = tokenParameter.getArgs().getStr("tenantId");
  45. String getPhoneNumberCode = tokenParameter.getArgs().getStr("getPhoneNumberCode");
  46. String code = tokenParameter.getArgs().getStr("code");
  47. // 获取用户手机号
  48. String phoneNumber = null;
  49. if (Objects.nonNull(getPhoneNumberCode)){
  50. phoneNumber = userWeChatService.getPhoneNumber(getPhoneNumberCode);
  51. }
  52. // 获取openId
  53. JSONObject jsonObject = userWeChatService.getopenId(code);
  54. String openId = jsonObject.getString("openid");
  55. String unionId = jsonObject.getString("unionid");
  56. User user = new User();
  57. UserWeChat userWeChat = userWeChatService.lambdaQuery().eq(UserWeChat::getOpenId, openId).one();
  58. if (userWeChat == null){
  59. if (Objects.isNull(getPhoneNumberCode)){
  60. throw new ServiceException("该用户没有注册!");
  61. }
  62. // User byAccount = userService.getByAccount(phoneNumber);
  63. User byAccount = userService.getByAccountAndType(phoneNumber,UserEnum.APP.getCategory());
  64. if (Objects.nonNull(byAccount)){
  65. throw new ServiceException("您提供的手机号已注册,请更换手机号!");
  66. }
  67. //注册用户
  68. user.setName("微信用户");
  69. user.setAccount(phoneNumber);
  70. user.setPhone(phoneNumber);
  71. user.setRealName("用户" + phoneNumber.substring(7));
  72. user.setSex(1);
  73. user.setUserType(UserEnum.APP.getCategory());//app
  74. userService.save(user);
  75. UserApp userApp = new UserApp();
  76. userApp.setUserId(user.getId());
  77. userApp.setState(YesOrNoEnum.YES.getValue());
  78. userApp.setNowMoney(new BigDecimal(0));
  79. userApp.setLivingHall(YesOrNoEnum.NO.getValue());
  80. userApp.setIsStore(YesOrNoEnum.NO.getValue());
  81. userAppService.save(userApp);
  82. userWeChat = new UserWeChat();
  83. userWeChat.setOpenId(openId);
  84. userWeChat.setUnionId(unionId);
  85. userWeChat.setUserId(user.getId());
  86. }
  87. user = userService.getById(userWeChat.getUserId());
  88. userWeChat.setSessionKey(jsonObject.getString("session_key"));
  89. userWeChatService.saveOrUpdate(userWeChat);
  90. UserInfo userInfo = userService.userInfo(user.getId(), UserEnum.APP);
  91. userInfo.setOpenId(openId);
  92. return userInfo;
  93. }
  94. }