会话层实现包含两个部分:
服务器端:https://github.com/CFETeam/weapp-session客户端:https://github.com/CFETeam/weapp-session-client
我们的 Demo 直接使用这两个仓库,可以快速地拥有会话层的能力。
会话层的实现和传统 Cookie 的实现方式类似,都是在 Header 上使用特殊的字段跟踪。一个请求的完整流程如下:
客户端(微信小程序)发起请求request
weapp-session-client包装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)
缓存到 Redis把wxUserInfo
存放在request.$wxUserInfo
里跳到第4
步签名不一致,响应ERR_UNTRUSTED_RAW_DATA
如果code
不为空,但rawData
为空,从 Redis 根据code
查询缓存的用户信息找到用户信息,存放在request.$wxUserInfo
字段里,跳到第4
步没找到用户信息(可能是过期),响应ERR_SESSION_EXPIRED
request
被业务处理,可以使用request.$wxUserInfo
来获取用户信息(request.$wxUserInfo
可能为空,业务需要自行处理)
源代码
可从 Github 获取https://github.com/CFETeam/weapp-session