其他字段
id
mobile
app_id
openid
unionid
del_flg
...
这里多添加了一个app_id的字段和unionid的字段,是用于当我们的业务涉及到多个入口,例如微信公众号H5入口和微信小程序 。
不同的用户在微信公众号H5和微信小程序产生的openid可能一样也可能不一样,所以我们需要通过app_id来区分
同时为了关联在微信公众号H5和微信小程序的用户,我们会把微信公众号和微信小程序绑定到同一个开放平台,这个时候会产生一个unionid,通过该标识即可以找到微信公众号的用户,也可以找到微信小程序的用户 。
接着我们实现一个注册方法 。
@Servicepublic class CsInfoServiceImpl implements CsInfoService {@Autowiredprivate CsInfoRepository csInfoRepository;@Autowiredprivate CsWxInfoRepository csWxInfoRepository;@Autowiredprivate CsInfoConvert csInfoConvert;@Override@Transactional(rollbackFor = Throwable.class, timeout = 60)public CsWxInfoDTO register(CsInfoRegisterDTO param) {// 根据手机号查询用户信息CsInfo info = csInfoRepository.infoByMobile(param.getMobile());Long id = info == null ? 0 : info.getId();// 如果用户不存在,则创建if(id == 0){id = csInfoRepository.create(param.getMobile(), param.getRegisterSource().getCode());}// 逻辑删除当前手机号绑定的openid// 逻辑删除当前openid绑定的手机号csWxInfoRepository.handleOpenidMobileUnique(param.getMobile(), param.getOpenid(), param.getAppId());// 保证当前手机号和openid在系统中1:1的关系CsWxInfo wxInfo = csWxInfoRepository.infoByMobileOpenid(param.getMobile(), param.getOpenid(), param.getAppId());if(wxInfo == null){wxInfo = new CsWxInfo();wxInfo.setAppId(param.getAppId());wxInfo.setMobile(param.getMobile());wxInfo.setOpenid(param.getOpenid());wxInfo.setUnionid(param.getUnionid());wxInfo.setAvatarUrl(param.getAvatarUrl());wxInfo.setNickName(param.getNickName());csWxInfoRepository.save(wxInfo);}else{CsWxInfo model = new CsWxInfo();model.setId(wxInfo.getId());model.setDelFlg(Integer.valueOf(DelFlgEnum.NORMAL.getCode()));csWxInfoRepository.updateById(model);}CsWxInfoDTO result = csInfoConvert.getCsWxInfoDTO(wxInfo);result.setInfoId(id);return result;}}
其中handleOpenidMobileUnique方法对应的SQL处理如下:
<update id="loginDelByOpenIdExcludeMobile">update cs_wx_info set del_flg = 0 ,update_time = now()<where>del_flg = 1<if test="appId != null">and app_id = #{appId}</if><if test="openid != null and openid != ''">and openid = #{openid}</if><if test="mobile != null and mobile != ''">and mobile != #{mobile}</if></where></update><update id="loginDelByMobileExcludeOpenid">update cs_wx_info set del_flg = 0 ,update_time = now()<where>del_flg = 1<if test="appId != null">and app_id = #{appId}</if><if test="mobile != null and mobile != ''">and mobile = #{mobile}</if><if test="openid != null and openid != ''">and openid != #{openid}</if></where></update>
最后至此,关于微信登录注册遇到的一些小问题,我们找到了一个相对比较好的解决方案,你还不快实践到你自己项目上去?
相关源码地址:anyin-cloud: 生产级 Spring Cloud 脚手架
推荐阅读
- 招聘|办公室的OL都穿什么?让日本时尚博主告诉你,照穿就时髦又优雅
- 碳纤维浴霸优缺点介绍
- 由浅入深,带你用JavaScript实现响应式原理
- 深度学习优化算法研究取得进展
- Gin与Vue3实现RESTful前后端分离
- C# 实现SM2国密加密帮助类
- 步步高和优学派学习机该如何选择 哪个牌子的学习机好
- SpringBoot WebFlux整合R2DBC实现数据库反应式编程
- 求职|九零,零零后的各位,你们工作能实现双休吗?
- 腰椎间盘突出牵引的方法与优势 腰椎间盘突出牵引