优雅地实现微信登录注册

引言Hello 大家好,这里是Anyin 。
今天我们来聊一聊微信登录注册时遇到的一些事儿 。
在我们的业务系统中,一个用户在系统中肯定会有一个唯一标识,并且这个唯一标识一般是从系统外部获取的,而不是系统自动生成的,例如:手机号或者身份证 。
我们在微信的场景下(微信公众号H5或者小程序),对于用户的唯一标识一般都是手机号或者openid 。在正常情况下,我们遇到的都是一个用户只有一个微信号,一个微信号绑定了一个手机号,所以我们就认为三者的关系如下:

优雅地实现微信登录注册

文章插图
 
【优雅地实现微信登录注册】但是,理想很丰满,现实很骨感,我们遇到的情况肯定不会如此的简单 。
问题分析当一个系统运行得足够久,用户量足够多,那么你总会遇到各种奇奇怪怪的问题 。
在上一节,我们知道正常情况遇到的场景会比较简单,用户、微信号、手机号三者是1:1:1的关系,也就说三者可以等价,我用其中一个信息,总是可以查询出另外两个的信息,例如:我可以用手机号,查询出用户ID和微信openid 。
所以,根据以上思路,我们很容易设计出用户表:cus_info ,基本表结构如下:
用户ID
微信openid
用户手机号
逻辑删除
其他字段
id
openid
mobile
del_flg
...
但是当遇到以下2个场景的时候,这个表结构设计就无法满足需求了 。
一个用户2个微信号 有些用户是拥有两个微信号,并且绑定同一个手机号(这个逻辑可以通过微信换绑手机号实现) 。
在这个场景下,一旦用户换了个微信号登录进入系统的时候,根据微信openid进行登录,因为表数据找不到该openid,则走注册流程;在注册的时候,又根据手机号查询用户信息,发现用户已经存在,返回登录流程,最终造成逻辑死循环 。
优雅地实现微信登录注册

文章插图
 
一个用户2个手机号 另外还有一些用户拥有2个手机号,并且绑定同一个手机号(这个逻辑在用户授权手机号的时候添加另外一个手机号实现) 。
在这个场景下,第一次用户使用手机号A注册并登录,我们在后端绑定了手机号A和对应的微信openid;第二次用户使用手机号B注册并登录,这时候数据库会有2条记录,不同手机号相同的openid 。这样子会导致在某些场景下(例如支付回调),根据openid获取用户信息的时候,找到2个用户,从而导致业务异常 。
解决思路以上2个问题,在不同的业务场景下,不同的人会有不同的解法 。有以手机号作为用户的唯一标识,有以微信openid作为用户唯一标识 。在这里,我们提供一个以手机号作为用户唯一标识的解法 。
在这里,我们认为一个手机号就是一个用户,一个用户会有多个微信号 。关系如下:
优雅地实现微信登录注册

文章插图
 
一个用户2个微信号 针对该问题,我们在登录注册的时候,会通过逻辑控制,保证一个手机号只能找到一个微信openid 。处理方式如下:
  • 根据当前的手机号查询到所有的微信openid,做逻辑删除处理
  • 根据当前的openid查询到所有的手机号,做逻辑删除处理
  • 根据当前手机号和openid查询是否存在记录,如果不存在则新增,如果存在则逻辑删除标识重置为正常 。
一个用户2个手机号 针对该问题,我们在业务上做处理 。因为我们认为一个手机号就是一个用户,如果一个用户拥有两个手机号,那么在我们系统上我们认为是两个用户,他们的数据是相互独立的 。
另外在这个场景下,我们还需要提供一个手机号换绑的功能 。这样当用户有2个手机号,也能给实现切换的需求 。
方案实现以上,相关的解决思路我们有了 。那么接下来就是设计和编码 。
根据以上,我们会设计如下2张表结构:
cus_info 用户信息表
用户ID
用户手机号
逻辑删除
其他字段
id
mobile
del_flg
...
cus_wx_info 用户和微信关联表
ID
用户手机号
微信AppId
微信openid
开放平台unionid
逻辑删除


推荐阅读