TWechatController.java 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package com.szwl.controller;
  2. import cn.com.crbank.ommo.exception.MyException;
  3. import com.szwl.model.bo.R;
  4. import com.szwl.model.entity.TWechat;
  5. import com.szwl.model.param.WxBindParam;
  6. import com.szwl.model.utils.HttpClientUtils;
  7. import com.szwl.service.TAdminService;
  8. import com.szwl.service.TWechatService;
  9. import io.swagger.annotations.Api;
  10. import io.swagger.annotations.ApiOperation;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.apache.commons.lang.StringUtils;
  13. import org.json.JSONObject;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.beans.factory.annotation.Value;
  16. import org.springframework.web.bind.annotation.*;
  17. import javax.servlet.http.HttpServletRequest;
  18. import javax.servlet.http.HttpServletResponse;
  19. import java.io.IOException;
  20. import java.io.UnsupportedEncodingException;
  21. import java.net.URLEncoder;
  22. import java.util.*;
  23. /**
  24. * <p>
  25. * 前端控制器
  26. * </p>
  27. *
  28. * @author wuhs
  29. * @since 2023-05-19
  30. */
  31. @Slf4j
  32. @Api(value = "/WeChatController", tags = {"微信绑定接口"})
  33. @RestController
  34. @RequestMapping("/tWechat")
  35. public class TWechatController {
  36. @Autowired
  37. private TAdminService tAdminService;
  38. @Autowired
  39. private TWechatService tWechatService;
  40. // 从 yml 文件中获取
  41. @Value("${oauth.wx.appid}")
  42. private String appid;
  43. @Value("${oauth.wx.appsecret}")
  44. private String appsecret;
  45. @Value("${oauth.callback.http}")
  46. private String http;
  47. @ApiOperation(value = "绑定微信")
  48. @GetMapping("/bindWechat")
  49. public R bindWechat(@RequestParam Long adminId) {
  50. if (adminId == null) {
  51. throw new MyException("参数为空");
  52. }
  53. String path = http + "/SZWL-SERVER/tWechat/callback";
  54. // String path = http + "/tWechat/callback";
  55. try {
  56. // redirectUrl 用于处理微信授权回调请求的页面
  57. String redirectUrl = URLEncoder.encode(path, "UTF-8");
  58. // 第一步:用户同意授权,获取code
  59. String url = "http://szwlh.sunzee.com.cn/openWeixin/connect/oauth2/authorize?"
  60. // String url = "http://szwltest.sunzee.com.cn/openWeixin/connect/oauth2/authorize?"
  61. // String url = "https://open.weixin.qq.com/connect/oauth2/authorize?"
  62. + "appid=" + appid
  63. + "&redirect_uri=" + redirectUrl
  64. + "&response_type=code"
  65. + "&scope=snsapi_userinfo"
  66. + "&state=" + adminId
  67. + "#wechat_redirect";
  68. return R.ok(url);
  69. } catch (UnsupportedEncodingException e) {
  70. throw new RuntimeException(e);
  71. }
  72. }
  73. @ApiOperation(value = "绑定微信回调")
  74. @GetMapping("/callback")
  75. public R oauthCallback(HttpServletRequest request, HttpServletResponse response) throws IOException {
  76. // 获取code
  77. String code = request.getParameter("code");
  78. String adminId = request.getParameter("state");
  79. // 第二步:通过 code 换取网页授权 access_token 和 openid
  80. String openUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
  81. "appid=" + appid +
  82. "&secret=" + appsecret +
  83. "&code=" + code +
  84. "&grant_type=authorization_code";
  85. JSONObject jsonObject = HttpClientUtils.get(openUrl);
  86. String openid = jsonObject.getString("openid");
  87. String accessToken = jsonObject.getString("access_token");
  88. // 第三步:刷新access_token(如果需要)
  89. // 第四步:拉取用户信息(需scope为 snsapi_userinfo)
  90. String userUrl = "https://api.weixin.qq.com/sns/userinfo?" +
  91. "access_token=" + accessToken +
  92. "&openid=" + openid +
  93. "&lang=zh_CN";
  94. JSONObject userInfo = HttpClientUtils.get(userUrl);
  95. String nickname = userInfo.getString("nickname");
  96. String headimgurl = userInfo.getString("headimgurl");
  97. if (StringUtils.isNotEmpty(openid)) {
  98. TWechat list0 = tWechatService
  99. .lambdaQuery()
  100. .eq(TWechat::getOpenId, openid)
  101. .one();
  102. if (Objects.isNull(list0)) {
  103. if (StringUtils.isNotEmpty(adminId)) {
  104. TWechat wechat = tWechatService
  105. .lambdaQuery()
  106. .eq(TWechat::getAdminId, adminId)
  107. .one();
  108. if (Objects.isNull(wechat)) {
  109. // 当前 adminId 首次绑定微信
  110. TWechat tWechat = new TWechat();
  111. tWechat.setOpenId(openid);
  112. tWechat.setAdminId(adminId);
  113. tWechat.setNickName(nickname);
  114. tWechat.setAvatarUrl(headimgurl);
  115. tWechat.setCreateDate(new Date());
  116. tWechatService.save(tWechat);
  117. } else {
  118. // 更新绑定在当前 adminId 上的微信号
  119. wechat.setOpenId(openid);
  120. wechat.setAdminId(adminId);
  121. wechat.setNickName(nickname);
  122. wechat.setAvatarUrl(headimgurl);
  123. wechat.setModifyDate(new Date());
  124. tWechatService.updateById(wechat);
  125. }
  126. } else {
  127. throw new MyException("用户不存在!");
  128. }
  129. } else {
  130. String userId = list0.getAdminId();
  131. if (Objects.equals(userId, adminId)) {
  132. TWechat one = tWechatService
  133. .lambdaQuery()
  134. .eq(TWechat::getAdminId, userId)
  135. .one();
  136. one.setOpenId(openid);
  137. one.setAdminId(adminId);
  138. one.setNickName(nickname);
  139. one.setAvatarUrl(headimgurl);
  140. one.setModifyDate(new Date());
  141. tWechatService.updateById(one);
  142. } else {
  143. return R.fail("当前微信号已绑定<" + userId + ">账户");
  144. }
  145. }
  146. } else {
  147. // 获取微信授权失败
  148. return R.fail("微信授权失败,没有openid");
  149. }
  150. String redirectUrl = http + "/shenze/#/user";
  151. response.sendRedirect(redirectUrl);
  152. return R.ok(userInfo);
  153. }
  154. @ApiOperation(value = "获取用户头像")
  155. @GetMapping("/getAvatar")
  156. public R getAvatar(@RequestParam("adminId") Long adminId) {
  157. String avatarUrl = "";
  158. if (adminId != null) {
  159. TWechat wechat = tWechatService.lambdaQuery()
  160. .eq(TWechat::getAdminId, adminId)
  161. .one();
  162. if (wechat != null) {
  163. avatarUrl = wechat.getAvatarUrl();
  164. }
  165. }
  166. return R.ok(avatarUrl);
  167. }
  168. @ApiOperation(value = "绑定微信回调2")
  169. @PostMapping("/auth")
  170. public Map<String, Object> auth(@RequestBody WxBindParam wxBindParam) {
  171. String adminId = wxBindParam.getState();
  172. String code = wxBindParam.getCode();
  173. Map<String, Object> result = new HashMap<>();
  174. try {
  175. // 第二步:通过 code 换取网页授权 access_token 和 openid
  176. String openUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
  177. "appid=" + appid +
  178. "&secret=" + appsecret +
  179. "&code=" + code +
  180. "&grant_type=authorization_code";
  181. System.out.println(openUrl);
  182. JSONObject jsonObject = HttpClientUtils.get(openUrl);
  183. String openid = jsonObject.getString("openid");
  184. String accessToken = jsonObject.getString("access_token");
  185. // 第三步:刷新access_token(如果需要)
  186. // 第四步:拉取用户信息(需scope为 snsapi_userinfo)
  187. String userUrl = "https://api.weixin.qq.com/sns/userinfo?" +
  188. "access_token=" + accessToken +
  189. "&openid=" + openid +
  190. "&lang=zh_CN";
  191. JSONObject userInfo = HttpClientUtils.get(userUrl);
  192. String nickname = userInfo.getString("nickname");
  193. String headimgurl = userInfo.getString("headimgurl");
  194. if (StringUtils.isNotEmpty(openid)) {
  195. if (StringUtils.isNotEmpty(adminId)) {
  196. TWechat wechat = tWechatService
  197. .lambdaQuery()
  198. .eq(TWechat::getAdminId, adminId)
  199. .one();
  200. if (Objects.isNull(wechat)) {
  201. // 当前 adminId 首次绑定微信
  202. TWechat tWechat = new TWechat();
  203. tWechat.setOpenId(openid);
  204. tWechat.setAdminId(adminId);
  205. tWechat.setNickName(nickname);
  206. tWechat.setAvatarUrl(headimgurl);
  207. tWechat.setCreateDate(new Date());
  208. tWechatService.save(tWechat);
  209. } else {
  210. // 更新绑定在当前 adminId 上的微信号
  211. wechat.setOpenId(openid);
  212. wechat.setAdminId(adminId);
  213. wechat.setNickName(nickname);
  214. wechat.setAvatarUrl(headimgurl);
  215. wechat.setModifyDate(new Date());
  216. tWechatService.updateById(wechat);
  217. }
  218. } else {
  219. throw new MyException("用户不存在!");
  220. }
  221. } else {
  222. // 获取微信授权失败
  223. result.put("message", "微信授权失败,没有openid");
  224. }
  225. result.put("success", true);
  226. } catch (Exception e) {
  227. result.put("success", false);
  228. result.put("message", e.getMessage());
  229. }
  230. return result;
  231. }
  232. }