有一个客户声称,访问公众号经常出现他人的信息,经过调试,发现确认获取到的 openid 是其它客户的,现在专门制作了一个官方的例子进行测试,先获取 code,再通过 code 换取网页授权 access-token,只取第二步中的 openid,所有参数都是直接写到页面中,信息直接获取,没有缓存,但是 bug 依然偶尔出现,获取到其它客户的 openid,
1
odirus 2018-05-29 10:36:59 +08:00 1
现在微信已经有切换账号功能了,如果网页是通过 cookie 鉴权的话,用户切换账号之后,页面依然认为是前面一个账号在浏览页面(微信不会清理 cookie ),通过公众号支付方式下单的话,就 gg 了。
这个功能略坑,看会不会引起你们的问题。 |
3
yikyo 2018-05-29 11:40:31 +08:00
有没有可能把 code 或者 openid 通过 url 分享给别的用户了??
|
4
yimity 2018-05-29 11:58:51 +08:00
@odirus 切换账号微信有退出登录的过程,而这个过程,微信是会清理掉缓存和 cookie 以及 localStorage 的。
|
6
odirus 2018-05-29 12:14:15 +08:00
@oh #2 解决方案如下:
用户在通过 “公众号支付” 时,后端服务器会求请求微信支付的统一下单接口,只要拦截到 “ openid 与 用户微信不匹配” 的错误时,服务端主动清理用户的 cookie,并重定向到授权页面。 |
7
odirus 2018-05-29 12:25:09 +08:00 1
@odirus #6 哦,不对,我这个方案不具有可操作性,所以请忽略我这句话。
原因如下: 用户切换账号之后,在网页上发起支付操作,服务端根据 cookie 找出对应的 userId,再找到对应的 openid,服务端是能够创建订单成功的,然后返回一些支付参数给网页端。 网页端的支付 SDK 检测到预创建订单中的 openid 与用户微信号不一致时,会弹出警告框 “ openid 与用户微信不匹配”,服务端此时也无能为力。 |
8
annielong OP @odirus 应该不是 cookie 的问题吧,为了避免可能缓存的原因,测试用的代码都没写入缓存,连 openid 都是放 url 里面直接返回调用页面,测试版本打开首页后,直接在 url 判断有没有 openid,没有 openid 就跳转 getcode 页面,然后在 redirect_uri 页面获得 openid,直接把 openid 放到 url 里面,最后跳转,但是偶尔 url 确实收到了其它人的 openid,唯一确定的是出问题的大多都是局域网用户,莫非微信在处理多人同时获取 openid 时候,redirect_uri 接收到多个 code,造成转发错误吗?
|
9
odirus 2018-05-29 14:05:18 +08:00
@annielong #8
你把所有流程的详细日志都记录下来,包括用户请求地址(参数、header、cookie ),返回内容;服务端向微信服务器的请求、返回数据;服务端在相应阶段执行的 SQL 等。 当出现问题的时候,就能够根据这些日志找到问题的根源。 ------------------------------------------------------ 以前我们也会在某个问题上出现争议,但其实一切都可以用实锤来说话的。 |
10
odirus 2018-05-29 14:06:49 +08:00
如果是 Java 的话,日志 MDC 了解一下,用户的每一次请求,所涉及到的详细操作记录都能够记录下来。再出现问题,解决起来就很方便了。
|
11
annielong OP @odirus 纠结,按目前流程记录下来的日志都是一样的,在没有获取 openid 前没法区分到底是谁访问的,获取到了 openid,也不确定是不是重复的 openid,这个问题出现的频率还不大,重现都不好重新,准备多做几个页面,进行测试
|
12
odirus 2018-05-29 14:20:42 +08:00
@annielong #11
那你还是为每位用户的 cookie 中添加一个设备标识,当你怀疑哪个 openid 重复的时候,分别找出对应的两次微信回调请求日志,根据这两次请求中的 cookie 判断是不是同一个人( IP 的话不是很准,特别现在大家都用手机,但可以参考是不是同一个人或者同一个局域网) |
13
fakeJas0n 2018-05-29 16:47:33 +08:00
进入后每次都重新授权怎么样?只在登录或首页发起授权
|