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

这篇具有很好参考价值的文章主要介绍了spring boot3登录开发-微信小程序用户登录设计与实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

⛰️个人主页:     蒾酒

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

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


目录

写在前面

登录流程

流程解析

具体实现

相关代码

说明

服务端

小程序端

写在最后


写在前面

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

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

登录流程

如图:

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

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

流程解析

  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();
    }

小程序端

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

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

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开发微信小程序服务端中用户登录功能的设计思路,希望对你有帮助。文章来源地址https://www.toymoban.com/news/detail-841041.html

到了这里,关于spring boot3登录开发-微信小程序用户登录设计与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot+微信小程序_保存微信登录者的个人信息

    微信小程序 开发平台,提供有一类 API ,可以让开发者获取到微信登录用户的个人数据。这类 API 统称为 开放接口 。 Tip: 微信小程序开发平台,会把微信登录用户的个人信息分为 明文数据 和 敏感数据 。 明文数据 也称为公开数据,开发者可以直接获取到,如登录者的昵称

    2024年02月10日
    浏览(27)
  • spring boot +微信小程序项目,通过微信公众号实现指定用户消息长期推送

    用户登录小程序,后台记录用户的小程序openId和用户唯一的UnionId。然后用户触发公众号事件(关注公众号或者发送指定消息),后台获取到用户公众号的openId,再调用接口通过公众号的openId查询用户的UnionId,再和数据库里的UnionId进行匹配,将用户的公众号openId存入数据库。此

    2024年02月03日
    浏览(40)
  • 真的简单,单手用Spring Boot 开发一个微信小程序

      嗨,大家好,现在微信使用的用户很多,作为开发人员也可以建立一个自己的微信小程序,本期与大家分享一下作者建立微信小程序的开发流程。   百度搜索微信公众号平台,然后扫码登录注册一个微信公众号,   进入申请页面之后,需要及时完善小程序相关信息

    2024年02月10日
    浏览(36)
  • spring boot整合第三方微信开发工具 weixin-java-miniapp 实现小程序微信登录

    有时候项目需要用到微信登录或获取用户的手机号码,weixin-java-miniapp是一个好用的第三方工具,不用我们自己写httpcline调用。 导入jar包 添加一个resource.properties文件,写上小程序的appid和secret 添加两个配置文件 WxMaProperties.java WxMaConfiguration.java 如何使用 小程序给微信发送消息

    2024年02月16日
    浏览(33)
  • spring boot3单模块项目工程搭建-上(个人开发模板)

      ⛰️个人主页:     蒾酒 🔥系列专栏 :《spring boot实战》 目录 写在前面 上文衔接 常规目录创建 common目录 exception.handle目录 result.handle目录 controller目录 service目录 mapper目录 entity目录 test目录 写在最后 本文介绍了springboot开发后端服务,单模块项目工程搭建。单模块搭建出

    2024年04月29日
    浏览(26)
  • spring boot3单模块项目工程搭建-下(个人开发模板)

    ⛰️个人主页:     蒾酒 🔥系列专栏 :《spring boot实战》 目录 写在前面 上文衔接 常用依赖介绍以及整合 web组件 测试组件 样板代码生成 数据库连接器 常用工具包 面向切面编程 ORM框架 数据连接池 接口测试、文档导出 缓存中间件 参数校验 认证鉴权 基础功能完善 跨域问

    2024年04月28日
    浏览(27)
  • 微信小程序实现用户登录(详)

            * 源码已经上传到资源处,需要的话点击跳转下载 |  源码下载         用户登录是微信小程序的重要内容,那么今天就讲用户登录的一个流程,当然微信官方文档也有相关的一个登录流程图,这里也给大家附上地址:官方 | 小程序登录 。       用户登录流程可

    2024年02月03日
    浏览(29)
  • 用户登录案例练习(flask+微信小程序)

    目录 flask 微信小程序 1.项目后端步骤 具体步骤可参考flask官网:flask 中文网 (1)创建虚拟环境 (2)激活虚拟环境 (3)在虚拟环境里边安装Flask (4) 粘贴官网的最小flask代码 (5)启动flask服务 2.代码书写 3.运行flask测试  在index.wxml中添加用户登录的标签 在index.js书写函数

    2024年02月16日
    浏览(26)
  • 微信小程序登录,解决无法获取用户信息方法

    在上面的代码中,首先定义了应用的AppID和AppSecret。然后,实现了获取微信用户access_token的方法getAccessToken()和获取微信用户信息的方法getUserInfo()。其中,getAccessToken()方法需要传入微信小程序登录时获取的code,会返回一个包含access_token和openid的Map;getUserInfo()方法需要传入用户

    2024年02月11日
    浏览(51)
  • 【微信小程序】wx.login实现用户登录

    之前用手机号授权的方式实现登录,现在重新整理成笔记 (1)前端通过wx.login()获取登录凭证code,每次调用的code均不同,有效时间5分钟,每个code可验证一回 (2)前端通过wx.request(我这里是用封装好的request.login)将code发送给后端 (3)后端将appid,appSecret(密钥)和code发送给微信接口

    2024年02月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包