/wafer-session-server

Wafer - 企业级微信小程序全栈方案

Primary LanguagePHPOtherNOASSERTION

Wafer 会话服务器

本项目是 Wafer 组成部分,提供会话服务供 SDK 或独立使用。

会话服务的实现细请参考 Wiki

接口协议

请求

会话服务器提供 HTTP 接口来实现会话管理,下面是协议说明。

  • 协议类型:HTTP
  • 传输方式:POST
  • 编码类型:UTF-8
  • 编码格式:JSON

请求示例:

POST /mina_auth/ HTTP/1.1
Content-Type: application/json;charset=utf-8

{
    "version": 1,
    "componentName": "MA",
    "interface": {
        "interfaceName": "qcloud.cam.id_skey",
        "para": { "code": "...", "encrypt_data": "..." }
    }
}

响应

HTTP 输出为响应内容,下面是响应内容说明:

  • 内容编码:UTF-8
  • 内容格式:JSON

响应示例:

{
    "returnCode": 0,
    "returnMessage": "OK",
    "returnData": {
        "id": "...",
        "skey": "..."
    }
}
  • returnCode - 返回码,如果成功则取值为 0,如果失败则取值为具体错误码;
  • returnMessage - 如果返回码非零,内容为出错信息;
  • returnData - 返回的数据

qcloud.cam.id_skey

qcloud.cam.id_skey 处理用户登录请求。

使用示例:

curl -i -d'{"version":1,"componentName":"MA","interface":{"interfaceName":"qcloud.cam.id_skey","para":{"code":"001EWYiD1CVtKg0jXGjD1e6WiD1EWYiC","encrypt_data":"DNlJKYA0mJ3+RDXD/syznaLVLlaF4drGzeZvJFmjnEKtOAi37kAzC/1tCBr7KqGX8EpiLuWl8qt/kcH9a4LxDC5LQvlRLJlDogTEIwtlT/2jBWBuWwBC3vWFhm7Uuq5AOLZV+xG9UmWPKECDZX9UZpWcPRGQpiY8OOUNBAywVniJv6rC2eADFimdRR2qPiebdC3cry7QAvgvttt1Wk56Nb/1TmIbtJRTay5wb+6AY1H7AT1xPoB6XAXW3RqODXtRR0hZT1s/o5y209Vcc6EBal5QdsbJroXa020ZSD62EnlrOwgYnXy5c8SO+bzNAfRw59SVbI4wUNYz6kJb4NDn+y9dlASRjlt8Rau4xTQS+fZSi8HHUwkwE6RRak3qo8YZ7FWWbN2uwUKgQNlc/MfAfLRcfQw4XUqIdn9lxtRblaY="}}}' http://127.0.0.1/mina_auth/

响应数据:

  • id - 会话 id
  • skey - 会话 skey
  • userInfo - 用户信息

qcloud.cam.auth

使用 qcloud.cam.auth 接口检查用户登录态。

响应数据:

  • true - 登录态有效
  • false - 登录态无效

错误码

                                   
错误码 解释
0 成功
1001 数据库错误
1002 接口不存在
1003 参数错误
1005 连接微信服务器失败
1006新增或修改 SESSION 失败
1007微信返回值错误
1008更新最近访问时间失败
1009请求包不是json
1010接口名称错误
1011参数不存在
1012不能获取 AppID
1013初始化 AppID 失败
40029 CODE 无效
60021 解密失败
60012鉴权失败

数据库设计

全局信息表 cAppInfo 保存会话服务所需要的配置项。

   
Field Type Null key Extra
appid varchar(200) NO PRI 申请微信小程序开发者时,微信分配的 appId
secret varchar(300) NO 申请微信小程序开发者时,微信分配的 appSecret
login_duration int(11) NO 登录过期时间,单位为天,默认 30 天
session_duration int(11) NO 会话过期时间,单位为秒,默认为 2592000 秒(即30天)

会话记录 cSessionInfo 保存每个会话的数据。

               
Field Type Null key Extra
id int(11) NO MUL会话 ID(自增长)
uuid varchar(100) NO 会话 uuid
skey varchar(100) NO 会话 Skey
create_time datetime NO 会话创建时间,用于判断会话对应的 open_id 和 session_key 是否过期(是否超过 `cAppInfo` 表中字段 `login_duration` 配置的天数)
last_visit_time datetime NO 最近访问时间,用于判断会话是否过期(是否超过 `cAppInfo` 表中字段 `session_duration` 的配置的秒数)
open_id varchar(100) NO MUL微信服务端返回的 `open_id` 值
session_key varchar(100) NO 微信服务端返回的 `session_key` 值
user_info varchar(2048) YES 已解密的用户数据

建数据库的详细 SQL 脚本请参考 db.sql

搭建会话管理服务器

选择合适的方式部署 Wafer 服务后,按照部署类型:

  • 自动部署 - 无需进行任何操作,会话服务器已经可以使用
  • 镜像部署 - 按照下面步骤进行初始化工作
  • 自行部署 - 按照下面步骤进行初始化工作

环境准备

确保机器中已安装 LAMP 环境。

代码部署

把本项目代码部署到 /opt/lampp/htdocs/mina_auth 目录中。

自动建表

执行下面命令创建运行时所需表:

/opt/lampp/bin/mysql -u root -p mypassword < /opt/lampp/htdocs/mina_auth/system/db/db.sql

初始化 appId 和 appSecret

登录到 MySql 后,手动插入配置到 cAuth 表中。

/opt/lampp/bin/mysql -u root -p root #登录本地mysql
use cAuth;
insert into cAppinfo set appid='Your appid',secret='Your secret';

测试服务可用性

curl -i -d'{"version":1,"componentName":"MA","interface":{"interfaceName":"qcloud.cam.id_skey","para":{"code":"001EWYiD1CVtKg0jXGjD1e6WiD1EWYiC","encrypt_data":"DNlJKYA0mJ3+RDXD/syznaLVLlaF4drGzeZvJFmjnEKtOAi37kAzC/1tCBr7KqGX8EpiLuWl8qt/kcH9a4LxDC5LQvlRLJlDogTEIwtlT/2jBWBuWwBC3vWFhm7Uuq5AOLZV+xG9UmWPKECDZX9UZpWcPRGQpiY8OOUNBAywVniJv6rC2eADFimdRR2qPiebdC3cry7QAvgvttt1Wk56Nb/1TmIbtJRTay5wb+6AY1H7AT1xPoB6XAXW3RqODXtRR0hZT1s/o5y209Vcc6EBal5QdsbJroXa020ZSD62EnlrOwgYnXy5c8SO+bzNAfRw59SVbI4wUNYz6kJb4NDn+y9dlASRjlt8Rau4xTQS+fZSi8HHUwkwE6RRak3qo8YZ7FWWbN2uwUKgQNlc/MfAfLRcfQw4XUqIdn9lxtRblaY="}}}' http://127.0.0.1/mina_auth/