WeSqController.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package com.ylx.web.controller.massage;
  2. import cn.binarywang.wx.miniapp.api.WxMaService;
  3. import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
  4. import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
  5. import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
  6. import cn.hutool.json.JSONObject;
  7. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  8. import com.ylx.common.annotation.Log;
  9. import com.ylx.common.constant.Constants;
  10. import com.ylx.common.core.controller.BaseController;
  11. import com.ylx.common.core.domain.R;
  12. import com.ylx.common.core.domain.model.WxLoginUser;
  13. import com.ylx.common.enums.BusinessType;
  14. import com.ylx.common.utils.MessageUtils;
  15. import com.ylx.common.utils.StringUtils;
  16. import com.ylx.framework.manager.AsyncManager;
  17. import com.ylx.framework.manager.factory.AsyncFactory;
  18. import com.ylx.framework.web.service.WxTokenService;
  19. import com.ylx.massage.domain.CouponReceive;
  20. import com.ylx.massage.domain.MaTechnician;
  21. import com.ylx.massage.domain.TWxUser;
  22. import com.ylx.massage.service.CouponReceiveService;
  23. import com.ylx.massage.service.IMaTechnicianService;
  24. import com.ylx.massage.service.TWxUserService;
  25. import com.ylx.massage.utils.WeChatUtil;
  26. import io.swagger.annotations.Api;
  27. import lombok.extern.slf4j.Slf4j;
  28. import org.springframework.beans.BeanUtils;
  29. import org.springframework.beans.BeansException;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.data.redis.core.RedisTemplate;
  32. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  33. import org.springframework.stereotype.Controller;
  34. import org.springframework.web.bind.annotation.*;
  35. import javax.annotation.Resource;
  36. import java.util.Map;
  37. import java.util.concurrent.TimeUnit;
  38. /**
  39. * @author b16mt
  40. */
  41. @Slf4j
  42. @Controller
  43. @Api(tags = {"微信公众号sq"})
  44. @RequestMapping("/sq")
  45. public class WeSqController extends BaseController {
  46. private final static String ACCESS_TOKEN = "access_token";
  47. private final static String REFRESH_TOKEN = "refresh_token";
  48. private final static String OPEN_ID = "openid";
  49. @Resource
  50. private WeChatUtil weChatUtil;
  51. @Resource
  52. private TWxUserService wxUserService;
  53. @Resource(name = "commonAsyncExecutor")
  54. private ThreadPoolTaskExecutor threadPoolTaskExecutor;
  55. @Autowired
  56. private CouponReceiveService couponReceiveService;
  57. @Resource
  58. private WxTokenService wxTokenService;
  59. @Autowired
  60. public RedisTemplate redisTemplate;
  61. @Autowired
  62. private IMaTechnicianService maTechnicianService;
  63. @Autowired
  64. private WxMaService wxMaService;
  65. /**
  66. * 通过微信code获取token和userInfo
  67. *
  68. * @param code 微信授权码
  69. * @return R<WxLoginUser> 访问令牌
  70. */
  71. @GetMapping("/getAccessToken")
  72. @ResponseBody
  73. //@Log(title = "公众号网页登录", businessType = BusinessType.OTHER)
  74. public R<WxLoginUser> getAccessToken(@RequestParam String code) {
  75. // 发送get请求获取 AccessToken
  76. try {
  77. Map<?, ?> result = weChatUtil.getAccessToken(code);
  78. log.info("result的值:{}", result);
  79. String accessToken = result.get(ACCESS_TOKEN).toString();
  80. log.info("accessToken的值:{}", accessToken);
  81. String refreshToken = result.get(REFRESH_TOKEN).toString();
  82. String openid = result.get(OPEN_ID).toString();
  83. // 如果用户是第一次进行微信公众号授权
  84. // 进行这一步时用户应点击了同意授权按钮
  85. String userInfoJsom = weChatUtil.getUserInfo(accessToken, openid);
  86. // 解析JSON数据
  87. JSONObject jsonObject = new JSONObject(userInfoJsom);
  88. log.info("公众号网页登录:{}", jsonObject);
  89. // 将用户信息保存到数据库中
  90. LambdaQueryWrapper<TWxUser> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
  91. objectLambdaQueryWrapper.eq(TWxUser::getcOpenid, openid);
  92. TWxUser user = wxUserService.getOne(objectLambdaQueryWrapper);
  93. if (user == null || StringUtils.isEmpty(user.getcNickName())) {
  94. if (user == null) {
  95. user = new TWxUser();
  96. user.setcOpenid(openid);
  97. TWxUser finalUser = user;
  98. //异步 添加新人优惠卷
  99. // threadPoolTaskExecutor.submit(() -> couponReceiveService.submit(new CouponReceive().setOpenid(finalUser.getcOpenid()).setCouponId("1")));
  100. }
  101. user.setcOpenid(openid);
  102. user.setcNickName(jsonObject.get("nickname").toString());
  103. user.setcIcon(jsonObject.get("headimgurl").toString());
  104. user.setcSessionKey(refreshToken);
  105. // user.setcPhone(phoneNumber);
  106. wxUserService.saveOrUpdate(user);
  107. user.setId(user.getId());
  108. }
  109. WxLoginUser wxUser = new WxLoginUser();
  110. BeanUtils.copyProperties(user, wxUser);
  111. // 生成并返回令牌
  112. String token = wxTokenService.createToken(wxUser);
  113. log.info("token的值:{}", token);
  114. if (token == null || token.isEmpty()) {
  115. return R.fail("生成令牌失败");
  116. }
  117. //给我把token的值保存到redis中
  118. redisTemplate.opsForValue().set(wxUser.getCOpenid(), token, 180, TimeUnit.MINUTES);
  119. wxUser.setToken(token);
  120. // 返回用户信息
  121. // 记录登录信息
  122. AsyncManager.me().execute(AsyncFactory.recordLogininfor(wxUser.getCOpenid(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
  123. return R.ok(wxUser);
  124. } catch (Exception e) {
  125. e.printStackTrace();
  126. throw new RuntimeException(e);
  127. }
  128. }
  129. /**
  130. * 通过微信code获取token和userInfo
  131. *
  132. * @param code 微信授权码
  133. * @return R<WxLoginUser> 访问令牌
  134. */
  135. @GetMapping("/getTechnicianToken")
  136. @ResponseBody
  137. //@Log(title = "公众号网页登录", businessType = BusinessType.OTHER)
  138. public R<WxLoginUser> getTechnicianToken(@RequestParam String code) {
  139. // 发送get请求获取 AccessToken
  140. try {
  141. Map<?, ?> result = weChatUtil.getAccessToken(code);
  142. log.info("result的值:{}", result);
  143. String accessToken = result.get(ACCESS_TOKEN).toString();
  144. log.info("accessToken的值:{}", accessToken);
  145. String refreshToken = result.get(REFRESH_TOKEN).toString();
  146. String openid = result.get(OPEN_ID).toString();
  147. //
  148. // // 如果用户是第一次进行微信公众号授权
  149. // // 进行这一步时用户应点击了同意授权按钮
  150. String userInfoJsom = weChatUtil.getUserInfo(accessToken, openid);
  151. // // 解析JSON数据
  152. JSONObject jsonObject = new JSONObject(userInfoJsom);
  153. //log.info("公众号网页登录:{}", jsonObject);
  154. String nickName = jsonObject.get("nickname").toString();
  155. String avatarUrl = jsonObject.get("headimgurl").toString();
  156. String phoneNumber = jsonObject.get("phoneNumber").toString();
  157. // 将用户信息保存到数据库中
  158. LambdaQueryWrapper<MaTechnician> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
  159. objectLambdaQueryWrapper.eq(MaTechnician::getCOpenid, openid);
  160. MaTechnician user = maTechnicianService.getOne(objectLambdaQueryWrapper);
  161. if (user == null || StringUtils.isEmpty(user.getTeNickName())) {
  162. if (user == null) {
  163. user = new MaTechnician();
  164. user.setCOpenid(openid);
  165. user.setTeNickName(nickName);
  166. user.setTeAvatar(avatarUrl);
  167. user.setTePhone(phoneNumber);
  168. user.setOpenService("-1");
  169. maTechnicianService.save(user);
  170. //异步 添加新人优惠卷
  171. // threadPoolTaskExecutor.submit(() -> couponReceiveService.submit(new CouponReceive().setOpenid(finalUser.getcOpenid()).setCouponId("1")));
  172. }
  173. }
  174. WxLoginUser wxUser = new WxLoginUser();
  175. BeanUtils.copyProperties(user, wxUser);
  176. // 生成并返回令牌
  177. String token = wxTokenService.createToken(wxUser);
  178. log.info("token的值:{}", token);
  179. if (token == null || token.isEmpty()) {
  180. return R.fail("生成令牌失败");
  181. }
  182. //给我把token的值保存到redis中
  183. redisTemplate.opsForValue().set(wxUser.getCOpenid(), token, 180, TimeUnit.MINUTES);
  184. wxUser.setToken(token);
  185. // 返回用户信息
  186. // 记录登录信息
  187. AsyncManager.me().execute(AsyncFactory.recordLogininfor(wxUser.getCOpenid(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
  188. return R.ok(wxUser);
  189. } catch (Exception e) {
  190. e.printStackTrace();
  191. throw new RuntimeException(e);
  192. }
  193. }
  194. }