微信网页授权文档地址:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
微信网页授权步骤:
一、用户同意授权,获取code
注:公众号需要有授权作用域
url=https://open.weixin.qq.com/connect/oauth2/authorize?appid=公众号唯一标识&redirect_uri=回调地址&response_type=code&scope=授权作用域&state=STATE#wechat_redirect
参数解释
授权流程:
1.用户点击公众号菜单
调用链接url,用户在同意授权之后,回调地址将会拿到code
注:每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
2.将code发送至第三方网页服务器(就是我们开发服务器的后端接口)
二、通过code,获取openid,获取用户基本信息
url=https://api.weixin.qq.com/sns/oauth2/access_token?appid=公众号唯一标识&secret=公众号的appsecret&code=第一步拿到的code&grant_type=authorization_code
后端拿到code之后,使用Spring RestTemplate类 进行请求
注:对于RestTemplate类的使用方法,请查看:
https://docs.spring.io/spring/docs/5.1.8.RELEASE/javadoc-api/
服务器后端处理code
// 注意替换appid、appsecret与code
String tokenURL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=公众号唯一标识&secret=公众号的appsecret&code=第一步拿到的code&grant_type=authorization_code";
// 实例化RestTemplate对象
RestTemplate restTemplate = new RestTemplate();
// 调用RestTemplate对象的getForObject()方法,执行url请求,获得相应结果
String tokenResponse = restTemplate.getForObject(tokenURL, String.class);
请求结果详解:
// 请求结果样例(请求正确,将返回一个json字符串)
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
请求结果参数
此时拿到了access_token,可以进行用户信息的拉取
url=https://api.weixin.qq.com/sns/userinfo?access_token=获取的access_token&openid=获取的openid&lang=zh_CN
服务器后端请求获取用户信息
// 注意替换参数
String userinfoURL = "https://api.weixin.qq.com/sns/userinfo?access_token=获取的access_token&openid=获取的openid&lang=zh_CN";
// 调用RestTemplate对象的getForObject()方法,执行url请求,获得相应结果
String userinfoResponse = restTemplate.getForObject(userinfoURL, String.class);
请求结果详解:
// 请求结果样例(请求正确,将返回一个json字符串)
{
"openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
请求结果参数
注:在获取用户信息的时候,微信使用ISO-8859-1编码,需要进行编码转化
// 注userinfoJson是将请求结果转化为JSONObject
String nickname = new String(userinfoJson.getString("nickname").getBytes("ISO-8859-1"), "UTF-8");
到此,网页授权结束
网友评论