1. 大体思路,设置好域名,引导用户进入code获取页面,用code换取access_token(和接口调用的acess_token不同),用access_token获取拉取用户信息,跳转到指定页面
具体过程如下
2. 设置好域名,以测试公众号为例
注意域名设置的时候,不能有http:// 具体规则参考微信api
3. 引导用户进入code获取页面,如果有看过我上一篇博客自定义菜单的会发现,我那个时候就做了两个超链接,一个是静默授权,一个用户授权,两者的区别在于scope的不同。这边简述一下
创建两个子菜单,分别指向静默授权和用户授权
// 静默授权
ChildButton snsapiBaseButton = new ChildButton();
snsapiBaseButton.setType(MenuParameter.VIEW);
snsapiBaseButton.setName("静默授权");
snsapiBaseButton.setUrl("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + Parameter.APPID
+ "&redirect_uri=http://" + domainName
+ "/wechat/snsApiBase&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect");
// 用户授权
ChildButton snsapiUserinfoButton = new ChildButton();
snsapiUserinfoButton.setType(MenuParameter.VIEW);
snsapiUserinfoButton.setName("用户授权");
snsapiUserinfoButton.setUrl("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + Parameter.APPID
+ "&redirect_uri=http://" + domainName
+ "/wechat/snsApiUserInfo&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect");
注意再用Gson序列化,提交时报40033异常,如果有可以参考上一篇博客,那边提供了解决方法。
4. 获取code
@RequestMapping(value="/snsApiUserInfo")
public String snsApiUserInfo(HttpServletRequest request, Model model) {
String code = request.getParameter("code");
}
5. 获取access_token
private static final String GETACCESSTOKENURL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={appId}&secret={secret}&code={code}&grant_type=authorization_code";
@RequestMapping(value="/snsApiUserInfo")
public String snsApiUserInfo(HttpServletRequest request, Model model) {
String code = request.getParameter("code");
String getAccessTokenurl = GETACCESSTOKENURL.replace("{appId}", Parameter.APPID).replace("{secret}", Parameter.APPSECRET).replace("{code}", code);
String result = Browser.httpGet(getAccessTokenurl);
Gson gson = new Gson();
ReturnMessage returnMessage = gson.fromJson(result, ReturnMessage.class);
System.out.println(returnMessage);
}
6. 拉取用户信息
private static final String GETUSERINFOURL = "https://api.weixin.qq.com/sns/userinfo?access_token={accessToken}&openid={openId}&lang=zh_CN";
@RequestMapping(value="/snsApiUserInfo")
public String snsApiUserInfo(HttpServletRequest request, Model model) {
String code = request.getParameter("code");
String getAccessTokenurl = GETACCESSTOKENURL.replace("{appId}", Parameter.APPID).replace("{secret}", Parameter.APPSECRET).replace("{code}", code);
String result = Browser.httpGet(getAccessTokenurl);
Gson gson = new Gson();
ReturnMessage returnMessage = gson.fromJson(result, ReturnMessage.class);
System.out.println(returnMessage);
String getUserInfoUrl = GETUSERINFOURL.replace("{accessToken}", returnMessage.getAccessToken()).replace("{openId}", returnMessage.getOpenId());
String userInfoStr = Browser.httpGet(getUserInfoUrl);
UserInfo userInfo = gson.fromJson(userInfoStr, UserInfo.class);
System.out.println(userInfo);
model.addAttribute(userInfo);
return "SnsApiUserInfo";
}
7. 授权后到指定页面
<body>
<p>用户数据</p>
openId:<p>${userInfo.openId}</p>
nickName:<p>${userInfo.nickName}</p>
sex:<p>${userInfo.sex}</p>
province:<p>${userInfo.province}</p>
city:<p>${userInfo.city}</p>
country:<p>${userInfo.country}</p>
headImgUrl<p><a href="${userInfo.headImgUrl}">headImgUrl</a></p>
privilege:<p>${userInfo.privilege}</p>
unionId<p>${userInfo.unionId}</p>
</body>