微信隱性授權和顯性授權的差別總結

這裏是我自己的按照微信開發手冊做的一些顯性和隱性差別的驗證,再加上收集一些資料,做了下顯性和隱性授權操作的一些彙總,希望幫助人們更加了解下這兩種授權方式的的差異.


首先我是利用隱性授權去獲取用的信息報錯如下(是已認證的服務號

{"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天內,不再需要用戶同意授權,就可以獲取用戶基本信息


本文章後續還會在更新哦~

發佈了41 篇原創文章 · 獲贊 98 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章