起因
前几天上班,新同事来找我帮忙。
他负责的一位用户想用自己的账号中的 ApiKey,结果提示要绑定手机号;绑定手机号又一直失败,搞不定,于是来请教。
我一听,觉得是个小 case——用户之前可能已经注册过,直接按手机号查一下后台,应该就能找到对应的账号。便让同事去查。
同事查完反馈:后台只找到一个用户。
我第一反应是手机号绑定功能有 bug,打算直接帮用户重置一下。结果——改完手机号之后,用户那边炸了:账号不对了,原本的 VIP 消失不见,还有一年的会员没到期呢。
这下我有点慌。毕竟,这是我第一次碰上生产环境的事故。
冷静下来,我把同事和用户的聊天记录要过来翻了一遍。终于发现——漏了一个关键信息:用户的 ID。
同事反馈时只提了手机号,我也是照着手机号去查的,所以在线上数据库里只查到了一个人。
但仔细一看,我又发现了一个"很新的 ID"——查了一下,这个 ID 下没有任何手机号,只有一个 open_id(微信的)。
事情一下子清晰了。
原因
我们网站支持两种登录方式:
-
手机号注册登录
-
微信扫码登录
问题来了:这两种登录方式之间没有绑定关系。
也就是说,手机号注册的账号和微信扫码的账号,是两个独立账户。数据不互通,VIP 不共享,key 也是分开的。
这位用户的情况是这样的:
-
先用手机号注册了一个账号(账号 A),使用了一段时间,快要到期
-
后来又用微信扫码登录,网站自动为他创建了一个新账号(账号 B)
-
用户以为这是同一个账号,但实际是两个独立账户
-
当同事按手机号去查,只能查到账号 A,账号 B 完全不在查询范围内
这就是为什么后台只显示一个用户,而用户却发现自己的 VIP "消失"了——VIP 在账号 B 里,根本不在同事查到的那个账号里。
解决办法
事后我们讨论了两种解法:
强制绑定。 当用户用微信扫码登录后,系统自动检测是否已存在相同手机号或微信的关联账号,如有则提示用户主动合并两个账户,合并后数据汇总,保留两个登录入口。
登录时引导绑定。 用户使用任一方式登录后,若检测到账号未绑定其他登录方式,主动弹出引导页,提示用户"绑定后可使用两种方式登录同一账号"。
短期应急。 目前临时方案是用户在账号找回时遇到问题,可联系客服人工核实身份后,手动合并两个账号。
吐槽
前同事写的后端,怎么连这个基本的东西都没做……
不过目前尚且够用,也就先不改了。