公眾號網頁開發時,什麼是靜默授權,什麼是非靜默授權?究竟應該選擇哪一個?在使用者體驗和功能上有什麼區別?
網頁授權流程:
使用者訪問 /question/commit.html
後端判斷如果使用者未登入,則拼接引數跳轉至微信授權頁面,獲取授權 code
$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 協議》,轉載必須註明作者和本文連結