为了方便描述,本次攻略将会分为以下四个部分进行讲解:
- 微信小程序登录流程
- 前端获取微信小程序登录态并传递给后端
- 后端维护微信小程序登录态
- 示例代码说明
下面将逐一进行讲解。
1. 微信小程序登录流程
-
用户授权:用户通过微信小程序点击登录按钮,小程序调用
wx.login()
方法获取临时登录凭证code,并在回调函数中将code传递给小程序前端。 -
前端获取登录态:小程序前端通过
wx.getUserInfo()
方法获取用户基本信息,其中包括用户的微信昵称、头像等,并将code和基本信息一并传递给后端。 -
后端验证登录态:后端通过调用微信官方提供的API,换取用户的唯一标识
openid
和会话密钥session_key
,并将其存入登录态数据库。 -
前端携带登录态请求后端:前端将获取到的登录态传递给后端,后端通过验证登录态数据库中是否存在该用户的
openid
并且没有过期,来判断用户是否登录过。
2. 前端获取微信小程序登录态并传递给后端
前端获取微信小程序登录态主要是通过wx.login()
方法和wx.getUserInfo()
方法实现:
// 获取登录凭证code(前端示例代码)
wx.login({
success: function(res) {
var code = res.code; // 得到登录凭证code
wx.getUserInfo({
success: function(res) {
var userInfo = res.userInfo; // 用户基本信息
var encryptedData = res.encryptedData; // 包含用户敏感信息的加密数据
var iv = res.iv; // 解密算法的向量
// 将code、userInfo等信息传递给后端
wx.request({
url: 'https://www.example.com/login',
method: 'POST',
data: {
code: code,
encryptedData: encryptedData,
iv: iv,
// 其他自定义字段
},
success: function(res) {
// 登录成功回调
},
fail: function(res) {
// 登录失败回调
}
});
}
})
}
})
3. 后端维护微信小程序登录态
后端维护微信小程序登录态主要是通过验证客户端传入的登录态信息,来判断用户是否授权登录成功。具体实现步骤如下:
- 构建登录态数据库
登录状态库主要是存储用户的openid
和会话密钥session_key
等信息,以及过期时间等信息,以便后端在验证登录态时进行操作。
- 解密客户端传入的
encryptedData
客户端传入的encryptedData
字段包含着用户的敏感信息,需要通过解密算法将其解密出来。解密算法主要包括以下两步骤:
- 解密前获取密钥:
// 获取session_key
String sessionKey = redisUtils.hget("login:sessionKey", code);
byte[] sessionKeyBytes = sessionKey.getBytes("utf-8");
- 解密:
// 解密encryptedData得到用户敏感信息
String result = AESUtil.decrypt(encryptedData, sessionKeyBytes, iv.getBytes("utf-8"));
- 验证登录态有效性
通过验证数据库中是否存在openid
并且没有过期,来判断用户是否登录过。具体实现代码如下:
// 验证登录态有效性
private boolean verifyLoginState(String openid) {
if (redisTemplate.hasKey("login:state:" + openid)) {
long expireTime = redisTemplate.getExpire("login:state:" + openid, TimeUnit.SECONDS);
if (expireTime > 0 && expireTime < 2592000L) {
redisTemplate.expire("login:state:" + openid, 2592000L, TimeUnit.SECONDS);
return true;
}
}
return false;
}
4. 示例代码说明
示例代码可以参考以下两个库:WechatLogin
和miniprogram-login
- WechatLogin:https://github.com/nizhenliang/WechatLogin
WechatLogin
提供了一个简单的演示了微信小程序如何使用Java语言实现登录授权和用户信息解密的过程,主要包括了客户端和服务端两个部分,其中客户端通过wx.login()
和wx.getUserInfo()
方法获取登录凭证和敏感数据信息,并将其作为参数发送给服务端;服务端则通过一些API接口,换取到用户的唯一标识openid
,并将其作为关键信息存入Redis数据库。
- miniprogram-login:https://github.com/usetww/miniprogram-login
miniprogram-login
提供了一个完整的示例代码,其主要功能有:登录态维护、解密、数据存储、登录态验证等,还涉及到Token验证和API加密等相关技术。代码主要由三部分组成:
- 小程序前端代码:前端传递信息、解密信息、处理前后端Token请求等;
- 后端代码:处理API请求接口、Session认证、Token验证等;
- 签名库代码:支持对API签名、验签和Hash计算等操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现微信小程序登录态维护的示例代码 - Python技术站