原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处
微信的定位并不是 HTML5,这里很多人都有误解。在一些实现上,并不能想当然地用 HTML5 的思路来思考。比如,微信的请求接口 wx.request 并不支持 cookie 传递,所以会话层不能使用传统的 Session 方式。 ——腾讯云官方的微信小程序云端解决方案
github:https://github.com/CFETeam/weapp-session
从图中可以看出weapp-session使用自定义 Header 来传递微信小程序内用户信息,在服务内可以直接获取用户在微信的身份。会话层使用 Redis 作为缓存管理,比较可靠。
但是也是腾讯在推销自己的产品!!!
以下借鉴自官方文档:
首次请求
调用 wx.login() 和 wx.getUserInfo() 接口获得 code、rawData 和 signature
requset 的头部带上 code、rawData 和 signature
保存 code 供下次调用
非首次请求
request 的头部带上保存的 code
如果 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
现在也在陆陆续续的出好多第三的SESSION管理模块,坐等开源吧,毕竟造轮子这种事情大部分人也不喜欢~