一、准备工作
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
4
//得到授权临时票据code
5
System.out.println("code = " + code);
6
System.out.println("state = " + state);
7
}
二、后台开发
1、添加依赖
1
2
3
org.apache.httpcomponents
4
httpclient
5
6
7
8
commons-io
9
commons-io
10
11
12
13
com.google.code.gson
14
gson
15
2、创建httpclient工具类
放入util包
1
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
9
//得到授权临时票据code
10
System.out.println(code);
11
System.out.println(state);
12
13
//从redis中将state获取出来,和当前传入的state作比较
14
//如果一致则放行,如果不一致则抛出异常:非法访问
15
16
//向认证服务器发送请求换取access_token
17
String baseAccessTokenUrl = “https://api.weixin.qq.com/sns/oauth2/access_token” +
18
“?appid=%s” +
19
“&secret=%s” +
20
“&code=%s” +
21
“&grant_type=authorization_code”;
22
23
String accessTokenUrl = String.format(baseAccessTokenUrl,
24
ConstantPropertiesUtil.WX_OPEN_APP_ID,
25
ConstantPropertiesUtil.WX_OPEN_APP_SECRET,
26
code);
27
28
String result = null;
29
try {
30
result = HttpClientUtils.get(accessTokenUrl);
31
System.out.println(“accessToken=============” + result);
32
} catch (Exception e) {
33
throw new GuliException(20001, “获取access_token失败”);
34
}
35
36
//解析json字符串
37
Gson gson = new Gson();
38
HashMap map = gson.fromJson(result, HashMap.class);
39
String accessToken = (String)map.get(“access_token”);
40
String openid = (String)map.get(“openid”);
41
42
//查询数据库当前用用户是否曾经使用过微信登录
43
Member member = memberService.getByOpenid(openid);
44
if(member == null){
45
System.out.println(“新用户注册”);
46
47
//访问微信的资源服务器,获取用户信息
48
String baseUserInfoUrl = “https://api.weixin.qq.com/sns/userinfo” +
49
“?access_token=%s” +
50
“&openid=%s”;
51
String userInfoUrl = String.format(baseUserInfoUrl, accessToken, openid);
52
String resultUserInfo = null;
53
try {
54
resultUserInfo = HttpClientUtils.get(userInfoUrl);
55
System.out.println(“resultUserInfo==========” + resultUserInfo);
56
} catch (Exception e) {
57
throw new GuliException(20001, “获取用户信息失败”);
58
}
59
60
//解析json
61
HashMap<String, Object> mapUserInfo = gson.fromJson(resultUserInfo, HashMap.class);
62
String nickname = (String)mapUserInfo.get(“nickname”);
63
String headimgurl = (String)mapUserInfo.get(“headimgurl”);
64
65
//向数据库中插入一条记录
66
member = new Member();
67
member.setNickname(nickname);
68
member.setOpenid(openid);
69
member.setAvatar(headimgurl);
70
memberService.save(member);
71
}
72
73
//TODO 登录
74
75
return “redirect:http://localhost:3000”;
76
}
4、业务层
业务接口:MemberService.java
1
Member getByOpenid(String openid);
业务实现:MemberServiceImpl.java
1
@Override
2
public Member getByOpenid(String openid) {
3
4
QueryWrapper queryWrapper = new QueryWrapper<>();
5
queryWrapper.eq(“openid”, openid);
6
7
Member member = baseMapper.selectOne(queryWrapper);
8
return member;
9
}