微信隐性授权和显性授权的差别总结

这里是我自己的按照微信开发手册做的一些显性和隐性差别的验证,再加上收集一些资料,做了下显性和隐性授权操作的一些汇总,希望帮助人们更加了解下这两种授权方式的的差异.


首先我是利用隐性授权去获取用的信息报错如下(是已认证的服务号

{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}


基础的简要说明

网页授权获取用户基本信息:两种 scope 域

https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=ok#wechat_redirect

snsapi_base 不需要用户点同意,直接跳转到授权后的页面,只能用于获取openid,不能获取用户基本信息

snsapi_userinfo 会征求用户同意,授权后,可以获取用户基本信息,并且,即使在未关注的情况下,只要用户授权,也能获取其信息

 

为了方便大家理解,把接口返回的数据展示下吧  (其中与文档的差异还需要在研究)

我的返回:
"{
    "access_token": "KIxvNL1TNPR1xsGvG8ymZgcvBGIlGS_9ifyUz16_5fnHWGzBYKHImrl5aO9AykLZfVfb1byvcuf-0k7bYA3UomUqOjX_5ekzq2DJVA-M6t8",
    "expires_in": 7200,
    "refresh_token": "oN8nyBhmylyPkfSAJdSCP6O8fsbin1VdfIldykLVnE4A2ah6qqkcctkV5QtW-oD-OD5yGFeg2QtLuh89DWtpQ_9BahCrLDnlxUKyTQPW9ik",
    "openid": "oOjPZv47J1FlrGDZNkXs2xQ1iRpk",
    "scope": "snsapi_base",
    "unionid": "oK6TCvm9ghUbxXbFh5xlvrBg_Utg"(没有关注情况下+满足unionid机制 返回结果  出现这个unionid后面还需要查询原因 因为文档中没有)
}"


文档中给出的返回demo:

{

    "access_token":"YNTxefBAfNW565Q4MAI..................j-hLNzin9Vq6BnvcvJ8NKHdBSRhkLjHQliLiNQc",

    "expires_in":7200,

    "refresh_token":"EYmfmvUg0PGtOWiLpb..................T8O2UyKL95_Da23fLV-nYFDgnt14Ljl_x_zCMY",

    "openid":"oYbGRs8MmU6bESxXcX2Z0rFRivjQ",

    "scope":"snsapi_base"

}

我的返回:

"{
    "access_token": "bN_RnnFLSvUT-PUiJsyr2IcvArIHdF24RCRu8XD8ef7tawgP-ldBt4Wn6Bnub5OXCowtcko37Q-Xv_w11LzMD05QocKQkil7aRYL2C96OKU",
    "expires_in": 7200,
    "refresh_token": "UKgQ3t8tZxjYYeP0bPNSu6AEUJ190QjYpX5S1xLOk2BXJSIppUkb1jyKvb6SbDmR4wm70TVc8s2D2OBFPUmBHE567EnX8a7Pyjm_xYBXZb8",
    "openid": "oOjPZv47J1FlrGDZNkXs2xQ1iRpk",
    "scope": "snsapi_userinfo",
    "unionid": "oK6TCvm9ghUbxXbFh5xlvrBg_Utg"
}"


文档中给出的返回demo:

{

    "access_token":"IdFXvRMq3J6vXUcZ0iQ..................G1xbkGJEnbnSKQ4G0nyQ5vmNSKF4a4DzGu64",

    "expires_in":7200,

    "refresh_token":"J8ot4JWphxwvyAY3I9r..................krET6P-8dot_-_tQfFoLUQI3EI-NT-I-degNRGumA",

    "openid":"oYbGRs8MmU6bESxXcX2Z0rFRivjQ",

    "scope":"snsapi_userinfo"

}


 

问题再现

1  首次使用 scope=snsapi_base 进行网页授权

2  拿到 code 后调用接口 https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code

3  根据上一步获取的 openid 和 access_token 调用接口 https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN 获取用户基本信息

4  获取失败:返回 {"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}

 

失败原因

scope=snsapi_base 时,只能用于获取openid,不能获取用户的基本信息(获取用户信息,需要用户同意。scope=snspai_base 授权时,并没有征求用户同意授权这一操作)

 

问题来了

(有时候成功,有时候失败)

为什么有的时候(或者另外一个公众号),按上面的步骤,能成功获取到用户的基本信息?

“48001,api unauthorized”之所以让很多人迷惑不解,就在于这个问题

 

先直接上解决方式,再说原因

使用 scope=snsapi_userinfo 进行一次网页授权,步骤跟上面【问题再现】一样,成功获取到用户的微信基本信息。

再使用 scope=snsapi_base 重复一遍【问题再现】,这次成功了!!!

 

原因

上面的实验其实已经说明原因了,怕有些人一下子理解不了,所以

第一次使用 scope=snsapi_base,这是不需要经过用户同意的授权,不能获取用户的基本信息

第二次使用 scope=snsapi_userinfo,这是需要用户点击同意的授权,能获取到用户的基本信息

使用 scope=snsapi_userinfo,用户同意授权后,在一定时间内,不需要用户的同意,也可以获取用户基本信息(此时使用 scope=snsapi_base 也能获取到用户基本信息:甚至参数openid的值随便填都没关系,可以是空格,但不能为空)

 

注意

使用 scope=snsapi_userinfo,用户同意授权后,access_token 的有效期是7200秒(两小时)。

access_token 失效后,可以使用 refresh_token 调用接口 https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1} 重新获取 access_token(有效期7200秒)

(终于知道 refresh_token 是干嘛用的了吧)

refresh_token 的有效期是30天,即用户同意授权后,在30天内,不再需要用户同意授权,就可以获取用户基本信息


本文章后续还会在更新哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值