1. 程式人生 > >OAuth2.0微信code獲取失敗怎麼辦

OAuth2.0微信code獲取失敗怎麼辦

公司的微信專案一直遇到一個openid獲取不到的問題,今天仔細追蹤了一下原因,發現原來是code沒有獲取到,導致了一些列問題,code作為微信OAuth2.0授權獲取使用者資訊的根源,看下官方描述:

具體而言,網頁授權流程分為四步:

1、引導使用者進入授權頁面同意授權,獲取code
2、通過code換取網頁授權access_token(與基礎支援中的access_token不同)
3、如果需要,開發者可以重新整理網頁授權access_token,避免過期
4、通過網頁授權access_token和openid獲取使用者基本資訊(支援UnionID機制)

只要看前兩個就知道了,作為新開發都知道access_token的作用,我不多說。

關於網頁授權的兩種scope的區別說明

1、以snsapi_base為scope發起的網頁授權,是用來獲取進入頁面的使用者的openid的,並且是靜默授權並自動跳轉到回撥頁的。使用者感知的就是直接進入了回撥頁(往往是業務頁面)
2、以snsapi_userinfo為scope發起的網頁授權,是用來獲取使用者的基本資訊的。但這種授權需要使用者手動同意,並且由於使用者同意過,所以無須關注,就可在授權後獲取該使用者的基本資訊。
3、使用者管理類介面中的“獲取使用者基本資訊介面”,是在使用者和公眾號產生訊息互動或關注後事件推送後,才能根據使用者OpenID來獲取使用者基本資訊。這個介面,包括其他微信介面,都是需要該使用者(即openid)關注了公眾號後,才能呼叫成功的。

關於特殊場景下的靜默授權

1、上面已經提到,對於以snsapi_base為scope的網頁授權,就靜默授權的,使用者無感知;
2、對於已關注公眾號的使用者,如果使用者從公眾號的會話或者自定義選單進入本公眾號的網頁授權頁,即使是scope為snsapi_userinfo,也是靜默授權,使用者無感知。
Scope為snsapi_userinfo

尤其注意:跳轉回調redirect_uri,應當使用https連結來確保授權code的安全性。

引數說明

引數 是否必須 說明
appid 公眾號的唯一標識
redirect_uri 授權後重定向的回撥連結地址,請使用urlencode對連結進行處理
response_type 返回型別,請填寫code
scope 應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取使用者openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到暱稱、性別、所在地。並且,即使在未關注的情況下,只要使用者授權,也能獲取其資訊
state 重定向後會帶上state引數,開發者可以填寫a-zA-Z0-9的引數值,最多128位元組
#wechat_redirect 無論直接開啟還是做頁面302重定向時候,必須帶此引數

看完文件就知道了,1、使用者拒絕了授權,2、微信內部錯誤,第二種情況應該是極少出現所以一般都不考慮,那使用者拒絕授權了怎麼辦,我們再來看看官方文件:

下圖為scope等於snsapi_userinfo時的授權頁面:

網頁授權

使用者同意授權後

如果使用者同意授權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。若使用者禁止授權,則重定向後不會帶上code引數,僅會帶上state引數redirect_uri?state=STATE

code說明 :
code作為換取access_token的票據,每次使用者授權帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動過期。

這麼一來就簡單了,使用者都已經拒絕授權了。好,使用者你可以滾出我的世界了,比如python+flask就可以這麼做:

首先假如你的state設定為state=1

code = request.values.get('code')
state = request.values.get('state')
if code is None and state == '1':
	return render_template('angelababy_out.html') #一個授權失敗的頁面,或者你也可以做別的操作嘛
至此,這個bug就解決了。