Springboot实现微信小程序登录功能

目录

一 什么是微信登录功能

二 实现微信登录功能的整体逻辑

三 微信登录功能实现步骤


一 什么是微信登录功能

        微信小程序登录功能一般用于开发微信小程序的时候,我们需要使用微信授权登录我们的微信小程序,本篇博客就微信小程序实现微信授权登录以及springboot服务端代码逻辑做一个详细讲解。

二 实现微信登录功能的整体逻辑

        首先,我们来看微信小程序登录的官方流程图:

从上面这个流程图可以看见,微信登录主要分为以下几个步骤:

1.微信小程序通过调用wx.login()方法来获取一个code。

2.微信小程序前端得到这个code后,通过发送请求,把这个code传给我们后端服务器。

3.我们后端服务接收到这个code后,再加上微信小程序校验凭证:appid,secret,         grant_type(这三个是通过我们创建的微信小程序生成的),  以及我们得到的js_code一并作为参数,使用HttpCent发送请求给微信接口服务,这样就会给我们返回一个openid,这个openid就是每一个用户登录的唯一标识,我们就是通过这个来判断用户是否登录。

4.根据得到的openid去数据库中查找用户,从而判断用户是否登录,如果没登录,我们在服务端需要做一个添加该用户的sql操作,记住,必须要有这个openid字段。

5.逻辑业务完成之后,我们就可以返回查询到的User对象并且生成一个jwt令牌给微信小程序前端,为什么要给用户生成一个jwt令牌?因为这用户在执行小程序的其他功能时,通过拦截器判断用户是否已经登录,有些功能需要登录才能放行。

至此,微信登录功能就已经全部完成!

三 微信登录功能实现步骤

 ① 在微信小程序端定义好请求路径,同时需要传入参数code(需要学习微信小程序的前端编码技术)

② 在服务端配置好微信小程序的appid和secret(这个是在你创建的微信小程序后生成的)

   另外,如果你是要jwt令牌的话,还需要配置微信登陆的jwt令牌。

③ 在controller层接收到前端传来的code,并且调用server层实现相关登录逻辑后,得到一个查询到的用户对象,并且未这个对象生成jwt令牌,返回给微信小程序前端。

@RestController
@Slf4j
@RequestMapping("/user/user")
@Api("C端用户相关接口")
public class UserController {
    @Autowired
    private UserServer userServer ;

    @Autowired
    private JwtProperties jwtProperties ;

    @PostMapping("/login")
    @ApiOperation("微信登录")
    public Result<UserLoginVO> login(@RequestBody UserLoginDTO userLoginDTO){
        log.info("微信用户登录code:{}" , userLoginDTO.getCode()) ;

//        微信登录
        User user = userServer.wxLogin(userLoginDTO) ;

//        为微信用户生成jwt令牌
        HashMap<String, Object> claims = new HashMap<>();
        claims.put(JwtClaimsConstant.USER_ID, user.getId()) ;
        String jwt = JwtUtil.createJWT(jwtProperties.getAdminSecretKey(), jwtProperties.getUserTtl(), claims);

//        封装返回的UserLoginVo
        UserLoginVO   userLoginVo  = UserLoginVO.builder()
                .id(user.getId())
                .openid(user.getOpenid())
                .token(jwt)
                .build();
        return Result.success(userLoginVo) ;

    }
}

④ 实现server层逻辑,主要用过接收code后,在通过另外几个参数使用HttpClient请求方式,想微信服务地址发送请求,得到用户唯一标识openid。然后通过openid去数据库表查找该用户,最后返回该用户。

@Service
@Slf4j
public class UserServerImpl implements UserServer {
//    定义访问wx接口服务的地址
    public static final  String wx_login = "https://api.weixin.qq.com/sns/jscode2session" ; //固定的

    @Autowired
    private WeChatProperties weChatProperties ;

    @Autowired
    private UserMapper userMapper   ;

    public User wxLogin(UserLoginDTO userLoginDTO) {
//        1.调用微信接口服务,获取当前用户的openid
        HashMap<String, String> map = new HashMap<>();
        map.put("appid",weChatProperties.getAppid()); //小程序appid
        map.put("secret",weChatProperties.getSecret()); //小程序appSecret
        map.put("js_code", userLoginDTO.getCode()) ; //登录微信时获取的code
        map.put("grant_type","authorization_code") ; //授权类型:authorization_code(固定的)
        String json = HttpClientUtil.doGet(wx_login, map); //返回的是一个json对象
//        把json格式的openid解析出来
        JSONObject jsonObject = JSON.parseObject(json);
        String openid = jsonObject.getString("openid");
        System.out.println("openid="+openid);
//        2.判断openid是否为空,如果为空表示登录失败,抛出异常
        if(openid==null){
            throw  new LoginFailedException(MessageConstant.LOGIN_FAILED) ; //登陆失败
        }
//        3.判断当前用户的openid有没有在我们的数据库中,如果没有,则说明是新用户,我们需要存起来
        User user = userMapper.getByOpenid(openid);
        if (user==null){
            System.out.println("该用户为新用户...");
            user = User.builder()
                    .openid(openid)
                    .createTime(LocalDateTime.now())
                    .build();
//            保存user对象到数据库
            userMapper.insertUser(user);
        }
//        4.返回用户对象
        return user ;
    }
}

至此,整个微信登录功能就实现成功啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/710011.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[2]-简洁部署版

基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[2]-简洁部署版 1.环境要求 1.1 软件要求 要顺利运行本代码,请按照以下系统要求进行配置 已经测试过的系统 Linux Ubuntu 22.04.5 kernel version 6.7其他系统可能出现系统兼容性问题。 最低要求 该要求仅针对标准模…

OpenStack入门体验及一键部署

OpenStack入门体验 技能目标&#xff1a; 了解云计算概念 了解OpenStack 了解OpenStack的构成 会OpenStack单机环境一键部署 从控制台认识OpenStack各项功能会 通过OpenStack控制台创建云主机 什么是云计算 云计算(cloudcomputing)是一种基于网络的超级计算模式&a…

Docker安装Nginx(各种错误版)

Docker安装-CSDN博客 安装启动Docker之后 docker run -d -p 81:81 --name nginx nginx 这样没有指定版本 docker run&#xff1a;启动一个新的容器。-d&#xff1a;以分离模式运行容器&#xff08;后台运行&#xff09;。-p 81:81&#xff1a;将主机的 81 端口映射到容器的 …

用Vue3和p5.js打造一个交互式数据可视化仪表盘

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于 Vue.js 集成 p5.js 实现交互式波形图 应用场景介绍 在数据可视化领域&#xff0c;波形图广泛应用于展示动态变化的数据&#xff0c;如声音信号、心跳曲线等。通过动态绘制波形图&#xff0c;用户可以直观…

网络标准架构--OSI七层、四层

OSI七层网络架构&#xff0c;以及实际使用的四层网络架构。

细说ARM MCU的串口发送数据的实现过程

目录 1、条件及工程配置 2、实现串口发送的库函数 3、修改whlie(1)中的代码 4、修改回调函数 5、下载运行 前面的文章介绍了用串口的接收中断来接收数据&#xff0c;本文介绍通过串口从MCU向外发送数据。 1、条件及工程配置 文章依赖的硬件及工程配置同本文作者的其他文…

热门开源项目推荐:智谱GLM-4-9B和ChatGLM3-6B

目录 热门开源项目推荐&#xff1a;智谱GLM-4-9B和ChatGLM3-6B 1.引言 1.1 开源文化简介 1.2 开源项目的重要性 1.3 博客目的和读者价值 2.什么是开源项目&#xff1f; 2.1 开源定义 2.2 开源许可证类型 2.3 开源社区的作用 3.为什么程序员应该关注开源项目&#xff…

javaWeb项目-ssm+jsp学生请假系统功能介绍

本项目源码:java-ssm-jsp学生请假系统源码说明文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL…

HashMap底层源码分析

目录 一、知识点二、数据结构三、resize() 扩容方法四、putVal() 添加数据方法五、remove() 删除方法六、removeTreeNode() 退化链表方法 一、知识点 加载因子: HashMap 的默认的加载因子: 0.75&#xff0c;用来限定阈值&#xff08;用于控制 HashMap 的饱和度&#xff09; 阈值…

适合小白学习的项目1906java Web智慧食堂管理系统idea开发mysql数据库web结构java编程计算机网页源码servlet项目

一、源码特点 java Web智慧食堂管理系统是一套完善的信息管理系统&#xff0c;结合java 开发技术和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 bootstra…

uni-app 小程序:显示图片并且点击图片展示大图

效果如图所示&#xff1a; 在页面显示一张图片&#xff0c;然后点击该张图片后显示大图。点击大图就可以关闭大图。 实现的主要代码如下&#xff1a; <image :src"imgpath" mode"aspectFill" click"imgPreview(imgArr)"></image> 其…

LeetCode | 171.Excel表列序号

这道题涉及到字符串和进制转换&#xff0c;首先我们先创建一个A-Z到1-26的map映射&#xff0c;方便我们后续遍历字符串转换&#xff0c;然后对字符串从后往前遍历&#xff0c;依次加上对应权重&#xff0c;注意越往前的权重越大&#xff0c;要记得对应乘上26的对应方数 class …

Visual Studio Code 的安装教程和配置C语言环境插件推荐

目录 1.vscode简介2.下载安装vs code3.VSCode基础配置VSCode界面简介VSCode设置中文界面VSCode个性化设置VSCode常用设置基本编辑快捷键VSCode常用快捷键 4.下载安装MinGW5.设置vscode里的环境6.插件推荐7.vscode官方文档 1.vscode简介 VSCode是微软出的一款轻量级编辑器&…

Xilinx SDK操作步骤详细介绍

在vivado设计完成后&#xff0c;下一步就是软件设计&#xff0c;与vivado相配套的设计软件是xilinx SDK(software developement kit&#xff09;&#xff0c;其操作流程如下&#xff1a; Vivado软件的bitstream文件成功生成后&#xff0c;点击File——Export——Export Hardwa…

IQ Products—Hemoglobin antibodies for flow cytometry

血红蛋白&#xff08;Hemoglobin&#xff09;英文缩写为HGB或Hb。血红蛋白是红细胞内运输氧的特殊蛋白质&#xff0c;是使血液呈红色的蛋白&#xff0c;由珠蛋白和血红素组成&#xff0c;其珠蛋白部分是由两对不同的珠蛋白链&#xff08;α链和β链&#xff09;组成的四聚体。血…

异或运算在面试题中的应用

异或运算 是 涉及到数据位运算时常见的处理方式。如何进行异或运算&#xff1f;在对应位上&#xff0c;相同为0&#xff0c;不同1&#xff0c;但其实两个数据异或运算就是进行无进位加法。 例如&#xff1a; int a 7, b 6, a ^b ? 算法1: 相同为0&#xff0c;不同为1 a …

边界内聚和耦合

内聚 功能内聚 功能内聚是软件工程中一个重要的概念&#xff0c;它描述了一个模块内部各个元素之间的紧密程度。一个具有高功能内聚的模块意味着其内部的各个组件都共同完成一个具体的、明确的功能&#xff0c;并且这些组件之间的联系不是偶然的&#xff0c;而是因为它们共同服…

sslscan一键检测服务器协议信息和加密算法(KALI工具系列二十四)

目录 1、KALI LINUX 简介 2、sslscan工具简介 3、信息收集 3.1 目标主机IP&#xff08;服务器&#xff09; 3.2 KALI的IP 4、操作示例 4.1 扫描主机 4.2 指定端口 4.3 输出详细信息 4.4 打印输出信息 4.4 检测协议 5、总结 1、KALI LINUX 简介 Kali Linux 是一个…

在下游市场需求带动下 我国聚天门冬氨酸脂防腐涂料市场规模不断扩大

在下游市场需求带动下 我国聚天门冬氨酸脂防腐涂料市场规模不断扩大 聚天门冬氨酸酯防腐涂料又称为天冬聚脲防腐涂料&#xff0c;是以聚天门冬氨酸酯作为主体树脂、脂肪族异氰酸酯为固化剂而形成的一种防腐涂料。与其他类型的防腐涂料相比&#xff0c;聚天门冬氨酸酯防腐涂料具…

IO系列(十) -TCP 滑动窗口原理介绍(上)

一、摘要 之前在上分享网络编程知识文章的时候&#xff0c;有网友写下一条留言&#xff1a;“可以写写一篇关于 TCP 滑动窗口原理的文章吗&#xff1f;”。 当时没有立即回复&#xff0c;经过查询多方资料&#xff0c;发现这个 TCP 真的非常非常的复杂&#xff0c;就像一个清…