有個問題要記錄一下,就是微信授權登錄之后重復回調的問題。
微信授權的流程是這樣:
1.用戶在微信里打開鏈接A,微信就會攜帶code和state訪問A中的重定向鏈接B。
(用戶的微信客戶端-->微信)
鏈接A如下:
https://open.weixin.qq.com/connect/oauth2/authorize?
appid=APPID
&redirect_uri=REDIRECT_URI
&response_type=code
&scope=snsapi_userinfo? ? ? ? ? ?
&state=STATE#wechat_redirect*
REDIRECT_URI就是鏈接B
2.微信重定向訪問到你的回調網(wǎng)址
(微信-->網(wǎng)站)
REDIRECT_URI?code=CODE&state=STATE
CODE和STATE都是微信服務器生成的參數(shù)。用戶點擊同意授權、繼續(xù)訪問,微信服務器就會訪問你這個URI(鏈接B)了。
3. 網(wǎng)站收到請求,就拿到CODE了,于是用CODE去拿ACCESS_TOKEN
(網(wǎng)站服務器-->微信)
https://api.weixin.qq.com/sns/oauth2/access_token?
appid=APPID
&secret=SECRET
&code=CODE
&grant_type=authorization_code
接收到一個access_token和openid
4. 網(wǎng)站拿到access_token和openid就可以向微信請求用戶數(shù)據(jù)了
(網(wǎng)站-->微信)
https://api.weixin.qq.com/sns/userinfo?
access_token=ACCESS_TOKEN
&openid=OPENID
lang=zh_CN
接收一個含有用戶信息的json。
問題:
問題就在第一步,不知道為啥第二步,點擊“繼續(xù)訪問”繼續(xù)訪問之后,微信重復地訪問鏈接B。
我一開始不知道它會重復訪問,設計的是,鏈接B收到請求之后就去拿著code請求access_token和openid,然后拿著access_token和openid去請求userinfo,拿到userinfo之后渲染頁面。
Code在五分鐘內只能被使用一次。
所以一旦重復使用code,后面幾次都是獲取不到東西的。
找到這個bug花了我很久……
解決方案:
每收到一個code,就看看是否已經(jīng)用過。
如果沒有用過,就把它跟userinfo組成鍵值對,也就是code:userinfo,再把這個對存進一個變量里。
如果用過,直接從鍵值對中取出userinfo,不再訪問微信獲取access_token。
完美~
官方文檔:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842