会话层实现包含两个部分:
服务器端:https://github.com/CFETeam/weapp-session客户端:https://github.com/CFETeam/weapp-session-client
我们的 Demo 直接使用这两个仓库,可以快速地拥有会话层的能力。
会话层的实现和传统 Cookie 的实现方式类似,都是在 Header 上使用特殊的字段跟踪。一个请求的完整流程如下:

客户端(微信小程序)发起请求requestweapp-session-client包装request首次请求调用wx.login()和wx.getUserInfo()接口获得code、rawData和signaturerequset的头部带上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_EXPIREDrequest被业务处理,可以使用request.$wxUserInfo来获取用户信息(request.$wxUserInfo可能为空,业务需要自行处理)
源代码
可从 Github 获取https://github.com/CFETeam/weapp-session

