授权获取用户信息

    什么是 OAuth2.0

    微信公众平台OAuth2.0授权详细步骤

    请参考之前写的文章 此篇文章已有 2.6 w+ 的阅读量

    授权用户信息的一些说明

    关于网页授权的两种scope的区别说明

    1、以 snsapi_base 为 scope 发起的网页授权,是用来获取进入页面的用户的 openid 的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)

    2、以 snsapi_userinfo 为 scope 发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

    3、 类接口中的 获取用户基本信息接口,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户 openid 来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

    关于特殊场景下的静默授权

    1、上面已经提到,对于以snsapi_base为scope的网页授权,就静默授权的,用户无感知;

    2、对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知。

    具体而言,网页授权流程分为四步:

    2、通过 code 换取网页授权 access_token(与基础支持中的access_token不同)

    3、如果需要,开发者可以刷新网页授权 access_token,避免过期

    4、通过网页授权 access_token 和 openid 获取用户基本信息(支持UnionID机制)

    用户同意授权,获取code

    引导关注者打开如下授权的页面URL:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

    若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。

    尤其注意:

    • 由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问
    • 跳转回调redirect_uri,应当使用https链接来确保授权code的安全性且必须有在MP配置回调页面的域名。

    如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。

    特别注意 : code作为换取 access_token 的票据,每次用户授权带上的 code 将不一样,code 只能使用一次,5分钟未被使用自动过期。

    刷新access_token(如果需要)

    拉取用户信息(需scope为 snsapi_userinfo)

    检验授权凭证(access_token)是否有效

    TNWX 实现方案

    TNWX 示例

    访问:http/

    回调:http/https://域名/auth

    1. app.get('/toAuth', (req, res) => {
    2. let url = SnsAccessTokenApi.getAuthorizeUrl("http://xxx/auth", ScopeEnum.SNSAPI_USERINFO, "IJPay");
    3. console.log("授权URL:", url);
    4. });
    5. // 授权回调
    6. app.get('/auth', (req, res) => {
    7. let code = req.query.code;
    8. let state = req.query.state;
    9. console.log("code:", code, " state:", state);
    10. SnsAccessTokenApi.getSnsAccessToken(code).then(data => {
    11. // 判断 access_token 是否获取成功
    12. if (temp.errcode) {
    13. // access_token 获取失败
    14. res.send(temp);
    15. return;
    16. }
    17. let openid = temp.openid;
    18. let scope = temp.scope;
    19. if (scope == ScopeEnum.SNSAPI_USERINFO) {
    20. // 获取用户信息
    21. SnsAccessTokenApi.getUserInfo(access_token, openid, Lang.ZH_CN).then(data => {
    22. });
    23. } else {
    24. res.send(temp);
    25. }
    26. })
    27. });

    1、请在微信客户端中打开

    授权获取用户信息必须在微信客户端中打开或者使用微信提供的 微信开发者工具

    2、redirect_url 参数错误

    请检查appId对应的公众平台中设置的授权域名是否与你项目中配置的域名保持一致

    测试号测试授权是必须先关注的测试的号,官方这做是为了安全。正式环境微信认证的服务号是不用关注就可以获取用户的信息。

    开源推荐