目录
项目背景
公司有一个订阅号,需要根据这个订阅号做一个用户基本信息的获取。订阅号没有权限,只有服务号有此权限,于是就用服务号授权给订阅号。同时,由于服务号回调域名已被使用,只能通过配置多个回调域名。
参考链接
微信官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
网页授权多域名配置,大佬写的:https://github.com/HADB/GetWeixinCode 按着里面的文档配置,轻松获取code。
具体操作
第一步:下载大佬的get-weixin-code.html, 部署至微信授权回调域名的目录下,只要能够访问到就可以,就是在微信微信公众平台->接口权限->配置的授权回调页面域名,例如:www.abc.com
第二步:我们写的登录页面: http://www.xyz.com/wxlogin.html 需要获取微信授权, 那就引导用户点击,做个微信用户登录按钮,点击跳转到下面的链接。
第三步: 最终就会跳转到这样一个地址:http://www.xyz.com/wxlogin.html?code=XXXXXXXXXXXXXXXXX&state=hello-world,建议state改成时间戳之类的。我们用的VUE开发,create的时候调用后台接口将code传入
第四步:看微信授权回调的流程,通过code先获取accessToken和openId,然后再获取用户基本信息实现登录。
关于网页授权的两种scope的区别说明
1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
注意:openid是唯一的可以作为用户的用户唯一标识,用户必须关注公众号才能获取用户基本信息
参考代码
用了hutool
public class WxLoginController {
private static final String APPID = " ";
private static final String APPSECRET = " ";
public static Map getAccessToken(String code) {
Map map = null;
try {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APPID + "&secret=" + APPSECRET + "&code=" + code + "&grant_type=authorization_code";
String result = HttpUtil.get(url);
System.out.println(result);
map = JSON.parseObject(result, Map.class);
System.out.println(map.get("access_token"));
System.out.println(map.get("expires_in"));
System.out.println(map.get("refresh_token"));
System.out.println(map.get("openid"));
System.out.println(map.get("scope"));
System.out.println(map.get("errcode"));
System.out.println(map.get("errmsg"));
System.out.println("获取微信accessToken回调数据" + result);
} catch (Exception e) {
System.out.println("获取微信accessToken失败");
}
return map;
}
public static String refreshToken(String REFRESH_TOKEN) {
try {
String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + APPID + "&grant_type=refresh_token&refresh_token=" + REFRESH_TOKEN;
String result = HttpUtil.get(url);
System.out.println("获取微信accessToken回调数据" + result);
} catch (Exception e) {
System.out.println("获取微信accessToken失败");
}
System.out.println();
return "";
}
/**
* 获取用户信息
*
* @param accessToken
* @param openId
* @return
*/
public static Map getUserInfoByCode(String accessToken, String openId) {
Map map = null;
try {
String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId;
String result = HttpUtil.get(url);
map = JSON.parseObject(result, Map.class);
System.out.println(result);
} catch (Exception e) {
System.out.println("获取微信信息失败");
}
return map;
}
}