📌 微信小程序第一节 ——自定义顶部、底部导航栏以及获取胶囊体位置信息。
📌 微信小程序第二节 —— 自定义组件
📌 微信小程序第三节 —— 页面跳转的那些事儿
📌 微信小程序第四节—— 网络请求那些事儿
- 😜作 者:是江迪呀
- ✒️本文关键词:
微信小程序
、登陆
、token
、前端
、后端
、验证
、加密
- ☀️每日 一言:趁青春尚存,别为生活沉沦。
前言
在微信小程序的开发过程中,如果想要保留用户
的数据
(比如:操作记录
、购物车信息
等等)就必须要用户
登陆。为什么呢?比如说,数据库中有一条数据
你如何知道这条数据属于谁?属于那个用户呢?这就需要用户登录来获取用户
的唯一标识
从而确定这条数据是属于哪个用户的,那么如何做微信小程序的登陆功能呢?让我们使用Springboot
框架+AOP
一起来学习吧!
一、流程
微信小程序登录
流程:
开发者服务器
处理流程:
1.1 获取用户Code
通过wx.login
来获取临时登录code
:
wx.login({
success (res) {
if (res.code) {
//发起网络请求
wx.request({
url: 'https://example.com/onLogin',
data: {
code: res.code
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
1.2 获取appid
在注册微信开发者账
后,可以在微信小程序管理后台
获取appid
:
1.3 获取appsecret
小程序密钥同样是在注册微信开发者平台账号后,在管理后台获取的:
由于微信小程序密钥不以明文的方式展示,如果忘记了,重置
下就可以了。
1.4 开发者服务向微信接口服务发起请求
拿着微信code
、appid
、appsecret
在开发者服务器
去请求微信接口服务
换取 openId
和secretKey
(这里我们使用ApiPost工具来进行请求,当然PostMan工具也行):
调用微信接口服务
接口(注意是Get
请求):
https://api.weixin.qq.com/sns/jscode2session?
1.5 返回值
{
"session_key": "xxxxx",
"openid": "xxxxx"
}
拿到返回值后,应该入库
,保存一下。
数据库结构如下:
等下次该用户登录时,走完1.4
流程后,可以根据返回值中的openid
在我们库中找到该用户,然后进行后续的操作。
1.6 自定义token
所谓token
就是用来确认用户的身份证,拿到下面的返回值后,我们有下面两种方式生成自定义token
:
(1)使用业务ID
生成token
(推荐使用,后续的内容都是以用户ID作为例子的):
(2)使用session_key
生成token
:
{
"session_key": "xxxxx"
}
(3)生成token
的工具:
使用md5
加密工具来生成token
,工具类如下:
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
public class AESUtil {
/**
* 加密密钥
*/
private static final String ENCODE_KEY = "test_key_secret_";
/**
* 偏移量
*/
private static final String IV_KEY = "0000000000000000";
public static String encryptFromString(String data, Mode mode, Padding padding) {
AES aes;
if (Mode.CBC == mode) {
aes = new AES(mode, padding,
new SecretKeySpec(ENCODE_KEY.getBytes(), "AES"),
new IvParameterSpec(IV_KEY.getBytes()));
} else {
aes = new AES(mode, padding,
new SecretKeySpec(ENCODE_KEY.getBytes(), "AES"));
}
return aes.encryptBase64(data, StandardCharsets.UTF_8);
}
public static String decryptFromString(String data, Mode mode, Padding padding) {
AES aes;
if (Mode.CBC == mode) {
aes = new AES(mode, padding,
new SecretKeySpec(ENCODE_KEY.getBytes(), "AES"),
new IvParameterSpec(IV_KEY.getBytes()));
} else {
aes = new AES(mode,</