yicll / go-wafer-session-server

微信wafer-session-server golang版本

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Golang Wafer 会话服务器

本项目是 Wafer 组成部分中的wafer-session-server的升级版本

使用golang开发,支持redismysql,提供会话服务供 SDK 或独立使用。

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

接口协议

请求

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

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

请求示例:

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

{
    "version": 1,
    "componentName": "MA",
    "interface": {
        "interfaceName": "qcloud.cam.id_skey",
		"appid": your appid", //该字段是在原生的wafer session Server api上新增的,不传的话代表只支持单server
        "para": { "code": "...", "encrypt_data": "..." }
    }
}

响应

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

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

响应示例:

{
    "returnCode": 0,
    "returnMessage": "OK",
    "returnData": {
    	"id": "session info uuid", // 本次登录的session标识uuid
    	"skey": "session info skey", // 本次登录的session标识skey,建议和id一起组合成session登录唯一标识
		"user_info": {
			"openId": "oFRD80IWuaryqCHQmcHV5jKpCHYo",
			"uionId": "o3L7v1GhRiwsgvcaFGSVu5cbtOWo",
			"nickName": "yicll",
			"gender": 1,
			"language": "zh_CN",
			"city": "Fangshan",
			"province": "Beijing",
			"country": "China",
			"avatarUrl": "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTL1F9UiaAlLTeJRAIXfmyUxWj485QI08dWR9eU16qKvfVediaYZNDOBUiars3icjJSW7fxJDlO8ymWYBA/132",
		}
    }
}
  • 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","appid":"wxe325db015fc632af","para":{"code":"001EWYiD1CVtKg0jXGjD1e6WiD1EWYiC","encrypt_data":"DNlJKYA0mJ3+RDXD/syznaLVLlaF4drGzeZvJFmjnEKtOAi37kAzC/1tCBr7KqGX8EpiLuWl8qt/kcH9a4LxDC5LQvlRLJlDogTEIwtlT/2jBWBuWwBC3vWFhm7Uuq5AOLZV+xG9UmWPKECDZX9UZpWcPRGQpiY8OOUNBAywVniJv6rC2eADFimdRR2qPiebdC3cry7QAvgvttt1Wk56Nb/1TmIbtJRTay5wb+6AY1H7AT1xPoB6XAXW3RqODXtRR0hZT1s/o5y209Vcc6EBal5QdsbJroXa020ZSD62EnlrOwgYnXy5c8SO+bzNAfRw59SVbI4wUNYz6kJb4NDn+y9dlASRjlt8Rau4xTQS+fZSi8HHUwkwE6RRak3qo8YZ7FWWbN2uwUKgQNlc/MfAfLRcfQw4XUqIdn9lxtRblaY="}}}' http://127.0.0.1:8888

响应数据:

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

qcloud.cam.auth

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

响应数据:

  • 同前一个接口,根据returnCode判断是否登录成功,0表示成功,将返回用户信息,否则根据提示引导用户重新授权登录

错误码

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

项目配置文件解析

配置文件位置在src/wafer-session-server/conf/app.conf

具体配置信息及其含义如下

appname = wafer-session-server 		// app名称,建议不要修改
httpport = 8888						// 服务监听端口,当dev、prod节点里没有配置该项的时候,取该端口为默认值
runmode = dev						// 当前运行环境,dev:开发环境、prod:生产环境
autorender = false					// 自动渲染模板,api项目,该项必须为false
copyrequestbody = true				// 默认为true,不允许更改
EnableDocs = true					// 是否开始自动化文档功能

[dev]								// 当rundmode=dev的时候,读取该节点的配置信息
httpport = 8888						// 服务监听端口
dbdriver = redis					// 当前服务db引擎,mysql、redis
									// 当dbdriver=mysql时,下面mysql.*配置必须配置正确
mysql.host = 127.0.0.1				// mysql数据库地址
mysql.port = 3306					// mysql数据库端口
mysql.user = root					// mysql用户名
mysql.password = 123456				// mysql密码
mysql.db = cAuth					// mysql数据库名称
mysql.debug = true					// 是否开启debug模式,开启的话,将会在stdout中输出sql信息
									// 当dbdriver=redis时,下面的redis.*配置必须配置正确
redis.host = 127.0.0.1				// redis连接地址
redis.port = 6379					// redis连接端口
redis.password = 					// redis连接密码,不需要密码的话,该配置为空
redis.db = 1						// redis连接db
redis.maxidle = 10					// redis连接池允许最大空闲连接数
redis.maxactive = 1000				// redis连接池允许最大连接数
redis.timeout = 30					// 空闲连接最大允许留存超时时间


[prod]								// 当rundmode=prod的时候,读取该节点的配置信息
httpport = 8889						// 服务监听端口
dbdriver = redis					// 当前服务db引擎,mysql、redis
									// 当dbdriver=mysql时,下面mysql.*配置必须配置正确
mysql.host = 127.0.0.1				// mysql数据库地址
mysql.port = 3306					// mysql数据库端口
mysql.user = root					// mysql用户名
mysql.password = 123456				// mysql密码
mysql.db = cAuth					// mysql数据库名称
mysql.debug = true					// 是否开启debug模式,开启的话,将会在stdout中输出sql信息
									// 当dbdriver=redis时,下面的redis.*配置必须配置正确
redis.host = 127.0.0.1				// redis连接地址
redis.port = 6379					// redis连接端口
redis.password = 					// redis连接密码,不需要密码的话,该配置为空
redis.db = 1						// redis连接db
redis.maxidle = 10					// redis连接池允许最大空闲连接数
redis.maxactive = 1000				// redis连接池允许最大连接数
redis.timeout = 30					// 空闲连接最大允许留存超时时间

搭建会话管理服务器

环境准备

golang version: 1.9.2

golang环境请自行搭建,最小需要版本为1.9.2,GOPATH、GOROOT等环境变量请自己设置好

数据库

根据项目选择,redis、mysql数据库请自行部署,部署成功之后修改配置文件里的相关配置

如果选择mysql的话,需要使用sql语句进行建表,详见db.sql

项目编译打包

将项目下载到本地

git clone http://git.domob-inc.cn/mp-lib/go-wafer-session-server wafer-session-server
cd wafer-session-server
./build.sh
#target目录下的wafer-session-server.tar.gz就是用于上线部署的压缩包

服务启动

将打包成功的tar包拷贝到需要上线的服务器,例如你将tar包拷贝到了服务器的/tmp目录下

mkdir wafer-session-server
cd wafer-session-server
cp /tmp/wafer-session-server.tar.gz .
tar zxvf wafer-session-server.tar.gz
./control.sh start

初始化 appId 和 appSecret

API初始化

直接请求服务API进行appid和secret初始化

curl -i -d'{"version":1,"componentName":"MA","interface":{"interfaceName":"qcloud.cam.initapp","appid":"[替换成你的APPID]","para":{"secret":"[替换成你的APP SECRET]"}}}' htt://127.0.0.1:8888

mysql

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

use cAuth;
insert into cAppinfo set appid='Your appid',secret='Your secret';

redis

登录到redis后,手动插入app key

redis-cli -h 127.0.0.1 -p 6379
> select 1
> hmset app_[your appid] appid [your appid] secret [your sceret] ld 30 sd 2592000 ip 0.0.0.0

测试服务可用性

sh
curl -i -d'{"version":1,"componentName":"MA","interface":{"interfaceName":"qcloud.cam.id_skey","appid":"wxe325db015fc632af","para":{"code":"001btntB1UQJ7d0VVasB1ZKGtB1btnth","encrypt_data":"qs8afGiRlAsjIcNuG9CqxMbMgr6tpaTqOrpa9szUSrYfObQR54ThGhmAadEhkuW/6Flyqa+r+p/4BuKnCLx81TzwqM+7gP3pdOG4rLvlvWCtDes2blsGZm2wNFOqqwj+xfVQqj25JznX75lNbObY5Ic67ZTiaszMzJym0QDy7vaBQMCwdGLfTiVPc35cpfq9ZZzGDVVewHoNGauhPrkOxdu+ec/M6/Fp39J32yEyfi/7lkUwauobdDl7ovazjoFGvfeBOjdXlmBGuF0+W5KKjdsXINLHWL1m4gZD5twLQxICC4A6W6YvXoLAHr41eslvfFvGptIJFOW4GXnEZyhzc7tgubiSvMy9cMA0NcB6o8qIh7GrZ1sp6FSdrCDaDj3zXNlHzgbXvNfX/Q7PkQ18AaofjapSnoEOUxfiHwR/yNpK05yqviCgY7UdoNUSKd3GtMXg+KJTG5yfvOfN23JiaQnJ4P30wJ15IJb07pQsEMk0C6QthDfPvRnxpU07ERgGL7FKmP1f3Z2HlrzET/Z2Jw==","iv":"nU6TJmoVfrz8Vt8FJbrZYA=="}}}' http://127.0.0.1:8888

mysql数据库设计

当项目选择使用mysql为存储,则下面是mysql的数据库详细设计,如果选择redis为存储,请忽略

全局信息表 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(自增长)
appid varchar(100) NO session归属的appid
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-session-server数据迁移

如果选择mysql为存储,可以直接复用原来的db结构,需要更改cSessionInfo表,修改如下

alter table cSessionInfo add appid varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL default '';
update cSessionInfo set appid=[Your appid];

About

微信wafer-session-server golang版本

License:Other


Languages

Language:Go 99.8%Language:Shell 0.2%Language:Makefile 0.0%Language:Smarty 0.0%