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

2018-05-29 10:23:55 +08:00
 annielong

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

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

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

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

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


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

网页端的支付 SDK 检测到预创建订单中的 openid 与用户微信号不一致时,会弹出警告框 “ openid 与用户微信不匹配”,服务端此时也无能为力。
annielong
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
2018-05-29 14:05:18 +08:00
@annielong #8

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

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

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

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

那你还是为每位用户的 cookie 中添加一个设备标识,当你怀疑哪个 openid 重复的时候,分别找出对应的两次微信回调请求日志,根据这两次请求中的 cookie 判断是不是同一个人( IP 的话不是很准,特别现在大家都用手机,但可以参考是不是同一个人或者同一个局域网)
fakeJas0n
2018-05-29 16:47:33 +08:00
进入后每次都重新授权怎么样?只在登录或首页发起授权

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/458569

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX