代码位置当然是在service_user模块

步骤:

1. 配置文件

这里配置文件的地址是固定的,另外wx.open.redirect_url这个地址变过一次,下面的是正确地址。还有就是要求service_user端口号为8160。
详情看

  1. wx.open.app_id=wxed9954c01bb89b47
  2. wx.open.app_secret=a7482517235173ddb4083788de60b90e
  3. wx.open.redirect_url=http://localhost:8160/api/ucenter/wx/callback
  4. yygh.baseUrl=http://localhost:3000

2. 配置类

这个配置类写在了util包中,说是配置类,也不是,说是工具类,也不完全是!

  1. @Component
  2. public class ConstantPropertiesUtil implements InitializingBean {
  3. @Value("${wx.open.app_id}")
  4. private String appId;
  5. @Value("${wx.open.app_secret}")
  6. private String appSecret;
  7. @Value("${wx.open.redirect_url}")
  8. private String redirectUrl;
  9. @Value("${yygh.baseUrl}")
  10. private String yyghBaseUrl;
  11. public static String WX_OPEN_APP_ID;
  12. public static String WX_OPEN_APP_SECRET;
  13. public static String WX_OPEN_REDIRECT_URL;
  14. public static String YYGH_BASE_URL;
  15. @Override
  16. public void afterPropertiesSet() throws Exception {
  17. WX_OPEN_APP_ID = appId;
  18. WX_OPEN_APP_SECRET = appSecret;
  19. WX_OPEN_REDIRECT_URL = redirectUrl;
  20. YYGH_BASE_URL = yyghBaseUrl;
  21. }
  22. }

3. controller接口

具体参数要看微信的开发文档:
https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

(1)生成二维码代码

  1. @Controller
  2. @RequestMapping("/api/ucenter/wx")
  3. public class WeixinApiController {
  4. @Autowired
  5. private UserInfoService userInfoService;
  6. @Autowired
  7. private RedisTemplate redisTemplate;
  8. /**
  9. * 获取微信登录参数
  10. */
  11. @GetMapping("getLoginParam")
  12. @ResponseBody
  13. public Result genQrConnect(HttpSession session) throws UnsupportedEncodingException {
  14. String redirectUri = URLEncoder.encode(ConstantPropertiesUtil.WX_OPEN_REDIRECT_URL, "UTF-8");
  15. Map<String, Object> map = new HashMap<>();
  16. map.put("appid", ConstantPropertiesUtil.WX_OPEN_APP_ID);
  17. map.put("redirectUri", redirectUri);
  18. map.put("scope", "snsapi_login");
  19. map.put("state", System.currentTimeMillis()+"");//System.currentTimeMillis()+""
  20. return Result.ok(map);
  21. }
  22. }

(2)扫描二维码回调方法代码

1)添加httpclient工具类

2)controller代码
  1. /**
  2. * 微信登录回调
  3. *
  4. * @param code
  5. * @param state
  6. * @return
  7. */
  8. @RequestMapping("callback")
  9. public String callback(String code, String state) {
  10. //获取授权临时票据
  11. System.out.println("微信授权服务器回调。。。。。。");
  12. System.out.println("state = " + state);
  13. System.out.println("code = " + code);
  14. if (StringUtils.isEmpty(state) || StringUtils.isEmpty(code)) {
  15. log.error("非法回调请求");
  16. throw new YyghException(ResultCodeEnum.ILLEGAL_CALLBACK_REQUEST_ERROR);
  17. }
  18. //使用code和appid以及appscrect换取access_token
  19. StringBuffer baseAccessTokenUrl = new StringBuffer()
  20. .append("https://api.weixin.qq.com/sns/oauth2/access_token")
  21. .append("?appid=%s")
  22. .append("&secret=%s")
  23. .append("&code=%s")
  24. .append("&grant_type=authorization_code");
  25. String accessTokenUrl = String.format(baseAccessTokenUrl.toString(),
  26. ConstantPropertiesUtil.WX_OPEN_APP_ID,
  27. ConstantPropertiesUtil.WX_OPEN_APP_SECRET,
  28. code);
  29. String result = null;
  30. try {
  31. result = HttpClientUtils.get(accessTokenUrl);
  32. } catch (Exception e) {
  33. throw new YyghException(ResultCodeEnum.FETCH_ACCESSTOKEN_FAILD);
  34. }
  35. System.out.println("使用code换取的access_token结果 = " + result);
  36. JSONObject resultJson = JSONObject.parseObject(result);
  37. if(resultJson.getString("errcode") != null){
  38. log.error("获取access_token失败:" + resultJson.getString("errcode") + resultJson.getString("errmsg"));
  39. throw new YyghException(ResultCodeEnum.FETCH_ACCESSTOKEN_FAILD);
  40. }
  41. String accessToken = resultJson.getString("access_token");
  42. String openId = resultJson.getString("openid");
  43. log.info(accessToken);
  44. log.info(openId);
  45. //根据access_token获取微信用户的基本信息
  46. //先根据openid进行数据库查询
  47. // UserInfo userInfo = userInfoService.getByOpenid(openId);
  48. // 如果没有查到用户信息,那么调用微信个人信息获取的接口
  49. // if(null == userInfo){
  50. //如果查询到个人信息,那么直接进行登录
  51. //使用access_token换取受保护的资源:微信的个人信息
  52. String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
  53. "?access_token=%s" +
  54. "&openid=%s";
  55. String userInfoUrl = String.format(baseUserInfoUrl, accessToken, openId);
  56. String resultUserInfo = null;
  57. try {
  58. resultUserInfo = HttpClientUtils.get(userInfoUrl);
  59. } catch (Exception e) {
  60. throw new YyghException(ResultCodeEnum.FETCH_USERINFO_ERROR);
  61. }
  62. System.out.println("使用access_token获取用户信息的结果 = " + resultUserInfo);
  63. JSONObject resultUserInfoJson = JSONObject.parseObject(resultUserInfo);
  64. if(resultUserInfoJson.getString("errcode") != null){
  65. log.error("获取用户信息失败:" + resultUserInfoJson.getString("errcode") + resultUserInfoJson.getString("errmsg"));
  66. throw new YyghException(ResultCodeEnum.FETCH_USERINFO_ERROR);
  67. }
  68. //解析用户信息
  69. String nickname = resultUserInfoJson.getString("nickname");
  70. String headimgurl = resultUserInfoJson.getString("headimgurl");
  71. UserInfo userInfo = new UserInfo();
  72. userInfo.setOpenid(openId);
  73. userInfo.setNickName(nickname);
  74. userInfo.setStatus(1);
  75. userInfoService.save(userInfo);
  76. // }
  77. Map<String, Object> map = new HashMap<>();
  78. String name = userInfo.getName();
  79. if(StringUtils.isEmpty(name)) {
  80. name = userInfo.getNickName();
  81. }
  82. if(StringUtils.isEmpty(name)) {
  83. name = userInfo.getPhone();
  84. }
  85. map.put("name", name);
  86. if(StringUtils.isEmpty(userInfo.getPhone())) {
  87. map.put("openid", userInfo.getOpenid());
  88. } else {
  89. map.put("openid", "");
  90. }
  91. String token = JwtHelper.createToken(userInfo.getId(), name);
  92. map.put("token", token);
  93. return "redirect:" + ConstantPropertiesUtil.YYGH_BASE_URL + "/weixin/callback?token="+map.get("token")+"&openid="+map.get("openid")+"&name="+URLEncoder.encode((String)map.get("name"));

bug:

bug1:接口1

在接口1,生成二维码接口中,报错:redirect_uricam参数错误
分析:

  • swagger测试没错!说明时前端错了!
  • 前端中的数据获取要与后端中的名字对应

image.png
image.png

bug2:接口2

扫码登录一直报错
一直报错!sql异常!
为什么?
原来是我的微信名错误。。HY,你懂得!
请求正常之后的页面:(感觉还是有错误!)
image.png

感觉还是有错误,但是请求不再404了!
image.png

bug3:验证码问题

手机接收验证码说:2分钟内有效。说的是真的。
两分钟之后,验证码从reids中被删除!!!

bug4:总:微信登录问题

目前没有
说明:新用户扫码登录需要注册手机号,往后直接扫码就可以登录成功!
至此,到了133集!