在授權成功的頁麵刷新一次就會出報錯
{"errmsg":"code been used, hints: [ req_id: Rwakxa0262th10 ]","errcode":40163}
PHP中文网2017-04-18 10:57:04
這個問題我解決。
大概是這麼一會兒事兒。
微信授權的時候,微信官方讓你用一個引導位址(A.action)去重定向到另外一個位址(B.action),在第二個位址(B.action)中可以取得code,用code換取access_token,refresh_token等。多半情況是第一次能拿到使用者訊息,但第二次刷新的時候,提示errcode":40163,"errmsg":"code been used。說明code被使用過一次了,官方文件說的很清楚,code只能用一次。當然不管你有沒有刷新,只要你是用的code是同一個,而且不是第一次使用就會報上面的錯誤。
我是這麼解決的,在B.action中先去判斷session中是否存在code換取到的access_token和refresh_token等(最好是封裝成實體對象,比較好判斷),如果不存在說明code首次被使用(之前頁面被關閉了),如果存在則去session中直接取得access_token或是refresh_token。用獲得的access_token和refresh_token去獲取用戶資訊。
希望我說的對你有幫助!
PHPz2017-04-18 10:57:04
你授權的處理部分有問題,授權拿到用戶資訊之後就保存到session裡面去
你授權之後沒有保存到session中,導致刷新頁面後,session中沒有用戶信息,但是地址中還帶有code參數,於是就拿著code去拿授權,但是這個code已經用過了,code只能用一次的
天蓬老师2017-04-18 10:57:04
是這樣,OAuth2.0的授權URI指定參數有類似response type,authorization code,state之類的,你調用微信OAuth2.0授權接口,傳入了各種appid appsecret,就是為了獲取authorization code用的,這個code幹嘛的呢,是第三方(也就是你,使用者授權你存取他在微信的資源)用來和OAuth授權伺服器換取AccessToken用的,也就是呼叫我開篇講的授權URI使用的參數,在OAuth2.0規範裡,該URI返回的參數包括AccessToken,RefreshToken等等,有了這個AccessToken,你就可以用它和資源伺服器進行驗證從而拿到用戶資源了,那麼OAuth2.0規定了,為了安全,這個authorization code只能換取一次AccessToken。
那麼微信是怎麼實現的呢,他們的授權介麵包括了response type,redirect uri,state,appid,appsecret等參數,他們的邏輯就是用戶先調用這個授權接口,然後進行授權(或靜默授權),當使用者確定授權後,此時呼叫的仍然是微信授權接口,微信授權伺服器確認授權後,將請求重定向至你設定的redirect uri,並且在這個uri中添加URL參數code及state,這個code就是authorization code,於是你的伺服器就會透過這次重定向收到authorization code,你就可以用這個code去換取AccessToken,進而獲取到用戶在微信的各種資源了(比如open id)。
所以你說為什麼刷新報錯,我嚴重懷疑你刷新的是你自己伺服器的url,然後你的程式碼又取得了一次相同的code,再去兌換,當然就報錯code重複使用了。