V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
工单节点使用指南
• 请用平和的语言准确描述你所遇到的问题
• 厂商的技术支持和你一样也是有喜怒哀乐的普通人类,尊重是相互的
• 如果是关于 V2EX 本身的问题反馈,请使用 反馈 节点
Godykc
V2EX  ›  全球工单系统

微信网页授权的神奇 bug——要手动加延迟才能调通?

  •  
  •   Godykc · 2022-06-23 10:47:10 +08:00 · 1302 次点击
    这是一个创建于 915 天前的主题,其中的信息可能已经有所发展或是发生改变。

    background

    • 微信网页授权的官方文档 ==> 我是链接
    • 40029 代表微信网页授权授权码 code 不对
    • 40163 代表微信网页授权授权码 code 已使用

    案发现场

    这周开始联调本已跑通的某个微信小程序业务,遇到一个神奇的 bug ,网页授权的第二步,通过 code 换取网页授权 access_token一直报 40029 的错,关键还这个错在几个有小程序开发者身份的账号下不会出现。

    对于这个错误本身,微信并没有给很具体的说明,仅仅提示 invalid code ,综合网上的说法,可能的原因有以下

    • 第一步中生成 code 所使用的 appid 和第二步中的 appid 不是同一个
    • 第一步获取到的授权码 code 本身就是错的

    排查思路

    第一种可能很好排查,双方打日志联调确认下就行,并且如果有问题的话,应该是所有请求都失败,不可能出现部分账号能走通的情况,因此排除嫌疑

    第二种可能通过把回调链接改掉,不往正确的回调地址打,这样就能截获未消费的授权码 code,手动用这个未消费的 code 调第二步微信接口,是能正常返回的 并且,笔者观察到,线上日志中大量最终返回 40029 的调用记录中的 code ,再次手动发起请求,这时候报 40163 code been used ,与此同时,随便乱打一个 code 调第二步接口,就一直是 40029 ,并不会过渡到 40163

    因此可以断定,日志中大量报 40029 的 code ,在调用之前,都是有效的,猜想:而微信那边存在某种延迟,在处理时直接报 40029 ,然后再次调用,就报 40163

    验证猜想

    既然怀疑是微信那边的延迟,那就很简单了,笔者这边也加延迟,直接延迟 5s ,果然,这时候第二步接口就正常调通

    结尾

    虽然找到了直接原因,但这个并不能作为解决方案,
    试想一下,好好地函数调用里加一个线程 sleep ,谁能接受?
    并且,笔者所维护的微信产品还有好几个,其他公众号的网页授权就完全没这个问题,
    网上找了一圈,也没找到和笔者相似的案例,于是来此发帖

    1 条回复    2022-06-23 11:37:56 +08:00
    hm20062006ok
        1
    hm20062006ok  
       2022-06-23 11:37:56 +08:00
    你的 code 怎么来的?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4766 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:38 · PVG 13:38 · LAX 21:38 · JFK 00:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.