洛塔服务号回复014获取代码。
打开网页后,获取到用户的openid、头像、昵称等信息。
scope为snsapi_base时无需授权即可获取到openid。
scope为snsapi_userinfo需要授权,才能获取到头像、昵称等(如果已经关注公众号了,则不需要授权也能获取到)
如果直接进入获取用户信息的页面,一般会显示快照,也就是微信用虚拟的数据先把你网页对应内容填充了,然后点击底部获取信息后再替换为真实的,方便用户提前知道页面的样子,以确认是否还要继续授权。
要想获取到用户信息,首先需要的就是拼接链接,按照微信规则拿到获取用户信息的链接地址。
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
参数说明
按照官方的说明,redirect_uri需要用https的形式,但经过测试,http的也正常。
本例的测试链接:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx276049d6a7551dca&redirect_uri=http%3A%2F%2Ftest.lootaa.com%2Flootaa-wechat%2Fwx14&response_type=code&scope=snsapi_userinfo&state=STATE1#wechat_redirect
如果scope是snsapi_base,通过本接口直接获取到openid就可以了。如果scope是snsapi_userinfo,则还需要使用access_token继续请求。
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APPID + "&secret=" + SECRET + "&code=" + code + "&grant_type=authorization_code";
String result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
System.out.println(result);
String accessToken = JSON.parseObject(result).getString("access_token");
String refreshToken = JSON.parseObject(result).getString("refresh_token");
String openid = JSON.parseObject(result).getString("openid");
System.out.println("openid是:" + openid);
这个情况绝大部分是用不到的,看具体业务了。
如果不需要刷新,继续后续业务逻辑;如果需要刷新,就调用下刷新的接口即可。
// step3. 检查是否需要刷新access_token(大部分情况都用不到)
// 检查access_token是否有效,如果无效了就刷新下
url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openid;
result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
System.out.println(result);
if(JSON.parseObject(result).getIntValue("errcode") != 0) {
// 刷新access_token
url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + APPID + "&grant_type=refresh_token&refresh_token=" + refreshToken;
result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
System.out.println(result);
accessToken = JSON.parseObject(result).getString("access_token");
refreshToken = JSON.parseObject(result).getString("refresh_token");
openid = JSON.parseObject(result).getString("openid");
System.out.println("openid是:" + openid);
}
只有scope是snsapi_userinfo的时候才需要。返回的数据里面也会有unionid,这个一般是比较重要的。
// step4. 拉取用户信息。 scope是snsapi_userinfo的时候才需要
url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN";
result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
// {"openid":"ohUHp6iaFJq6SISTVwHS5lkb9Pb8","nickname":"神经蛙","sex":0,"language":"","city":"","province":"","country":"","headimgurl":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTKGqbSKkB2fTiaK9jq69WAUuAaPgvDcEyocuYDnU7WGicJiaJ5MaWAkIBduClXR5ib4LFkjZrdzgkE9Ug\/132","privilege":[],"unionid":"oxayv6tK4OcYx8pWNpBzp6sNNtGk"}
System.out.println(result);
获取到用户信息后,可以将页面继续跳转,携带着基本的信息。本例为了方便,直接返回了对应文本。
return "这里可以重定向页面,先处理好用户基本信息后直接跳转。" + result;
如果要返回到一个网页,方式可以可以这样
package com.lootaa.wechat;
import org.jsoup.Connection.Method;
import org.jsoup.Jsoup;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
/**
* 公众号微信网页授权
* 前置条件1:设置与开发-->接口权限-->全局搜索网页授权获取用户基本信息,显示已获得
* 前置条件2:设置与开发-->公众号设置-->授权回调域名,已经成功设置,即获取到数据后要跳转的页面
*/
@RestController
public class Test014 {
public static final String APPID = "wx276049d6a7551dca";
public static final String SECRET = "cbe109fdf6f399bd72ed3a4afafa21b1";
/**
* 完整项目源码可关注公众号"lootaayun"(洛塔),回复014获取
*/
@GetMapping("wx14")
public String get(String code, String state) throws Exception {
// step1. 打开链接(替换参数) https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
// APPID即为公众号的APPID
// redirect_uri是跳转到哪个链接地址的url,用urlEncode处理。这个一般是后台get请求的一个链接,用来得到code等数据,得到之后再重定向到对应网页
// scope可选值为snsapi_base(不弹出授权页面,只要openid等) snsapi_userinfo(弹出授权页面,可以拿到昵称、头像等)
// 本例的测试链接:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx276049d6a7551dca&redirect_uri=http%3A%2F%2Ftest.lootaa.com%2Flootaa-wechat%2Fwx14&response_type=code&scope=snsapi_userinfo&state=STATE1#wechat_redirect
System.out.println(code);
System.out.println(state);
// step2. 用code换取access_token和openid
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APPID + "&secret=" + SECRET + "&code=" + code + "&grant_type=authorization_code";
String result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
System.out.println(result);
String accessToken = JSON.parseObject(result).getString("access_token");
String refreshToken = JSON.parseObject(result).getString("refresh_token");
String openid = JSON.parseObject(result).getString("openid");
System.out.println("openid是:" + openid);
// step3. 检查是否需要刷新access_token(大部分情况都用不到)
// 检查access_token是否有效,如果无效了就刷新下
url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openid;
result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
System.out.println(result);
if(JSON.parseObject(result).getIntValue("errcode") != 0) {
// 刷新access_token
url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + APPID + "&grant_type=refresh_token&refresh_token=" + refreshToken;
result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
System.out.println(result);
accessToken = JSON.parseObject(result).getString("access_token");
refreshToken = JSON.parseObject(result).getString("refresh_token");
openid = JSON.parseObject(result).getString("openid");
System.out.println("openid是:" + openid);
}
// step4. 拉取用户信息。 scope是snsapi_userinfo的时候才需要
url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN";
result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
// {"openid":"ohUHp6iaFJq6SISTVwHS5lkb9Pb8","nickname":"神经蛙","sex":0,"language":"","city":"","province":"","country":"","headimgurl":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTKGqbSKkB2fTiaK9jq69WAUuAaPgvDcEyocuYDnU7WGicJiaJ5MaWAkIBduClXR5ib4LFkjZrdzgkE9Ug\/132","privilege":[],"unionid":"oxayv6tK4OcYx8pWNpBzp6sNNtGk"}
System.out.println(result);
// step5. 重定向页面
// 如果已经关注了公众号,则不需要授权就能获取到用户信息。否则会弹出授权页面让确认
return "这里可以重定向页面,先处理好用户基本信息后直接跳转。" + result;
}
}