微信注册账号免费申请怎么注册(优雅地实现微信登录注册)

引言

大家好,我是安音。

今天就来说说我们在微信注册时遇到的一些事情。

在我们的业务系统中,一个用户在系统中肯定会有一个唯一的标识符,而这个唯一的标识符一般是从系统外部获取的,而不是系统自动生成的,比如手机号或者身份证。

在微信(微信微信官方账号H5或小程序)的场景下,用户的唯一标识符通常是手机号或openid。一般情况下,我们遇到的是一个用户只有一个微信号,一个微信号绑定一个手机号,所以我们认为三者的关系如下:



但是,理想很丰满,现实很骨感,我们遇到的情况肯定不会这么简单。

问题分析

当一个系统运行的时间足够长,用户足够多的时候,你总会遇到各种奇怪的问题。

在上一节中,我们知道正常情况会相对简单。用户、微信号、手机号之间的关系是1:1:1,也就是说,三者可以是等价的。我总能用一个信息查出另外两个的信息,比如用手机号就能查出用户ID和微信Openid。

因此,根据以上思路,我们可以很容易地设计一个用户表:cus_info,基本表结构如下:

用户ID

微信openid

用户的手机号码

逻辑删除

其他字段

编号

信息

可动的

del_flg

...

但是当遇到以下两种场景时,这种表结构设计就不能满足要求了。

一个用户有两个微信号有些用户有两个微信号,并且绑定了同一个手机号(这个逻辑可以通过微信改变手机号来实现)。

在这种场景下,用户一旦换了一个微信号登录系统,按照微信openid登录,因为表格数据找不到openid,那么就要走注册流程;注册时根据手机号查询用户信息,发现用户已经存在,返回登录过程,最终导致无休止的逻辑循环。



一个用户有两个手机号另外,有的用户有两个手机号,并且绑定了同一个手机号(这个逻辑是在用户授权手机号的时候再添加一个手机号实现的)。

在这个场景中,用户第一次用手机号A注册登录,我们绑定了手机号A和对应的微信openid在后端。第二次,用户用手机号b注册登录,此时数据库中会出现两条记录,手机号相同的不同openid。这会导致在某些场景下(比如支付回拨)根据openid获取用户信息时发现2个用户,从而导致业务异常。

解决思路

以上两个问题,不同的人在不同的业务场景下会有不同的解决方案。有手机号作为用户的唯一标识,有微信openid作为用户的唯一标识。这里,我们提供一个解决方案,将手机号码作为用户的唯一标识符。

这里我们认为一个手机号就是一个用户,一个用户会有多个微信号。这种关系如下:



一个用户有两个微信号为了解决这个问题,我们会在登录注册时通过逻辑控制保证一个手机号只能找到一个微信openid。处理方法如下:

  • 根据当前手机号,查询所有微信openid,逻辑删除。
  • 根据目前的openid查询,所有手机号都是逻辑删除的。
  • 根据当前手机号和openid,查询是否有记录。如果没有记录,添加它。如果有,将逻辑删除标志重置为正常。
  • 一个用户有两个手机号为了解决这个问题,我们会在业务上处理。因为我们认为一个手机号就是一个用户,如果一个用户有两个手机号,那么我们认为是我们系统中的两个用户,他们的数据是相互独立的。

    此外,在这个场景中,我们还需要提供一个更改和绑定手机号码的功能。这样,当用户有两个手机号时,也能满足切换的要求。

    方案实现

    以上,我们有相关的解决方案。然后下一步就是设计和编码。

    根据以上所述,我们将设计以下两种表格结构:

    cus_info用户信息表

    用户ID

    用户的手机号码

    逻辑删除

    其他字段

    编号

    可动的

    del_flg

    ...

    cus_wx_info用户与微信关联表

    ID

    用户的手机号码

    微信appId

    微信openid

    开放平台unionid

    逻辑删除

    微信注册账号免费申请

    其他字段

    编号

    可动的

    app_id

    信息

    珠蚌

    del_flg

    ...

    这里增加了一个app_id的字段和一个unionid的字段,当我们的业务涉及到多个入口时使用,比如微信微信官方账号H5入口和微信小程序。

    微信微信官方账号H5和微信小程序中不同用户生成的Openid可能相同,也可能不同,我们需要通过app_id来区分。

    同时,为了连接微信微信官方账号H5和微信小程序中的用户,我们将把微信微信官方账号和微信小程序绑定到同一个开放平台。这时会生成一个unionid,通过这个union id可以找到微信微信官方账号和微信小程序的用户。

    然后我们实现一个注册方法。

    @ Service 公共类CsInfoServiceImpl实现CsInfoService { @ Autowired 私有CsInfoRepository CsInfoRepository; @ Autowired private cswxin fore pository cswxin fore pository; @ Autowired private CsInfoConvert CsInfoConvert; @ Override @ Transactional(roll back for = throwable . class,time out = 60) Public CSWX info dto register(CSINFORDER DTO param){ //根据手机号查询用户信息 csinfinfo = CSINFORRepository。InfobyMobile(参数。get mobile()); Long id = info == null?0:info . getid(); //如果用户不存在,则创建 If(ID = 0){ ID = csinfRepository。创建(参数。getmobile(),param。getregistersource()。getcode()); } //逻辑删除当前手机号绑定的openid /逻辑删除当前OpenID绑定的手机号 cswxinfolepository。Handleopenidmobileunique(参数。getmobile(),param。getopenid(),param。getappid ( //确保当前手机号码与系统中openid的1:1关系 CSWxInfo wx info = CSWxInfoRepository。Infobymobileopenid(参数。Getmobile(),param。GetOpenID(),param。GetAppID()); if(wx info = = null){ wx info = new CsWxInfo(); wx info . setappid(param . getappid()); wx info . set mobile(param . get mobile()); wx info . setopen id(param . get OpenID()); wx info . setunionid(param . getunionid()); wx info . setavatarurl(param . getavatarurl()); wx info . set nickname(param . get nickname()); cswxinforepository . save(wx info); } else { CsWxInfo model = new CsWxInfo(); model . setid(wx info . getid()); model . setdelflg(integer . value of(DelFlgEnum。normal . get code())); cswxinforepository . update byid(型号); } CsWxInfoDTO result = csinfoconvert . getcswxinfodto(wx info); result . setinfoid(id); 返回结果; } }其中,handleOpenidMobileUnique方法对应的SQL处理如下:

    & lt更新id = & # 34loginDelByOpenIdExcludeMobile & # 34;& gt update cs _ wx _ info set del _ flg = 0,update _ time = now() & lt;其中& gt del _ flg = 1 & lt;如果测试= & # 34;appId!= null & # 34& gt 和app _ id = # { appId } & lt;/if & gt; & lt;如果测试= & # 34;openid!= null和openid!= ''"& gt 和OpenID = # { OpenID } & lt;/if & gt; & lt;如果测试= & # 34;手机!=空和移动!= ''"& gt 还有移动!= # { mobile } & lt;/if & gt; & lt;/where & gt; & lt;/update & gt; & lt;更新id = & # 34loginDelByMobileExcludeOpenid & # 34;& gt update cs _ wx _ info set del _ flg = 0,update _ time = now() & lt;其中& gt del _ flg = 1 & lt;如果测试= & # 34;appId!= null & # 34& gt 和app _ id = # { appId } & lt;/if & gt; & lt;如果测试= & # 34;手机!=空和移动!= ''"& gt 和mobile = # { mobile } & lt;/if & gt; & lt;如果测试= & # 34;openid!= null和openid!= ''"& gt 和openid!= # { OpenID } & lt;/if & gt; & lt;/where & gt; & lt;/update & gt;最后在这一点上,对于微信注册中遇到的一些小问题,我们找到了一个相对较好的解决方法。为什么不在自己的项目中付诸实践呢?

    相关源地址:anyin-cloud:生产级春云脚手架

    您可以还会对下面的文章感兴趣

    使用微信扫描二维码后

    点击右上角发送给好友