spring boot3登录开发-微信小程序用户登录设计与实现

news2024/11/24 0:01:37

 

⛰️个人主页:     蒾酒

🔥系列专栏:《spring boot实战》

🌊山高路远,行路漫漫,终有归途


目录

写在前面

登录流程

流程解析

具体实现

相关代码

说明

服务端

小程序端

写在最后


写在前面

本文介绍了springboot开发微信小程序后端服务中,用户登录功能的设计与实现,坚持看完相信对你有帮助。

同时欢迎订阅springboot系列专栏,持续分享spring boot的使用经验。

登录流程

如图:

这是微信官方文档中微信小程序登录的流程时序图,我在图中红色序号标注的五步就是完整的微信小程序登录流程。

流程解析

  1. 小程序端通过wx.login()获取用户登录凭证code。
  2. 小程序将code发送到服务端的登录接口。
  3. 服务端的登录接口使用该code、小程序的AppID和AppSecret向微信服务器发起请求,获取用户的openid。
  4. 服务端拿到openid后,可以根据业务需求生成用户令牌(Token),通常包括用户信息、权限等,并返回给小程序。
  5. 小程序在本地缓存该用户令牌。
  6. 后续小程序发起请求时,在请求头中携带该用户令牌(Token)。
  7. 服务端接收到请求时,验证用户令牌的有效性,确保用户是经过认证和授权的。

具体实现

登录接口设计思路

  1. 接收小程序端传递的code参数。
  2. 使用code、小程序的AppID和AppSecret向微信服务器发起请求,获取用户的openid。
  3. 在数据库用户表中查询是否存在该openid。
  4. 如果存在该openid,则使用查询到的用户信息生成令牌(Token)。
  5. 如果不存在该openid,则进行用户注册操作,将新用户信息插入数据库用户表,并生成令牌(Token)。
  6. 返回生成的令牌(Token)给小程序端。

相关代码

说明

下面代码基于jdk17,发请求用的时jdk自带的http工具类,如果你的jdk版本低于11,可以使用okhttp依赖来发请求,然后jwt相关工具类代码在我本专栏的其他文章里面,用到的ORM框架为mybatis-plus整合相关代码也在本专栏。

服务端

登录dto

@Data
public class UserLoginDTO {
    @NotBlank(message = "code不能为空")
    private String code;

    private Map<String,Object> userInfo;//用户完善信息

}

登录返回vo

@Data
@Builder
public class UserLoginVO implements Serializable {
    private Long id; //用户id

    private String openid;//用户在小程序唯一标识

    private String token;//用户登录凭证
   
}

获取openid方法

使用的是jdk17自带的HttpClient,也可以使用okhttp,或者糊涂工具包里面的。

 private String getOpenid(String code) {
        HttpClient httpClient = HttpClient.newHttpClient();
        // 构建请求参数字符串
        String params = String.format("appid=%s&secret=%s&js_code=%s&grant_type=%s",
                URLEncoder.encode(wxMiniConfig.getAppId(), StandardCharsets.UTF_8),
                URLEncoder.encode(wxMiniConfig.getAppSecret(), StandardCharsets.UTF_8),
                URLEncoder.encode(code, StandardCharsets.UTF_8),
                URLEncoder.encode("authorization_code", StandardCharsets.UTF_8));

        // 创建 GET 请求
        String url = "https://api.weixin.qq.com/sns/jscode2session?" + params;
        HttpRequest httpRequest = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .build();

        try {
            // 发送 GET 请求
            HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());

            // 获取响应结果
            int statusCode = httpResponse.statusCode();
            String responseBody = httpResponse.body();
            JSONObject responseJson = JSONObject.parseObject(responseBody);
            String openid = responseJson.getString("openid");

            // 处理响应结果
            System.out.println("状态代码: " + statusCode);
            System.out.println("响应正文: " + responseBody);
            return  openid;
        } catch (Exception e) {
           log.error("发送请求时出错: {}", e.getMessage());
           return null;
        }
    }

登录逻辑代码

在判断出是新用户时,进行注册操作还需要将请求携带过来的userInfo完善信息,用户名,头像等一同封装进User对象再插入到数据库这里我就省略了

    @Override
    public UserLoginVO login(UserLoginDTO userLoginDTO) {
        //获取openid
        String openid = getOpenid(userLoginDTO.getCode());
        if(StringUtils.isBlank(openid)){
            throw new GeneralBusinessException(ResultEnum.USER_OPENID_ERROR); // openid获取失败
        }

        User user = new LambdaQueryChainWrapper<>(userMapper).eq(User::getOpenid, openid).one();

        if(Objects.isNull(user)){
            // 用户不存在则注册
            user = new User();
            //获取完善信息,用户呢称、头像url
            userLoginDTO.getUserInfo
            //封装信息。。。。。。
            //。。。。。。。。。。
            
            user.setOpenid(openid);

            // 注册用户
            if(!this.save(user)){
                throw new GeneralBusinessException(ResultEnum.USER_REGISTER_FAIL); // 用户注册失败
            }
        }

        return UserLoginVO.builder()
                .id(user.getUserId())
                .openid(user.getOpenid())
                .token(jwtUtils.generateToken(Map.of("userId", user.getUserId()), "user"))
                .build();
    }

小程序端

如图点击登录按钮会进行登录(注册)

wxml:

 <button bindtap="handleLogin">登录</button>

js:

// 点击登录按钮时触发的方法
handleLogin: function() {
  // 调用微信登录接口获取 code
  wx.login({
    success: res => {
      const code = res.code;
      if (code) {
        // 调用微信登录接口获取用户信息
        wx.getUserProfile({
          desc: '用于完善会员资料',
          success: res => {
            const userInfo = res.userInfo;

            // 将 code 和用户信息发送到后端服务器进行登录验证
            wx.request({
              url: 'http://localhost:8080/user/login',
              method: 'POST',
              data: {
                code: code,
                userInfo: userInfo
              },
              success: res => {
                const { token } = res.data; // 假设后端返回包含 token 的数据
                if (token) {
                  // 登录成功,保存 token到本地存储
                  wx.setStorageSync('token', token);

                  // 跳转到主页或其他页面
                  wx.navigateTo({
                    url: '/pages/home/home'
                  });
                } else {
                  // 登录失败,显示提示信息
                  wx.showToast({
                    title: '登录失败,请重试',
                    icon: 'none'
                  });
                }
              },
              fail: err => {
                console.error('登录请求失败', err);
              }
            });
          },
          fail: err => {
            console.error('获取用户信息失败', err);
          }
        });
      } else {
        console.error('获取登录凭证失败', res.errMsg);
      }
    },
    fail: err => {
      console.error('调用登录接口失败', err);
    }
  });
}

补充:实际开发中不会直接使用wx.request进行登录请求,一般都会进行封装,这里作为演示我就直接使用了,实际发送的post请求,请求体会携带code,和用户昵称、头像路径等信息。

写在最后

本文完整的介绍了springboot开发微信小程序服务端中用户登录功能的设计思路,希望对你有帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BigDL-LLM 安装指南——在iGPU集成显卡下使用BigDL-LLM大模型库加速LLM

文章目录 iGPU是什么&#xff1f;一、环境准备1.1 Visual Studio 2022 Community 安装1.2 安装或更新最新版本的GPU驱动程序1.3 安装英特尔oneAPI工具包2024.0版本1.4 安装Anaconda 二、BigDL -LLM 安装2.1 创建虚拟环境2.2 激活虚拟环境2.3 安装bigdl-llm[xpu] 三、运行环境配…

Etcd 介绍与使用(入门篇)

etcd 介绍 etcd 简介 etc &#xff08;基于 Go 语言实现&#xff0c;&#xff09;在 Linux 系统中是配置文件目录名&#xff1b;etcd 就是配置服务&#xff1b; etcd 诞生于 CoreOS 公司&#xff0c;最初用于解决集群管理系统中 os 升级时的分布式并发控制、配置文件的存储与分…

哔哩哔哩后端Java一面

前言 作者&#xff1a;晓宜 个人简介&#xff1a;互联网大厂Java准入职&#xff0c;阿里云专家博主&#xff0c;csdn后端优质创作者&#xff0c;算法爱好者 最近各大公司的春招和实习招聘都开始了&#xff0c;这里分享下去年面试B站的的一些问题&#xff0c;希望对大家有所帮助…

PLC_博图系列☞基本指令“RESET_BF”复位位域

PLC_博图系列☞基本指令“RESET_BF”复位位域 文章目录 PLC_博图系列☞基本指令“RESET_BF”复位位域背景介绍RESET_BF&#xff1a;复位位域说明类型为 PLC 数据类型、STRUCT 或 ARRAY 的位域参数示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 RESET_BF 背景…

java 开发工具

新建项目 打开idea选择 New Project 新建一个项目 左边选择 Java项目&#xff0c;右边选择Java版本 接着next 修改项目名称和保存路径&#xff0c;然后点击下面的 Finish 最终页面; 在 src 目录右键&#xff0c;新建一个包 在 src 目录右键&#xff0c;新建java 文件 有时候会需…

Git全套教程一套精通git.跟学黑马笔记

Git全套教程一套精通git.跟学黑马笔记 文章目录 Git全套教程一套精通git.跟学黑马笔记1.版本管理工具概念2. 版本管理工具介绍2.1版本管理发展简史(维基百科)2.1.1 SVN(SubVersion)2.1.2 Git 3. Git 发展简史4. Git 的安装4.1 git 的下载4.2 安装4.3 基本配置4.4 为常用指令配置…

智能工具柜-RFID智能工具柜管理系统

RFID工具柜管理系统是一种便捷化的工具管理系统&#xff0c;它采用RFID技术实现信息化&#xff0c;可以大大提高工具管理的效率和准确性。 日常的工具管理也确实存在一定的管理问题&#xff0c;如工具管理效率低、管理不准确等。因此&#xff0c;采用RFID技术实现信息化已经成…

【深度学习】深度估计,Depth Anything Unleashing the Power of Large-Scale Unlabeled Data

论文标题&#xff1a;Depth Anything Unleashing the Power of Large-Scale Unlabeled Data 论文地址&#xff1a;https://arxiv.org/pdf/2401.10891.pdf 项目主页&#xff1a;https://depth-anything.github.io/ 演示地址&#xff1a;https://huggingface.co/spaces/LiheYoung…

【Elasticsearch】windows安装elasticsearch教程及遇到的坑

一、安装参考 1、安装参考&#xff1a;ES的安装使用(windows版) elasticsearch的下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch ik分词器的下载地址&#xff1a;https://github.com/medcl/elasticsearch-analysis-ik/releases kibana可视化工具下载…

火车订票管理系统|基于springboot框架+ Mysql+Java+B/S结构的火车订票管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能模块 系统功能设计 数据库E-R图设计 lunwen…

【深度学习目标检测】二十三、基于深度学习的行人检测计数系统-含数据集、GUI和源码(python,yolov8)

行人检测计数系统是一种重要的智能交通监控系统&#xff0c;它能够通过图像处理技术对行人进行实时检测、跟踪和计数&#xff0c;为城市交通规划、人流控制和安全管理提供重要数据支持。本系统基于先进的YOLOv8目标检测算法和PyQt5图形界面框架开发&#xff0c;具有高效、准确、…

[WUSTCTF2020]颜值成绩查询 --不会编程的崽

这题也是一个很简单的盲注题目&#xff0c;这几天sql与模板注入做麻了&#xff0c;也是轻松拿捏。 它已经提示&#xff0c;enter number&#xff0c;所有猜测这里后台代码并没有使用 " 闭合。没有明显的waf提示&#xff0c; 但是or&#xff0c;and都没反应。再去fuzz一…

C++17之std::variant

1. std::variant操作 如下列出了为std:: variable <>提供的所有操作。

Spring Boot整合STOMP实现实时通信

目录 引言 代码实现 配置类WebSocketMessageBrokerConfig DTO 工具类 Controller common.html stomp-broadcast.html 运行效果 完整代码地址 引言 STOMP&#xff08;Simple Text Oriented Messaging Protocol&#xff09;作为一种简单文本导向的消息传递协议&#xf…

基础---nginx 启动不了,跟 Apache2 服务冲突

文章目录 查看 nginx 服务状态nginx 启动后 访问页面 127.0.0.1停止 nginx 服务&#xff0c;访问不了页面停止/启动 Apache2 服务&#xff0c;启动 Apache2 页面访问显示正确nginx 莫名启动不了卸载 Apache2 服务器 启动 nginx &#xff0c;但是总是不能实现反向代理&#xff0…

Java手写简易数据库--持续更新中

MYDB 0. 项目结构0.1 引用计数缓存框架为什么不使用LRU引用计数缓存缓存框架实现 0.2 共享内存数组 1. 事务管理器--TM1.1 XID 文件XID 规则XID 文件结构读取方式事务状态 1.2 代码实现 2. 数据管理器--DM2.1 页面缓存页面结构页面缓存数据页管理第一页普通页 2.2 日志文件 3. …

Linux-新手小白速秒Hadoop集群全生态搭建(图文混编超详细)

在之前的文章中&#xff0c;我教会大家如何一步一步搭建一个Hadoop集群&#xff0c;但是只提供了代码&#xff0c;怕有些朋友会在一些地方产生疑惑&#xff0c;今天我来以图文混排的方式&#xff0c;一站式交给大家如何搭建一个Hadoop高可用集群包括&#xff08;HadoopHA&#…

HTML基础:img图像标签的4个属性值详解

你好&#xff0c;我是云桃桃。今天来聊一聊图片标签。 语法 HTML <img> 标签用于在网页中插入图像&#xff0c;它是 HTML 中的一个自闭合标签。通过在网页中显示图像&#xff0c;可以丰富页面内容、传达信息和提升用户体验。 <img src"img/jay01.jpg" al…

汽车IVI中控开发入门及进阶(十三):语音识别

前言: IVI中控上的语音识别,在目前市场上也是非常显眼的一个创新,大幅改变了传统IVI的操作习惯。 语音识别Speech recognition,也称为自动语音识别(ASR)、计算机语音识别或语音到文本,是一种使程序能够将人类语音处理成书面格式的能力。 语音识别Speech recognition是计…

【JACS】:用于稳定单原子分散的催化剂架构可对吸附到 Pt 原子、氧化 Pt 簇和 TiO2上金属 Pt 簇的 CO 进行特定位点光谱和反应性测量

摘要&#xff1a;氧化物负载的贵金属纳米粒子是广泛使用的工业催化剂。由于费用和稀有性&#xff0c;开发降低贵金属纳米颗粒尺寸并稳定分散物质的合成方案至关重要。负载型原子分散的单贵金属原子代表了最有效的金属利用几何结构&#xff0c;尽管由于合成均匀且稳定的单原子分…