返回顶部
首页 > 资讯 > 后端开发 > Python >Java如何优雅的实现微信登录注册
  • 764
分享到

Java如何优雅的实现微信登录注册

2024-04-02 19:04:59 764人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录引言问题分析解决思路方案实现最后引言 今天我们来聊一聊微信登录注册遇到的一些事儿。 在我们的业务系统中,一个用户在系统中肯定会有一个唯一标识,并且这个唯一标识一般是从系统外部获取

引言

今天我们来聊一聊微信登录注册遇到的一些事儿。

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

我们在微信的场景下(微信公众号H5或者小程序),对于用户的唯一标识一般都是手机号或者openid。在正常情况下,我们遇到的都是一个用户只有一个微信号,一个微信号绑定了一个手机号,所以我们就认为三者的关系如下:

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

问题分析

当一个系统运行的足够久,用户量足够多,那么你总会遇到各种奇奇怪怪的问题。

在上一节,我们知道正常情况遇到的场景会比较简单,用户、微信号、手机号三者是1:1:1的关系,也就说三者可以等价,我用其中一个信息,总是可以查询出另外两个的信息,例如:我可以用手机号,查询出用户ID和微信openid。

所以,根据以上思路,我们很容易设计出用户表:cus_info ,基本表结构如下:

用户ID微信openid用户手机号逻辑删除其他字段
idopenidmobiledel_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用户手机号逻辑删除其他字段
idmobiledel_flg...

cus_wx_info 用户和微信关联表

ID用户手机号微信appId微信openid开放平台uNIOnid逻辑删除其他字段
idmobileapp_idopenidunioniddel_flg...

这里多添加了一个app_id的字段和unionid的字段,是用于当我们的业务涉及到多个入口,例如微信公众号H5入口和微信小程序

不同的用户在微信公众号H5和微信小程序产生的openid可能一样也可能不一样,所以我们需要通过app_id来区分

同时为了关联在微信公众号H5和微信小程序的用户,我们会把微信公众号和微信小程序绑定到同一个开放平台,这个时候会产生一个unionid,通过该标识即可以找到微信公众号的用户,也可以找到微信小程序的用户。

接着我们实现一个注册方法。

@Service
public class CsInfoServiceImpl implements CsInfoService {
    @Autowired
    private CsInfoRepository csInfoRepository;

    @Autowired
    private CsWxInfoRepository csWxInfoRepository;

    @Autowired
    private 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

到此这篇关于Java如何优雅的实现微信登录注册的文章就介绍到这了,更多相关Java微信登录注册内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java如何优雅的实现微信登录注册

本文链接: https://lsjlt.com/news/139883.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java如何优雅的实现微信登录注册
    目录引言问题分析解决思路方案实现最后引言 今天我们来聊一聊微信登录注册遇到的一些事儿。 在我们的业务系统中,一个用户在系统中肯定会有一个唯一标识,并且这个唯一标识一般是从系统外部获取...
    99+
    2024-04-02
  • vue3如何优雅的实现移动端登录注册模块
    目录前言 输入框组件 布局 v-model 数据校验 rules设计 Form表单 子组件生成校验函数 校验 最终效果 总结前言 近期开发的移动端项目直接上了 vue3 ,新特性 ...
    99+
    2024-04-02
  • 微信小程序实现登录注册界面
    本文实例为大家分享了微信小程序实现登录注册界面的具体代码,供大家参考,具体内容如下 微信小程序登录注册界面demo,存在不足之处,请指教! 界面图片: 1.js代码: Page(...
    99+
    2024-04-02
  • java如何实现注册登录系统
    本篇内容介绍了“java如何实现注册登录系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、创建菜单,注册,登录,退出2、注册模块:a) ...
    99+
    2023-06-30
  • java如何实现登录注册界面
    这篇文章主要介绍“java如何实现登录注册界面”,在日常操作中,相信很多人在java如何实现登录注册界面问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java如何实现登录注册界面”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-02
  • java注册登录功能如何实现
    Java注册登录功能可以通过以下步骤来实现:1. 创建数据库表:- 创建一个用户表,包括用户ID(主键),用户名,密码等字段。2. ...
    99+
    2023-08-11
    java
  • vue3怎么优雅的实现移动端登录注册模块
    这篇文章主要介绍vue3怎么优雅的实现移动端登录注册模块,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言近期开发的移动端项目直接上了 vue3 ,新特性 composition api 确实带来了全新的开发体验.开...
    99+
    2023-06-14
  • Vue3项目中优雅实现微信授权登录的方法
    目录前言 准备 实现思路 上代码 总结 前言 微信授权登录是做微信公众号开发一直绕不开的话题,而且整个授权登录流程的实现,是需要前后端配合一起完成的。在过去前后端还未分离的年代,也...
    99+
    2024-04-02
  • Redis如何实现登录注册
    今天小编给大家分享一下Redis如何实现登录注册的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 引言在传统的项目中,用户...
    99+
    2023-07-02
  • java实现注册登录系统
    本文实例为大家分享了java实现注册登录系统的具体代码,供大家参考,具体内容如下 1、创建菜单,注册,登录,退出 2、注册模块: a) 通过键盘输入用户名,密码b) 保存用户名密码到...
    99+
    2024-04-02
  • Java实现注册登录跳转
    本文实例为大家分享了Java实现注册登录跳转的具体代码,供大家参考,具体内容如下 创建数据库,创建一个登录表login存储用户的用户名和密码,使用sql insert语句将注册的信息...
    99+
    2024-04-02
  • java实现登录注册界面
    本文实例为大家分享了java实现登录注册界面的具体代码,供大家参考,具体内容如下 数据库设计 既然只是一个登录和注册的界面,数据库方面就只设计一个Admin表,表内有三个值。 id...
    99+
    2024-04-02
  • 微信小程序登录与注册功能的实现详解
    目录小程序中的登录用户注册用户信息修改总结小程序中的登录 在小程序中有一个概念叫openid,这个相当于登录小程序用户的唯一标识,每个微信用户都不同。那要如何拿到用户的唯一标识呢?在...
    99+
    2022-11-13
    微信小程序登录 微信小程序注册
  • 微信小程序登录态和检验注册过没的app.js如何实现
    小编给大家分享一下微信小程序登录态和检验注册过没的app.js如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!0、可参考的...
    99+
    2024-04-02
  • uniapp如何实现微信登录
    实现微信登录可以使用 uni.login() 方法,首先需要在微信开放平台注册小程序并获取 appid。 然后在 uni-app 项目中使用 uni.login() 方法获取 code,再通过 code 换取 openid 和 sessio...
    99+
    2023-08-16
    微信 uni-app 小程序
  • springboot+VUE如何实现登录注册
    这篇文章主要介绍springboot+VUE如何实现登录注册,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、springBoot创建springBoot项目分为三个包,分别为controller,service, ...
    99+
    2023-06-15
  • react如何实现登录和注册
    这篇文章主要介绍了react如何实现登录和注册的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇react如何实现登录和注册文章都会有所收获,下面我们一起来看看吧。react实现登录和注册的方法:1、搭建样式组件;...
    99+
    2023-07-04
  • JavaScript如何实现web登录注册
    今天小编给大家分享一下JavaScript如何实现web登录注册的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、前端基础准...
    99+
    2023-07-06
  • Java实现登录与注册页面
    用java实现的登录与注册页面,实现了客户端(浏览器)到服务器(Tomcat)再到后端(servlet程序)数据的交互。这里在注册页面加入了验证码验证。 注册的html代码,页面非常...
    99+
    2024-04-02
  • Java实现登录和注册案例
    本文实例为大家分享了Java实现登录和注册的具体代码,供大家参考,具体内容如下 登录和注册案例的分析: 我们在完成一个需求时,需要面向对象,我们必须找到能完成某个功能的类,接着调用里...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作