Skip to content

会话服务

Together we can fly! edited this page Nov 20, 2016 · 10 revisions

会话服务可以让开发者很方便地在业务服务器中获取微信用户信息,然后在此基础上处理其他业务逻辑。

会话服务涉及四个模块协作处理通信过程,它们分别是:

  • 微信小程序客户端:需要 SDK 支持,可参考 Demo 实现
  • 业务服务器:需使用服务端 SDK,包括 JavaPHPC#Node 四个语言
  • 会话管理服务器:使用 PHP 实现,源码在此
  • 微信服务器

会话服务主要包含处理用户登录处理业务请求时校验登录态两个功能。以下阐述这两个功能的具体实现。

变量字典

下面两个流程中,会涉及到的变量如下。

变量 来源 作用
code 客户端 登录凭据,通过 wx.login() 获取。后续用于换取会话
encryptedData 客户端 加密的用户数据,通过 wx.getUserInfo() 获取,需要进行登录流程后才能解密
iv 客户端 解密 encryptedData 时需要使用的向量,通过 wx.getUserInfo() 获取
appId 微信分配 表示小程序唯一 Id
appSecret 微信分配 表示小程序密钥,用于敏感 API 操作
session_key 微信服务器 表示一个微信会话,这个变量可以用于解密用户数据。微信要求该变量不能在外网传输。
openId 微信服务器 表示微信用户在当前小程序中的唯一身份,可以用于生成会话 ID
id 会话服务器 会话服务器根据 openIdsession_key 生成,可以表示 一个会话
skey 会话服务器 与会话 id 对应的安全码,保证会话安全
userInfo 会话服务器 会话服务器通过 ivsession_keyencryptedData 解密的结果,包含微信用户信息

处理用户登录

登录流程

  • 客户端 SDK 获取登陆参数
    • 调用 wx.login() 获取登录凭证 code
    • 调用 wx.getUserInfo() 获取用户信息的加密数据 encryptedData 和加密初始向量 iv
  • 客户端 SDK 调用 wx.request() 向业务服务器发起登录请求(codeencryptedDataiv 以请求头的形式发送)
  • 业务服务器收到请求后
    • 从请求头中取出 codeencryptedDataiv
    • 调用会话管理服务器提供的用户登录接口 qcloud.cam.id_skey 请求登录
  • 会话管理服务器收到请求后
    • 调用微信服务器 jscode2session 接口,使用 code 换取 session_key 和用户 openId
    • 使用 session_keyopenId 处理得到自己的 idskey 写入数据库用来管理会话
    • 使用 session_keyiv 对加密的用户信息 encryptedData 进行解密得到用户明文信息 userInfo
    • idskeyuserInfo 一并返回给业务服务器
  • 业务服务器收到会话管理服务器的响应后,将 idskey 返回给微信小程序客户端
  • 微信小程序客户端将 idskey 存入 storage 中供后续请求使用

处理业务请求时校验登录态

登录态校验

  • 小程序客户端使用 SDK 的请求方法 qcloud.request() 发送业务请求
  • SDK 通过 wx.getStorage() 取出会话参数 idskey
  • 调用 wx.request() 把业务请求发送到业务服务器(idskey 会附加在请求头中)
  • 业务服务器收到请求后,从请求头中取出 idskey,调用会话管理服务器提供的登录态校验接口
  • 会话管理服务器收到请求后,校验参数 idskey,返回用户信息 userInfo(校验成功)或失败信息(校验失败)给业务服务器
    • 校验成功时,业务服务器可以使用用户信息处理其他业务逻辑,并进行响应
    • 校验失败时,业务服务器将错误信息直接响应给微信小程序客户端,SDK 如果发现错误是登录态失效,会自动重新发起登录流程后重新进行业务请求