有个问题要记录一下,就是微信授权登录之后重复回调的问题。
微信授权的流程是这样:
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.微信重定向访问到你的回调网址
(微信-->网站)
REDIRECT_URI?code=CODE&state=STATE
CODE和STATE都是微信服务器生成的参数。用户点击同意授权、继续访问,微信服务器就会访问你这个URI(链接B)了。
3. 网站收到请求,就拿到CODE了,于是用CODE去拿ACCESS_TOKEN
(网站服务器-->微信)
https://api.weixin.qq.com/sns/oauth2/access_token?
appid=APPID
&secret=SECRET
&code=CODE
&grant_type=authorization_code
接收到一个access_token和openid
4. 网站拿到access_token和openid就可以向微信请求用户数据了
(网站-->微信)
https://api.weixin.qq.com/sns/userinfo?
access_token=ACCESS_TOKEN
&openid=OPENID
lang=zh_CN
接收一个含有用户信息的json。
问题:
问题就在第一步,不知道为啥第二步,点击“继续访问”继续访问之后,微信重复地访问链接B。
我一开始不知道它会重复访问,设计的是,链接B收到请求之后就去拿着code请求access_token和openid,然后拿着access_token和openid去请求userinfo,拿到userinfo之后渲染页面。
Code在五分钟内只能被使用一次。
所以一旦重复使用code,后面几次都是获取不到东西的。
找到这个bug花了我很久……
解决方案:
每收到一个code,就看看是否已经用过。
如果没有用过,就把它跟userinfo组成键值对,也就是code:userinfo,再把这个对存进一个变量里。
如果用过,直接从键值对中取出userinfo,不再访问微信获取access_token。
完美~
官方文档:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842