大家好,上一篇咱们说了微信开发授权中的snsapi_base授权方式,这种方式呢只能是获取到用户的openId,openId是一个用户关注微信公众号之后的唯一标识,有了这个标识用户就会收到公众号推送过来的消息。但是需要展示用户昵称,头像等的更多的用户信息,就需要另外一种授权方式:snsapi_userInfo。这种方式需要用户点击授权页进行授权,用户点击授权页确认之后才能得到用户的死人信息。我们今天就来看一下用户的snsapi_userInfo授权方式。
1.第一步还是需要配置服务器配置,就是那个回调的Url。
2.在微信页打开授权连接,但是那个授权连接里面的一个参数scope就是需要snsapi_userInfo方式,进行授权。
3.咱们在请求微信的api获取openId和access_token。
4.根据openId和access_token获取微信用户的头像和昵称等信息。
到此授权认证完毕。咱们来看一下代码实现。
在上一篇中我们获取到了code,并且微信服务器也回调了我们的服务器地址,我们就可以获取到open_id和access_token,当然还有其他的参数其中之一就是refresh_token,这个参数看名字就知道意思了,他是用在更新咱们刚才得到的Access_token,因为access_token只有2个小时的有效期,2小时过之后就失效了,但是这个refresh_token有效期是 7天、30天、60天、90天,可以直接使用refresh_token刷新Access_token,具体的代码就是:
/**
* 根据refresh_token刷新access_token
*
* @param RefreshToken
* @param weChatAppId
* @param grantType
* @return
*/
private static final String REFRESH_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%s&grant_type=%s&refresh_token=%s";
public RefreshToken refreshAuthToken(String refresh, String weChatAppId, String grantType) {
String url = String.format(REFRESH_TOKEN_URL, weChatAppId, grantType, refresh);
RefreshToken refreshToken = null;
try {
LOGGER.info("根据refresh_token刷新access_token请求Url:{}", url);
String result = HttpClientUtils.sendHttpGet(url);
LOGGER.info("根据refresh_token刷新access_token,返回值:{}", result);
refreshToken = GsonHolder.getGson().fromJson(refresh, RefreshToken.class);
} catch (Exception ex) {
LOGGER.error("根据refresh_token刷新access_token异常:", ex);
}
return refreshToken;
}
其中的参数就是weChatAppId:咱们公众服务号APPID,grantType是一个写死的值:refresh_token。refresh就是咱们在微信服务器回调之后获取到的值refresh_token。调用这个接口就会刷新access_token:
@SerializedName("access_token")
private String accessToken;
@SerializedName("expires_in")
private int expiresIn;
@SerializedName("refresh_token")
private String refreshToken;
@SerializedName("openid")
private String openId;
private String scope;
咱们得到了这个access_token之后来看一下怎么获取用户的昵称,头像等信息。
还是老套路就是调用微信的API,都是微信的API.
/**
* 获取用户 头像,昵称 等信息
*/
private static String WE_CHAT_USER_INFO = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=%s";
WeChatUserInfo getWeChatUserInfo(String openId, String access_token, String responseLanguage) {
String url = String.format(WE_CHAT_USER_INFO, access_token, openId, responseLanguage);
WeChatUserInfo userInfo = null;
try {
LOGGER.info("查询用户所有详细信息请求url:{}", url);
String result = HttpClientUtils.sendHttpGet(url);
LOGGER.info("查询用户详细信息返回结果:{}", result);
userInfo = GsonHolder.getGson().fromJson(result, WeChatUserInfo.class);
} catch (Exception ex) {
LOGGER.error("查询用户详细信息异常", ex);
}
return userInfo;
}
参数说明:openID就是咱们获取到的用户的唯一标示。access_token就是上一步获取的。responseLanguage就是返回的是那种语言,有简体和繁体等:zh_CN 简体,zh_TW 繁体,en 英语,咱们在大陆就使用简体就可以了。返回值在贴一下:
@SerializedName("openid")
private String openId;
@SerializedName("nickname")
private String nikeName;
private int sex;
private String province;
private String city;
private String country;
@SerializedName("headimgurl")
private String headimgUrl;
private List<String> privilege;
@SerializedName("unionid")
private String unionId;
通过字面意思就可以看懂这些返回值得意思了,头像啊,昵称,性别省份,城市等等,这些信息你拿到只有开发起来就可以更加人性化,服务化。好了接着上一篇的snsapi_base方式只能得到openId不同snsapi_userinfo方式得到的更多更全的信息。好了咱们今天就说微信的授权就完结了,大家可以自己开发试试,但是前提得有服务号哈,一般的订阅号是不能开发这些的。
下一期咱们开始素材方面的整理,图文素材啊,模板消息等等。大家一起讨论学习。
我们的文章集在:CodeInventor