素材牛VIP会员
微信开发网页授权
 陈***子  分类:Java代码  人气:929  回帖:8  发布于6年前 收藏

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

 标签:java

讨论这个帖子(8)垃圾回帖将一律封号处理……

Lv2 入门
13***22 JAVA开发工程师 6年前#1

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

Lv5 码农
lu***ha 软件测试工程师 6年前#2

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

Lv4 码徒
阿***阿 产品经理 6年前#3

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

Lv2 入门
阿***逗 移动开发工程师 6年前#4

@route('/idtest')
def idtest():

url = "http://xxxxxxx/auth"
redirUrl=WeixinLogin().authorize(url)
# TODO:缓存code
parse = []
values = redirUrl.split('?')[-1]
for key in values.split('&'):
    parse.append(key.split('='))
print parse[0][1]
# response.set_cookie('code',parse[0][1])
return redirect(redirUrl)

@route('/auth')
def auth():

# 获取当前路由的/auth
fullpath = request.fullpath
# print "fullpath:"+fullpath
# TODO:判断code是否存在,在则直接获取数据,否则就获取code
# if request.get_cookie("code"):
#     return "success"
url = request.url
print url
parselist = []
values = url.split('?')[-1]
for key_value in values.split('&'):
    parselist.append(key_value.split('='))
print parselist[0][1]
code = parselist[0][1]
# response.set_cookie('code',code)
data = WeixinLogin().access_token(code)
print data
# openid = data
print code
# expires = datetime.now()+timedelta(days=1)
# resp = response.set_cookie("openid",openid)

# 获取用户ip,request.get('REMOTE_ADDR)
# ip = request.environ.get('REMOTE_ADDR')
return code
Lv4 码徒
ma***kk 交互设计师 6年前#5

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

Lv7 码师
ya***cn 移动开发工程师 6年前#6

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

Lv3 码奴
郑***y 其它 6年前#7

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

Lv7 码师
yu***01 产品经理 6年前#8

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取