微信小程序网络之SESSION管理(9)

  • • 发表于 8年前
  • • 作者 Fredia
  • • 5549 人浏览
  • • 0 条评论
  • • 最后编辑时间 8年前
  • • 来自 [技 术]

原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处

微信的定位并不是 HTML5,这里很多人都有误解。在一些实现上,并不能想当然地用 HTML5 的思路来思考。比如,微信的请求接口 wx.request 并不支持 cookie 传递,所以会话层不能使用传统的 Session 方式。 ——腾讯云官方的微信小程序云端解决方案
github:https://github.com/CFETeam/weapp-session

设计架构

腾讯会话管理中间件
从图中可以看出weapp-session使用自定义 Header 来传递微信小程序内用户信息,在服务内可以直接获取用户在微信的身份。会话层使用 Redis 作为缓存管理,比较可靠。
但是也是腾讯在推销自己的产品!!!
以下借鉴自官方文档:

STEP1 客户端(微信小程序)发起请求 request

STEP2 weapp-session-client 包装 request

首次请求
调用 wx.login() 和 wx.getUserInfo() 接口获得 code、rawData 和 signature
requset 的头部带上 code、rawData 和 signature
保存 code 供下次调用
非首次请求
request 的头部带上保存的 code

STEP3 服务器收到请求 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

STEP4 request 被业务处理,可以使用 request.$wxUserInfo 来获取用户信息(request.$wxUserInfo 可能为空,业务需要自行处理)

现在也在陆陆续续的出好多第三的SESSION管理模块,坐等开源吧,毕竟造轮子这种事情大部分人也不喜欢~

分享到:
0条评论
Ctrl+Enter
作者

Fredia

Fredia

APP:1 帖子:12 回复:30 积分:552

已加入社区[2939]天

CTOWAY

作者详情》
Top