关于微信公众号静默授权和非静默授权的区别
公众号网页开发时,什么是静默授权,什么是非静默授权?究竟应该选择哪一个?在用户体验和功能上有什么区别?
网页授权流程:
用户访问 /question/commit.html
后端判断如果用户未登录,则拼接参数跳转至微信授权页面,获取授权 code
重点是开发者设置
scope
的参数来决定用哪种授权$url = 'https://open.weixin.qq.com/connect/oauth2/authorize? appid=appid &redirect_uri=https%3A%2F%2Fabc.com%2Fquestion%2Fcommit.html &response_type=code &scope=snsapi_base(静默)| snsapi_userinfo(非静默) &state=STATE#wechat_redirect'; redirect($url);
用户授权,页面跳回
/question/commit.html
并携带授权 code
静默授权用户无感知,非静默授权页面弹出授权提示,
但对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知。/question/commit.html?code=003tgd100Od6YM22cu3d3BAVEo1tgd1r&state=STATE
后端得到 code,api 获取授权 access_token
curl https://api.weixin.qq.com/sns/oauth2/access_token?appid=appid &secret=secret &code=$GET['code'] &grant_type=authorization_code
result:
{//静默授权 "access_token":"52_..-OaS8-1A", "expires_in":7200, "refresh_token":"52_Cb..hmw", "openid":"o-qe..DDA", "scope":"snsapi_base" }
{//非静默授权 "access_token":"52_AV4..LH9A", "expires_in":7200, "refresh_token":"52_h_t..mnlA", "openid":"o-qe..DDA", "scope":"snsapi_userinfo", "unionid":"ocJQ..AU8" }
如果网页授权的作用域为 snsapi_base,则本步骤中获取到网页授权 access_token 的同时,也获取到了 openid,snsapi_base 式的网页授权流程即到此为止。
也就是说静默授权到此已经结束,只能获得基本的 openid,所以叫
snsapi_base
,而非静默授权的才叫snsapi_userinfo
(获取用户信息)。静默授权想进一步获取用户信息有个前提,是用户和公众号产生消息交互后,通俗点解释就是关注了,那么获得的 openid 直接去查数据库,或利用 获取用户基本信息 来获取用户信息,非关注状态调用此接口只返回openid。
所以如果用户没有关注公众号,而网页使用了静默授权,自然用户信息只能获得最基本的 openid。
总结:
- 静默授权用户无感知,只能获得用户基本信息即openid,因此叫 snsapi_base。
- 非静默授权用户手动同意授权,可通过openid和网页授权access_token调用api去获得用户信息。但对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知。
- 静默授权想进一步获取用户信息,前提是数据库里存在,或者关注了公众号通过获取用户基本信息 接口来获取(需要是关注状态)。
- 非静默授权不需要关注公众号就可以获得用户信息。
- 微信官方最新调整,获取用户基本信息 2021.12.27日将不再返回头像、昵称,所以如果需要头像、昵称信息,网页授权只能采用非静默授权。
- 综上,如果用户未关注公众号,静默授权只能获得openid,如果需要用户资料,需使用非静默授权。其他情况,建议用非静默授权。
本作品采用《CC 协议》,转载必须注明作者和本文链接
微信官方最新调整,获取用户基本信息 2021.12.27 日将不再返回头像、昵称,
所以如果需要头像、昵称信息,网页授权只能采用非静默授权,即用户手动同意授权。
这个结论好像有误???我理解的意思是出于隐私保护合规,后面接口都不返回用户头像和昵称了。。