微信公众号获取用户 openid 出现重复,可能是哪方面的原因呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
annielong
V2EX    微信

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

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

    有一个客户声称,访问公众号经常出现他人的信息,经过调试,发现确认获取到的 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     Solana     925 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 21:41 PVG 05:41 LAX 13:41 JFK 16:41
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86