java - 微信开发网页授权
伊谢尔伦
伊谢尔伦 2017-04-18 10:55:04
0
7
1334

在授权成功的页面刷新一次就会出报错
{"errmsg":"code been used, hints: [ req_id: Rwakxa0262th10 ]","errcode":40163}

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

Antworte allen(7)
Ty80

这个问题我解决。
大概是这么一会儿事儿。
微信授权的时候,微信官方让你用一个引导地址(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去获取用户信息。
希望我说的对你有帮助!

Ty80

提示很清楚code已经被使用了,code只能被使用一次。

PHPzhong

你授权的处理部分有问题,授权拿到用户信息之后就保存到session里面去
你授权之后没有保存到session中,导致刷新页面后,session中没有用户信息,但是地址中还带有code参数,于是就拿着code去拿授权,但是这个code已经用过了,code只能用一次的

Peter_Zhu

是这样,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重复使用了。

阿神

关注一下,是否连续进行了两次请求(使用同样code换取用户信息),导致第二次使用该code出现该错误

左手右手慢动作

你点过微信支付了吗,那个 支付 按钮只能点一次,调起来支付后,如果取消支付,再去点击 支付,就报错了,只能退出当前页面,重新进!

洪涛

楼主解决 了吗,我也遇到同样的问题了 ?

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!