WeSqController.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package com.ylx.web.controller.massage;
  2. import cn.hutool.json.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.ylx.common.annotation.Log;
  5. import com.ylx.common.constant.Constants;
  6. import com.ylx.common.core.controller.BaseController;
  7. import com.ylx.common.core.domain.R;
  8. import com.ylx.common.core.domain.model.WxLoginUser;
  9. import com.ylx.common.enums.BusinessType;
  10. import com.ylx.common.utils.MessageUtils;
  11. import com.ylx.common.utils.StringUtils;
  12. import com.ylx.framework.manager.AsyncManager;
  13. import com.ylx.framework.manager.factory.AsyncFactory;
  14. import com.ylx.framework.web.service.WxTokenService;
  15. import com.ylx.massage.domain.CouponReceive;
  16. import com.ylx.massage.domain.TWxUser;
  17. import com.ylx.massage.service.CouponReceiveService;
  18. import com.ylx.massage.service.TWxUserService;
  19. import com.ylx.massage.utils.WeChatUtil;
  20. import io.swagger.annotations.Api;
  21. import lombok.extern.slf4j.Slf4j;
  22. import org.springframework.beans.BeanUtils;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  25. import org.springframework.stereotype.Controller;
  26. import org.springframework.web.bind.annotation.*;
  27. import javax.annotation.Resource;
  28. import java.util.Map;
  29. /**
  30. * @author b16mt
  31. */
  32. @Slf4j
  33. @Controller
  34. @Api(tags = {"微信公众号sq"})
  35. @RequestMapping("/sq")
  36. public class WeSqController extends BaseController {
  37. private final static String ACCESS_TOKEN = "access_token";
  38. private final static String REFRESH_TOKEN = "refresh_token";
  39. private final static String OPEN_ID = "openid";
  40. @Resource
  41. private WeChatUtil weChatUtil;
  42. @Resource
  43. private TWxUserService wxUserService;
  44. @Resource(name = "commonAsyncExecutor")
  45. private ThreadPoolTaskExecutor threadPoolTaskExecutor;
  46. @Autowired
  47. private CouponReceiveService couponReceiveService;
  48. @Resource
  49. private WxTokenService wxTokenService;
  50. /**
  51. * 获取token和userInfo
  52. *
  53. * @param code 微信授权码
  54. * @return 访问令牌
  55. */
  56. @GetMapping("/getAccessToken")
  57. @Log(title = "公众号网页登录", businessType = BusinessType.OTHER)
  58. public R<WxLoginUser> getAccessToken(@RequestParam String code) {
  59. // 发送get请求获取 AccessToken
  60. Map<?, ?> result = weChatUtil.getAccessToken(code);
  61. String accessToken = result.get(ACCESS_TOKEN).toString();
  62. String refreshToken = result.get(REFRESH_TOKEN).toString();
  63. String openid = result.get(OPEN_ID).toString();
  64. // 如果用户是第一次进行微信公众号授权
  65. // 进行这一步时用户应点击了同意授权按钮
  66. String userInfoJsom = weChatUtil.getUserInfo(accessToken, openid);
  67. // 解析JSON数据
  68. JSONObject jsonObject = new JSONObject(userInfoJsom);
  69. log.info("公众号网页登录,{}",jsonObject);
  70. // 将用户信息保存到数据库中
  71. LambdaQueryWrapper<TWxUser> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
  72. objectLambdaQueryWrapper.eq(TWxUser::getcOpenid, openid);
  73. TWxUser user = wxUserService.getOne(objectLambdaQueryWrapper);
  74. if (user == null || StringUtils.isEmpty(user.getcNickName())) {
  75. if(user == null){
  76. user = new TWxUser();
  77. user.setcOpenid(openid);
  78. TWxUser finalUser = user;
  79. //异步 添加新人优惠卷
  80. // threadPoolTaskExecutor.submit(() -> couponReceiveService.submit(new CouponReceive().setOpenid(finalUser.getcOpenid()).setCouponId("1")));
  81. }
  82. user.setcOpenid(openid);
  83. user.setcNickName(jsonObject.get("nickname").toString());
  84. user.setcIcon(jsonObject.get("headimgurl").toString());
  85. user.setcSessionKey(refreshToken);
  86. // user.setcPhone(phoneNumber);
  87. wxUserService.saveOrUpdate(user);
  88. user.setId(user.getId());
  89. }
  90. WxLoginUser wxUser = new WxLoginUser();
  91. BeanUtils.copyProperties(user, wxUser);
  92. // 生成并返回令牌
  93. String token = wxTokenService.createToken(wxUser);
  94. if (token == null || token.isEmpty()) {
  95. return R.fail("生成令牌失败");
  96. }
  97. wxUser.setToken(token);
  98. // 返回用户信息
  99. // 记录登录信息
  100. AsyncManager.me().execute(AsyncFactory.recordLogininfor(wxUser.getCOpenid(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
  101. return R.ok(wxUser);
  102. }
  103. }