会话层实现包含两个部分:

服务器端:https://github.com/CFETeam/weapp-session客户端:https://github.com/CFETeam/weapp-session-client

我们的 Demo 直接使用这两个仓库,可以快速地拥有会话层的能力。

会话层的实现和传统 Cookie 的实现方式类似,都是在 Header 上使用特殊的字段跟踪。一个请求的完整流程如下:

客户端(微信小程序)发起请求requestweapp-session-client包装request首次请求调用wx.login()wx.getUserInfo()接口获得coderawDatasignaturerequset的头部带上coderawDatasignature保存code供下次调用非首次请求request的头部带上保存的code服务器收到请求request,中间件从头部提取coderawDatasignature字段如果code为空,跳到第4步如果code不为空,且rawData不为空,需要进行签名校验使用codeappidapp_secret请求微信接口获得session_keyopenid如果接口失败,响应ERR_SESSION_KEY_EXCHANGE_FAILED使用签名算法通过rawDatasession_key计算签名signature2对比signaturesignature2签名一致,解析rawDatawxUserInfoopenid写入到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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。