搜索

首页  >  问答  >  正文

java - 微信开发网页授权

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

伊谢尔伦伊谢尔伦2802 天前1381

全部回复(7)我来回复

  • PHP中文网

    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去获取用户信息。
    希望我说的对你有帮助!

    回复
    0
  • PHP中文网

    PHP中文网2017-04-18 10:57:04

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

    回复
    0
  • PHPz

    PHPz2017-04-18 10:57:04

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

    回复
    0
  • 天蓬老师

    天蓬老师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重复使用了。

    回复
    0
  • 阿神

    阿神2017-04-18 10:57:04

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

    回复
    0
  • ringa_lee

    ringa_lee2017-04-18 10:57:04

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

    回复
    0
  • PHP中文网

    PHP中文网2017-04-18 10:57:04

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

    回复
    0
  • 取消回复