重要声明:本微信小程序会话管理客户端代码是探索阶段的产物,仅供研究学习,其使用的协议、算法均未和微信最新的要求对齐。生产环境请移步使用 Wafer。
微信的网络请求接口 wx.request()
没有携带 Cookies,这让传统基于 Cookies 实现的会话管理不再适用。为了让处理微信小程序的服务能够识别会话,我们推出了 weapp-session。
weapp-session 使用自定义 Header 来传递微信小程序内用户信息,在服务内可以直接获取用户在微信的身份。
会话层使用 Redis
作为缓存管理,具有高效可靠的特点。
广告:推荐使用腾讯云 Redis 服务
npm install weapp-session
const express = require('express');
const weappSession = require('weapp-session');
const app = express();
app.use(weappSession({
appId: '', // 微信小程序 APP ID
appSecret: '', // 微信小程序 APP Secret
// REDIS 配置
// @see https://www.npmjs.com/package/redis#options-object-properties
redisConfig: {
host: '',
port: '',
password: ''
},
// (可选)指定在哪些情况下不使用 weapp-session 处理
ignore(req, res) {
return /^\/static\//.test(req.url);
}
}));
app.use((req, res) => {
res.json({
// 在 req 里可以直接取到微信用户信息
wxUserInfo: req.$wxUserInfo
});
});
// 其它业务代码
// ...
app.listen(3000);
在微信小程序内需要使用客户端配合,方能和服务器建立会话管理。
会话层的实现和传统 Cookie 的实现方式类似,都是在 Header 上使用特殊的字段跟踪。一个请求的完整流程如下:
request
request
wx.login()
和 wx.getUserInfo()
接口获得 code
、rawData
和 signature
requset
的头部带上 code
、rawData
和 signature
code
供下次调用request
的头部带上保存的 code
request
,中间件从头部提取 code
、rawData
和 signature
字段
code
为空,跳到第 4
步code
不为空,且 rawData
不为空,需要进行签名校验
code
,appid
、app_secret
请求微信接口获得 session_key
和 openid
ERR_SESSION_KEY_EXCHANGE_FAILED
rawData
和 session_key
计算签名 signature2
signature
和 signature2
rawData
为 wxUserInfo
openid
写入到 wxUserInfo
(code, wxUserInfo)
缓存到 RediswxUserInfo
存放在 request.$wxUserInfo
里4
步ERR_UNTRUSTED_RAW_DATA
code
不为空,但 rawData
为空,从 Redis 根据 code
查询缓存的用户信息
request.$wxUserInfo
字段里,跳到第 4
步ERR_SESSION_EXPIRED
request
被业务处理,可以使用 request.$wxUserInfo
来获取用户信息(request.$wxUserInfo
可能为空,业务需要自行处理)