微信公众号开发 (4) 网页受权

1、前言

  1. 微信公众号开发 (1) 微信接入认证成为开发者
  2. 微信公众号开发 (2) 消息处理
  3. 微信公众号开发 (3) 菜单处理
本文将实现
  1. 网页受权
  2. 获取用户基本信息
网页受权流程
  1. 填写网页受权回调域名
  2. 引导用户进入受权页面赞成受权获取code
  3. 经过code`换取网页受权access_tokenopenid`(注:与基础支持中的access_token不一样)
  4. 刷新网页受权access_token,避免过时(可选择性操做)
  5. 经过网页受权access_token和openid获取用户基本信息(支持UnionID机制)

2、填写网页受权回调域名

测试号在以下地址中,体验接口权限表->网页账号->修改http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/indexhtml

在这里插入图片描述注:勿加http://等协议头!在这里插入图片描述java

3、受权相关接口

舒适小提示:接口相关参数说明可直接查看微信官方文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
一、用户受权页面
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
二、经过code换取网页受权access_tokenopenid
【GET请求】https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
三、刷新access_token(若是须要)
【GET请求】https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
四、获取用户信息(需scope为snsapi_userinfo)
【GET请求】https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
五、检验受权凭证(access_token)是否有效
【GET请求】https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID

注:下面部分只贴出了重要代码部分,完整案例可参考文末提供的源码


4、引导用户进入受权页面赞成受权 -> 获取code

方式①:经过建立连接式菜单(view)

在这里插入图片描述在这里插入图片描述

方式②:直接发送受权url消息,用户点击进入受权
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx62d91f5c16d6e8e0&redirect_uri=http://m9adhq.natappfree.cc/api/weixin/basic/getOpenId&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

在这里插入图片描述受权相关的几个api接口以下:在这里插入图片描述git

5、经过code换取网页受权access_tokenopenid(与基础支持中的access_token不一样)

用户赞成受权后,页面将跳转至redirect_uri/?code=CODE&state=STATEweb

code说明 : code做为换取access_token的票据,每次用户受权带上的code将不同,code只能使用一次,5分钟未被使用自动过时。

注:小编这里拿到access_tokenopenid以后将页面重定向到了获取用户信息的接口,而后返回json用户信息数据~json

public void getOpenId(HttpServletRequest request, HttpServletResponse response) {
    String code = request.getParameter("code");
    String state = request.getParameter("state");

    log.debug("======================================= \n code值:" + code);

    String responseContent = restTemplate.getForObject(Constants.AUTH_GET_ACCESS_TOKEN_AND_OPENID
            .replace("APPID", Constants.APP_ID)
            .replace("SECRET", Constants.APP_SECRET)
            .replace("CODE", code), String.class);
    JSONObject result = JSON.parseObject(responseContent);
    String accessToken = result.getString("access_token");
    String openid = result.getString("openid");
    String refreshToken = result.getString("refresh_token");

    log.debug("======================================= \n access_token值:" + accessToken + "\n  openid值:" + openid);

    String redirectUrl = "http://m9adhq.natappfree.cc/api/weixin/basic/getUserInfo?openid=" + openid + "&access_token=" + accessToken;
    try {
        // 受权以后重定向到指定URL(这里是跳转到获取用户基本信息接口)
        response.sendRedirect(redirectUrl);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

6、获取微信用户基本信息

public WeixinUserInfoVO getUserInfo(String openId, String accessToken) {
    WeixinUserInfoVO weixinUserInfoVO = null;
    String responseContent = restTemplate.getForObject(Constants.AUTH_GET_USER_INFO
            .replace("ACCESS_TOKEN", accessToken)
            .replace("OPENID", openId), String.class);
    weixinUserInfoVO = JSON.parseObject(responseContent, WeixinUserInfoVO.class);
    return weixinUserInfoVO;
}

其中WeixinUserInfoVO基本信息类api

@Data
@ApiModel(description = "微信用户基本信息")
public class WeixinUserInfoVO {

    @ApiModelProperty(value = "用户的惟一标识")
    private String openid;

    @ApiModelProperty(value = "用户昵称")
    private String nickname;

    @ApiModelProperty(value = "用户的性别,值为1时是男性,值为2时是女性,值为0时是未知")
    private Integer sex;

    @ApiModelProperty(value = "用户我的资料填写的省份")
    private String province;

    @ApiModelProperty(value = "普通用户我的资料填写的城市")
    private String city;

    @ApiModelProperty(value = "国家,如中国为CN")
    private String country;

    @ApiModelProperty(value = "用户头像,最后一个数值表明正方形头像大小(有0、4六、6四、9六、132数值可选,0表明640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。")
    private String headimgurl;

    @ApiModelProperty(value = "用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)")
    private String privilege;

    @ApiModelProperty(value = "只有在用户将公众号绑定到微信开放平台账号后,才会出现该字段。")
    private String unionid;

    @ApiModelProperty(value = "返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语")
    private String language;

}

响应数据以下:在这里插入图片描述数组

这里获取到用户信息以后,也就能够写页面,而后进行本身的业务交互了... (openid:微信用户的惟一标识)微信

7、刷新access_token(若是须要)

因为access_token拥有较短的有效期,当access_token超时后,可使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效以后,须要用户从新受权。微信开发

public String refreshAccessToken(String appId, String refreshToken) {
    String responseResult = restTemplate.getForObject(Constants.AUTH_REFRESH_ACCESS_TOKEN
            .replace("APPID", appId)
            .replace("REFRESH_TOKEN", refreshToken), String.class);
    JSONObject jsonObject = JSON.parseObject(responseResult);
    return jsonObject.getString("access_token");
}

8、检验受权凭证(access_token)是否有效

public WeixinResponseResult checkAccessToken(String openId, String accessToken) {
     String responseResult = restTemplate.getForObject(Constants.AUTH_CHECK_ACCESS_TOKEN
             .replace("ACCESS_TOKEN", accessToken)
             .replace("OPENID", openId), String.class);
     WeixinResponseResult weixinResponseResult = JSON.parseObject(responseResult, WeixinResponseResult.class);
     if (weixinResponseResult.getErrcode() != 0) {
         log.error("受权凭证无效:" + responseResult);
         throw new MyException(weixinResponseResult.getErrcode(), weixinResponseResult.getErrmsg());
     }
     return weixinResponseResult;
 }

9、总结

  1. 微信公众号开发网上有不少教程,但针对于每个开发者的环境以及语言不一样而有所差别,建议认真看微信提供的官方文档去学习,大体也就是查看文档`封装数据调微信api接口业务处理`
  2. 关于微信公众号开发小编也已经写了几篇了,你们在学习完微信官方提供的原始api以后,GitHub以及Gitee等上面有不少大神已经封装好了优秀的开源sdk,这时候咱们有了必定的微信开发基础就能够去阅读参考学习
  3. 小编建议你们在学习遇到问题,查看别人如何实现以及解决问题的时候,更多的是去学习思惟方式处理逻辑,而不是拿到就跑,虽然写代码也不过就是复制黏贴运行完无bug就万事大吉,但咱们也要 知其然知其因此然 !

本文案例demo源码

https://gitee.com/zhengqingya/java-workspaceapp

相关文章
相关标签/搜索