SpringBoot实现微信小程序后台登录

实现微信小程序登录功能

  • 技术栈&工具
    • 登录流程
      • 流程图
            • ==具体流程请参考微信小程序官方文档:== [微信小程序官方API](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html).
  • 代码实现
    • 一.pom文件配置可能会用到的一些依赖(dependencies)
        • 笔者这里只是列出需要哪些依赖,具体的依赖版本大家可以去Maven中央仓库自行查询:[Maven中央仓库](https://mvnrepository.com/).
    • 二.部分yml文件配置(application.yml)
    • 三.工具类(Utils)
          • 1. Http请求工具类(HttpClientUtil)
          • 2. 微信工具类(WechatUtil)
          • 2. Token生成与解析工具类(JwtUtil)
          • 2. 生成分布式自增id工具类(IdWorker)
          • 2.时间戳生成类(DateTimeTransferUtil)
    • 四.实体类(pojo)
          • 用户(User)
    • 五.Controller层(UserController)
    • 六.Service层(UserServiceImpl)
    • 七.Dao层(UserDao)
    • 八.Token拦截器及其配置类(TokenInterceptor&InterceptorConfig)
    • 九.全局异常处理类(GlobalException&BasicException)
  • 整体的框架:
      • 到这里登录的代码就结束了,这里显示的是后端代码,笔者也是第一次开发小程序后台,对微信小程序不太熟悉,如果有什么问题请指正!

技术栈&工具

  1. SpringBoot
  2. MyBatis
  3. Junit
  4. Mysql连接驱动以及数据库连接池(我这里用的是druid)
  5. lombok
  6. jwt
  7. fastjson
  8. http请求工具
  9. base64加密解密
  10. shiro依赖和缓存

登录流程

  1. 根据流程图的说明,首先是微信小程序的前端调用wx.login()接口获取到code值,然后前端使用wx.request()或者前端自己封装的请求,来调用后台自己写的登录接口(login),后台接收到前端传来的code值、用户非敏感信息:rawData,签名:signature(还可以获取其他更多的数据,具体看需求)
  2. 后台调用微信接口服务里面的jscode2session接口,官方文档有说明,详情可看官方文档,这个jscode2session接口会返回session_keyopenid等值,一般是这两个值,unionid看满足条件返回
  3. 后端在接收到这两个值后,进行签名校验,需要用到前端传的signature
  4. 通过openid在数据库中查询该用户,若返回结果是空,则是新用户,如果返回结果不为空,则是老用户
  5. 调用IdWorker生成唯一skey,用于维护微信小程序用户与服务端的会话
  6. 将生成的skey和openid封装进token生成令牌传入前端

流程图

SpringBoot实现微信小程序后台登录_第1张图片

具体流程请参考微信小程序官方文档: 微信小程序官方API.

代码实现

一.pom文件配置可能会用到的一些依赖(dependencies)

笔者这里只是列出需要哪些依赖,具体的依赖版本大家可以去Maven中央仓库自行查询:Maven中央仓库.
<dependencies>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-securityartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-aopartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
        
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>${junit.version}version>
        dependency>
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>${mysql.version}version>
        dependency>
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druidartifactId>
            <version>${druid.version}version>
        dependency>
        
        <dependency>
            <groupId>org.mybatis.spring.bootgroupId>
            <artifactId>mybatis-spring-boot-starterartifactId>
            <version>${mybatis.spring.boot.version}version>
        dependency>
        
        <dependency>
            <groupId>com.github.pagehelpergroupId>
            <artifactId>pagehelper-spring-boot-starterartifactId>
            <version>1.3.0version>
        dependency>
        
        <dependency>
            <groupId>log4jgroupId>
            <artifactId>log4jartifactId>
            <version>${log4j.version}version>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <version>${lombok.version}version>
            <optional>trueoptional>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-configuration-processorartifactId>
            <optional>trueoptional>
        dependency>

        
        <dependency>
            <groupId>org.apache.commonsgroupId>
            <artifactId>commons-lang3artifactId>
            <version>3.9version>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-redisartifactId>
        dependency>
        
        <dependency>
            <groupId>io.jsonwebtokengroupId>
            <artifactId>jjwtartifactId>
            <version>0.9.1version>
        dependency>
        
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>fastjsonartifactId>
            <version>1.2.47version>
        dependency>
        
        <dependency>
            <groupId>org.apache.httpcomponentsgroupId>
            <artifactId>httpclientartifactId>
            <version>4.5.2version>
        dependency>
        <dependency>
            <groupId>org.bouncycastlegroupId>
            <artifactId>bcprov-jdk16artifactId>
            <version>1.46version>
        dependency>

        
        
        <dependency>
            <groupId>org.apache.shirogroupId>
            <artifactId>shiro-coreartifactId>
            <version>1.4.0version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-apiartifactId>
                    <groupId>org.slf4jgroupId>
                exclusion>
            exclusions>
        dependency>

    dependencies>

二.部分yml文件配置(application.yml)

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: 数据库账号
    password: 数据库密码
    url: jdbc:mysql://localhost:3306/wechat_applet?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
mybatis:
    mapper-locations: classpath:mapping/*Dao.xml
    type-aliases-package: com.tom.entity.pojo
    configuration:
      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      
jwt:
  config:
    key: SecretKey #服务端加密所使用的密文(自拟)
    ttl: 21600000 #毫秒

三.工具类(Utils)

1. Http请求工具类(HttpClientUtil)
package com.tom.utils;


import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http

你可能感兴趣的:(java,后端,spring,boot)