记一次微信网页授权后获取用户信息并重定向

微信公众号开发还是比较简单的,但是写完之后就忘记了。每次写还要重新查文档,所以这次吧开发过程记录起来,有些细节问题也记录下来,以后用到就方便了。

需求:

* 能获取用户基本信息。
* 获取微信信息的时候,从哪个页面来,最后到哪个页面去。
* 调用方式要简单。
思路:

因为之前写过几次,思路还是很清楚的,大概有一下几个步骤:

* 提供一个链接,带有一个redirect_url参数,代表在获取用户信息后要返回的页面。
* 在上一个链接中跳转进行微信网页授权。
* 授权成功后获取code。
* 通过code调用微信接口获取access_token。
* 通过access_token获取用户基本信息。
* 将用户信息拼在之前定义的redirect_url中,并重定向到redirect_url。
实现:

思路有了下面就开始实现这个思路

1:

首先定义一个方法,接收redirect_url参数,并在这个方法中跳转到微信授权页面。

这里我们需要完成思路中1,2的步骤。
注意:
在浏览器中调用方法的时候redirect_url参数要经过 URLEncoder.encode

在方法中接收的redirect_url参数任然需要经过URLEncoder.encode,因为在作为参数接收到的时候,这个参数已经变成正常的http链接了。

在拼装微信重定向地址的时候,需要再次URLEncoder.encode。
//微信网页授权地址 private String getWechatCodeUrl =
"https://open.weixin.qq.com/connect/oauth2/authorize?" + "appid=[APPID]&" +
//微信appid "redirect_uri=[REDIRECT_URI]&" + //获取网页授权后,微信重定向地址
"response_type=code&" + "scope=snsapi_userinfo&" + //授权方式
"state=STATE#wechat_redirect"; //微信授权后返回的地址 private String getCodeUrl = "项目域名"
+ "redirect/code?redirect_url="; //提供的获取用户信息的地址 @GetMapping("/redirect") public
String redirect( @RequestParam(name = "redirect_url", defaultValue = "",
required = false) String redirectUrl ) throws UnsupportedEncodingException {
//默认值,前端首页地址 if (StringUtils.isBlank(redirectUrl)) { redirectUrl = webSite; }
//一次编码 redirectUrl = URLEncoder.encode(redirectUrl, "utf-8"); //二次编码
redirectUrl = URLEncoder.encode(getCodeUrl + redirectUrl, "utf-8");
//最终得到的微信获取微信授权地址 String url = getWechatCodeUrl .replace("[APPID]", appid)
.replace("[REDIRECT_URI]", redirectUrl); logger.info("redirecturl: {}", url);
return "redirect:" + url; }
2:


这里要在定义一个链接,就是上一步要让微信跳转回来的地址。这里微信会携带一个code参数,由于在上一步我们将redirect_url地址进行了两次编码,所以在这个方法中redirect_url也会传递进来。

着这个方法中我们需要完成思路中 4,5,6的步骤
//获取access_token的接口地址,这里还可以获取到openid private String getAccessTokenUrl =
"https://api.weixin.qq.com/sns/oauth2/access_token?" + "appid=[APPID]&" +
//微信的appid "secret=[SECRET]&" + //微信的secret "code=[CODE]&" + //重定向后微信携带的code参数
"grant_type=authorization_code"; //获取微信用户基本信息的接口地址 private String
getWechatUserUrl = "https://api.weixin.qq.com/sns/userinfo?" +
"access_token=[ACCESS_TOKEN]&" + //获取到的 access_token "openid=[OPENID]&" +
//公众号的 openid "lang=zh_CN"; //这里的地址由微信重定向跳转,携带code参数。
@GetMapping("/redirect/code") public String getCode( @RequestParam(name =
"redirect_url", defaultValue = "", required = false) String redirectUrl,
@RequestParam(name = "code", defaultValue = "", required = false) String code )
throws UnsupportedEncodingException { logger.info("redirect_url: {}",
redirectUrl); logger.info("code: {}", code); if (StringUtils.isBlank(code)) {
logger.error("获取code失败"); return "redirect:" + redirectUrl +
"?error=code-is-null"; } //解码重定向地址 redirectUrl = URLDecoder.decode(redirectUrl,
"utf-8"); //根据code获取微信相关信息 String apiUrl = getAccessTokenUrl
.replace("[APPID]", appid) .replace("[SECRET]", secret) .replace("[CODE]",
code); String res = HttpUtils.doGet(apiUrl, new HashMap<>()); JSONObject
resJson = JSONObject.parseObject(res); //请求失败 if
(resJson.containsKey("errmsg")) { logger.error("获取access_token失败," + res);
return "redirect:" + redirectUrl + "?error=" + resJson.getString("errmsg"); }
//获取微信用户信息 String getUserUrl = getWechatUserUrl .replace("[ACCESS_TOKEN]",
resJson.getString("access_token")) .replace("[OPENID]",
resJson.getString("openid")); String user = HttpUtils.doGet(getUserUrl, new
HashMap<>()); JSONObject userJson = JSONObject.parseObject(user); if
(userJson.containsKey("errmsg")) { logger.error("获取access_token失败," + res);
return "redirect:" + redirectUrl + "?error=" + userJson.getString("errmsg"); }
//这里直接将微信用户信息编码后重定向给最开始的redirect_url return "redirect:" + redirectUrl +
"?wechat_user=" + URLEncoder.encode(user, "utf-8"); }
完成:

这里就已经开发完成了,发布到线上后访问:
[域名]/redirect?redirect_url=[需要转到的地址]
后,在获得用户授权后会跳转
[需要转到的地址]?wechat_user=[URLEncoder.encode后的微信用户信息]
https://www.cnblogs.com/hebaibai/p/11089318.html

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信