一、准备工作

1、全局配置的跳转路径

  1. # 微信开放平台 重定向url
  2. wx.open.redirect_url=http://回调地址/api/ucenter/wx/callback

2、修改当前项目启动端口号为8150

3、测试回调是否可用

在WxApiController中添加方法

  1. @GetMapping("callback")
  2. public String callback(String code, String state, HttpSession session) {
  3. //得到授权临时票据code
  4. System.out.println("code = " + code);
  5. System.out.println("state = " + state);
  6. }

二、后台开发

1、添加依赖

  1. <!--httpclient-->
  2. <dependency>
  3. <groupId>org.apache.httpcomponents</groupId>
  4. <artifactId>httpclient</artifactId>
  5. </dependency>
  6. <!--commons-io-->
  7. <dependency>
  8. <groupId>commons-io</groupId>
  9. <artifactId>commons-io</artifactId>
  10. </dependency>
  11. <!--gson-->
  12. <dependency>
  13. <groupId>com.google.code.gson</groupId>
  14. <artifactId>gson</artifactId>
  15. </dependency>

2、创建httpclient工具类

放入util包

HttpClientUtils.java

3、创建回调controller方法

在WxApiController.java中添加如下方法

  1. /**
  2. * @param code
  3. * @param state
  4. * @return
  5. */
  6. @GetMapping("callback")
  7. public String callback(String code, String state){
  8. //得到授权临时票据code
  9. System.out.println(code);
  10. System.out.println(state);
  11. //从redis中将state获取出来,和当前传入的state作比较
  12. //如果一致则放行,如果不一致则抛出异常:非法访问
  13. //向认证服务器发送请求换取access_token
  14. String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
  15. "?appid=%s" +
  16. "&secret=%s" +
  17. "&code=%s" +
  18. "&grant_type=authorization_code";
  19. String accessTokenUrl = String.format(baseAccessTokenUrl,
  20. ConstantPropertiesUtil.WX_OPEN_APP_ID,
  21. ConstantPropertiesUtil.WX_OPEN_APP_SECRET,
  22. code);
  23. String result = null;
  24. try {
  25. result = HttpClientUtils.get(accessTokenUrl);
  26. System.out.println("accessToken=============" + result);
  27. } catch (Exception e) {
  28. throw new GuliException(20001, "获取access_token失败");
  29. }
  30. //解析json字符串
  31. Gson gson = new Gson();
  32. HashMap map = gson.fromJson(result, HashMap.class);
  33. String accessToken = (String)map.get("access_token");
  34. String openid = (String)map.get("openid");
  35. //查询数据库当前用用户是否曾经使用过微信登录
  36. Member member = memberService.getByOpenid(openid);
  37. if(member == null){
  38. System.out.println("新用户注册");
  39. //访问微信的资源服务器,获取用户信息
  40. String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
  41. "?access_token=%s" +
  42. "&openid=%s";
  43. String userInfoUrl = String.format(baseUserInfoUrl, accessToken, openid);
  44. String resultUserInfo = null;
  45. try {
  46. resultUserInfo = HttpClientUtils.get(userInfoUrl);
  47. System.out.println("resultUserInfo==========" + resultUserInfo);
  48. } catch (Exception e) {
  49. throw new GuliException(20001, "获取用户信息失败");
  50. }
  51. //解析json
  52. HashMap<String, Object> mapUserInfo = gson.fromJson(resultUserInfo, HashMap.class);
  53. String nickname = (String)mapUserInfo.get("nickname");
  54. String headimgurl = (String)mapUserInfo.get("headimgurl");
  55. //向数据库中插入一条记录
  56. member = new Member();
  57. member.setNickname(nickname);
  58. member.setOpenid(openid);
  59. member.setAvatar(headimgurl);
  60. memberService.save(member);
  61. }
  62. //TODO 登录
  63. return "redirect:http://localhost:3000";
  64. }

4、业务层

业务接口:MemberService.java

Member getByOpenid(String openid);

业务实现:MemberServiceImpl.java

@Override
public Member getByOpenid(String openid) {

    QueryWrapper<Member> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("openid", openid);

    Member member = baseMapper.selectOne(queryWrapper);
    return member;
}