-
Notifications
You must be signed in to change notification settings - Fork 333
会话服务
Together we can fly! edited this page Nov 20, 2016
·
10 revisions
会话服务可以让开发者很方便地在业务服务器中获取微信用户信息,然后在此基础上处理其他业务逻辑。
会话服务涉及四个模块协作处理通信过程,它们分别是:
- 微信小程序客户端:需要 SDK 支持,可参考 Demo 实现
- 业务服务器:需使用服务端 SDK,包括 Java、PHP、C#、Node 四个语言
- 会话管理服务器:使用 PHP 实现,源码在此
- 微信服务器
会话服务主要包含处理用户登录及处理业务请求时校验登录态两个功能。以下阐述这两个功能的具体实现。
下面两个流程中,会涉及到的变量如下。
变量 | 来源 | 作用 |
---|---|---|
code |
客户端 | 登录凭据,通过 wx.login() 获取。后续用于换取会话 |
encryptedData |
客户端 | 加密的用户数据,通过 wx.getUserInfo() 获取,需要进行登录流程后才能解密 |
iv |
客户端 | 解密 encryptedData 时需要使用的向量,通过 wx.getUserInfo() 获取 |
appId |
微信分配 | 表示小程序唯一 Id |
appSecret |
微信分配 | 表示小程序密钥,用于敏感 API 操作 |
session_key |
微信服务器 | 表示一个微信会话,这个变量可以用于解密用户数据。微信要求该变量不能在外网传输。 |
openId |
微信服务器 | 表示微信用户在当前小程序中的唯一身份,可以用于生成会话 ID |
id |
会话服务器 | 会话服务器根据 openId 和 session_key 生成,可以表示 一个会话 |
skey |
会话服务器 | 与会话 id 对应的安全码,保证会话安全 |
userInfo |
会话服务器 | 会话服务器通过 iv 和 session_key 对 encryptedData 解密的结果,包含微信用户信息 |
- 客户端 SDK 获取登陆参数
- 调用
wx.login()
获取登录凭证code
- 调用
wx.getUserInfo()
获取用户信息的加密数据encryptedData
和加密初始向量iv
- 调用
- 客户端 SDK 调用
wx.request()
向业务服务器发起登录请求(code
、encryptedData
、iv
以请求头的形式发送) - 业务服务器收到请求后
- 从请求头中取出
code
、encryptedData
、iv
- 调用会话管理服务器提供的用户登录接口
qcloud.cam.id_skey
请求登录
- 从请求头中取出
- 会话管理服务器收到请求后
- 调用微信服务器 jscode2session 接口,使用
code
换取session_key
和用户openId
- 使用
session_key
和openId
处理得到自己的id
和skey
写入数据库用来管理会话 - 使用
session_key
和iv
对加密的用户信息encryptedData
进行解密得到用户明文信息userInfo
- 将
id
、skey
和userInfo
一并返回给业务服务器
- 调用微信服务器 jscode2session 接口,使用
- 业务服务器收到会话管理服务器的响应后,将
id
和skey
返回给微信小程序客户端 - 微信小程序客户端将
id
和skey
存入storage
中供后续请求使用
- 小程序客户端使用 SDK 的请求方法
qcloud.request()
发送业务请求 - SDK 通过
wx.getStorage()
取出会话参数id
和skey
- 调用
wx.request()
把业务请求发送到业务服务器(id
和skey
会附加在请求头中) - 业务服务器收到请求后,从请求头中取出
id
和skey
,调用会话管理服务器提供的登录态校验接口 - 会话管理服务器收到请求后,校验参数
id
和skey
,返回用户信息userInfo
(校验成功)或失败信息(校验失败)给业务服务器- 校验成功时,业务服务器可以使用用户信息处理其他业务逻辑,并进行响应
- 校验失败时,业务服务器将错误信息直接响应给微信小程序客户端,SDK 如果发现错误是登录态失效,会自动重新发起登录流程后重新进行业务请求
[ 返回 Wiki 首页 ]
Wafer - 企业级微信小程序全栈方案
如果 Wiki 内容不能解决你的疑惑,欢迎提交 Issue 进行反馈或者加入 QQ 群(216602757)进行讨论