V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
annielong
V2EX  ›  微信

微信公众号获取用户 openid 出现重复,可能是哪方面的原因呢?

  •  
  •   annielong · 2018-05-29 10:23:55 +08:00 · 5114 次点击
    这是一个创建于 2130 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个客户声称,访问公众号经常出现他人的信息,经过调试,发现确认获取到的 openid 是其它客户的,现在专门制作了一个官方的例子进行测试,先获取 code,再通过 code 换取网页授权 access-token,只取第二步中的 openid,所有参数都是直接写到页面中,信息直接获取,没有缓存,但是 bug 依然偶尔出现,获取到其它客户的 openid,

    13 条回复    2018-05-29 16:47:33 +08:00
    odirus
        1
    odirus  
       2018-05-29 10:36:59 +08:00   ❤️ 1
    现在微信已经有切换账号功能了,如果网页是通过 cookie 鉴权的话,用户切换账号之后,页面依然认为是前面一个账号在浏览页面(微信不会清理 cookie ),通过公众号支付方式下单的话,就 gg 了。

    这个功能略坑,看会不会引起你们的问题。
    oh
        2
    oh  
       2018-05-29 11:35:25 +08:00 via iPhone
    @odirus 还有这种操作 感谢提醒
    yikyo
        3
    yikyo  
       2018-05-29 11:40:31 +08:00
    有没有可能把 code 或者 openid 通过 url 分享给别的用户了??
    yimity
        4
    yimity  
       2018-05-29 11:58:51 +08:00
    @odirus 切换账号微信有退出登录的过程,而这个过程,微信是会清理掉缓存和 cookie 以及 localStorage 的。
    odirus
        5
    odirus  
       2018-05-29 12:12:15 +08:00
    @yimity #4

    至于官方会不会清除我不知道,但从我们线上产生的 BUG 来看,很多设备都有这个问题。
    odirus
        6
    odirus  
       2018-05-29 12:14:15 +08:00
    @oh #2 解决方案如下:

    用户在通过 “公众号支付” 时,后端服务器会求请求微信支付的统一下单接口,只要拦截到 “ openid 与 用户微信不匹配” 的错误时,服务端主动清理用户的 cookie,并重定向到授权页面。
    odirus
        7
    odirus  
       2018-05-29 12:25:09 +08:00   ❤️ 1
    @odirus #6 哦,不对,我这个方案不具有可操作性,所以请忽略我这句话。


    原因如下:
    用户切换账号之后,在网页上发起支付操作,服务端根据 cookie 找出对应的 userId,再找到对应的 openid,服务端是能够创建订单成功的,然后返回一些支付参数给网页端。

    网页端的支付 SDK 检测到预创建订单中的 openid 与用户微信号不一致时,会弹出警告框 “ openid 与用户微信不匹配”,服务端此时也无能为力。
    annielong
        8
    annielong  
    OP
       2018-05-29 13:45:02 +08:00
    @odirus 应该不是 cookie 的问题吧,为了避免可能缓存的原因,测试用的代码都没写入缓存,连 openid 都是放 url 里面直接返回调用页面,测试版本打开首页后,直接在 url 判断有没有 openid,没有 openid 就跳转 getcode 页面,然后在 redirect_uri 页面获得 openid,直接把 openid 放到 url 里面,最后跳转,但是偶尔 url 确实收到了其它人的 openid,唯一确定的是出问题的大多都是局域网用户,莫非微信在处理多人同时获取 openid 时候,redirect_uri 接收到多个 code,造成转发错误吗?
    odirus
        9
    odirus  
       2018-05-29 14:05:18 +08:00
    @annielong #8

    你把所有流程的详细日志都记录下来,包括用户请求地址(参数、header、cookie ),返回内容;服务端向微信服务器的请求、返回数据;服务端在相应阶段执行的 SQL 等。

    当出现问题的时候,就能够根据这些日志找到问题的根源。

    ------------------------------------------------------

    以前我们也会在某个问题上出现争议,但其实一切都可以用实锤来说话的。
    odirus
        10
    odirus  
       2018-05-29 14:06:49 +08:00
    如果是 Java 的话,日志 MDC 了解一下,用户的每一次请求,所涉及到的详细操作记录都能够记录下来。再出现问题,解决起来就很方便了。
    annielong
        11
    annielong  
    OP
       2018-05-29 14:15:41 +08:00
    @odirus 纠结,按目前流程记录下来的日志都是一样的,在没有获取 openid 前没法区分到底是谁访问的,获取到了 openid,也不确定是不是重复的 openid,这个问题出现的频率还不大,重现都不好重新,准备多做几个页面,进行测试
    odirus
        12
    odirus  
       2018-05-29 14:20:42 +08:00
    @annielong #11

    那你还是为每位用户的 cookie 中添加一个设备标识,当你怀疑哪个 openid 重复的时候,分别找出对应的两次微信回调请求日志,根据这两次请求中的 cookie 判断是不是同一个人( IP 的话不是很准,特别现在大家都用手机,但可以参考是不是同一个人或者同一个局域网)
    fakeJas0n
        13
    fakeJas0n  
       2018-05-29 16:47:33 +08:00
    进入后每次都重新授权怎么样?只在登录或首页发起授权
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1010 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:56 · PVG 03:56 · LAX 12:56 · JFK 15:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.