SPI参考
云游戏平台服务端SPI接口能力包括会话鉴权、游戏准入、容器生命周期通知等服务,本篇介绍SPI接入步骤、接口标准等内容。
接入说明
云游戏PaaS服务需要在会话鉴权、游戏准入等场景调用客户业务系统。客户方需要按照云游戏PaaS统一制定的接入标准进行接入。标准说明如下:
需要提供相应的HTTPS服务,供云游戏PaaS平台调用;
需要按照云游戏PaaS平台制定的标准模版,统一输入输出数据格式;
需要采用在云游戏运营中心申请的服务端AppKey对数据进行验签和加签;
需要满足云游戏PaaS平台制定的质量标准;
接入步骤
1、服务端AppKey申请
通过阿里云账号登录云游戏PaaS服务控制台,选择运营中心,在项目列表中选中需要接入的【项目】,点击【应用列表管理】,点击【创建应用】,设备类型选择【服务端(SPI)】。
同一个项目只能创建一个【服务端(SPI)】应用。服务端接口将采用该应用对应的AppKey,AppSecret进行加签和验签操作。
2、创建SPI接口
通过阿里云账号登录云游戏PaaS服务控制台,选择运营中心,在项目列表中选中需要接入的【项目】,点击【SPI配置管理】,点击【创建SPI接口】
输入模板名称
选择模版类型
接入服务HTTPS协议地址URL
输入版本号(版本号不可重复,同一个模版类型如果存在多个版本的已上线SPI接口,云游戏平台会调用版本号最高的SPI接口)
输入扩展参数(可选,部分接口需要)
输入方法名(可选,部分接口需要)
3、调试并上线
自主完成开发和调试工作,在【SPI配置管理】页面,选择需要上线的接口,点击【上线】按钮,进入调试并上线页面,在该页面输入调试参数并且调试成功,方可点击【上线】按钮,完成接口的上线操作。上线之后云游戏平台的业务流程将会在相应的场景调用该SPI服务,请务必保证接口已经具备上线条件,再进行【上线】操作。
4、稳定性保障
客户方需要提供接口流量的预估,云游戏PaaS平台技术人员将会针对项目维度设置限流,熔断等稳定性指标
客户方接口稳定性达不到要求,云游戏PaaS平台将会采取限流,降级等措施以保障平台服务的稳定性
接口标准
接口协议:HTTPS
host:业务方定义
接口名称:业务方自定义
1、公共传入参数
参数 | 类型 | 含义 | 取值说明 |
action | String | 模版类型 | 必须,根据不同接口传不同参数 |
version | Integer | 接口版本 | 必须,默认值1,会请求所有上线接口中版本最高的一个 |
timestamp | String | 调用的时间戳,必须符合ISO8601规范,并需要使用UTC时间,时区为+0。 | 必须,举例子:2016-02-23T12:46:24Z |
accessKey | String | 服务端AppKey | 必须,云游戏paas平台统一颁发 |
signatureMethod | String | 签名方法 | 必须,HMAC-SHA1 |
signatureVersion | String | 方法版本 | 必须,1.0 |
signatureNonce | String | 随机数据 | 必须,端侧生成的随机数,长度在8-32位之间。生成方式可自己决定 |
format | String | 返回值类型 | 必须,JSON |
signature | String | 签名 | 必须,生成方式参见下文 |
2、公共返回参数
参数 | 类型 | 说明 | 举例 |
code | Int | 返回编码 |
|
message | String | 返回说明 | OK:success |
data | 明细数据 | ||
data.signature | String | 签名 | 必须,通过云游戏PaaS平台统一颁发的AccessSecret加签,加签data中的数据即可 |
data.signatureNonce | String | 签名用随机数据 | 必须,生成的随机数,长度在8-32位之间。生成方式可自己决定 |
data.timestamp | String | 调用的时间戳,必须符合ISO8601规范,并需要使用UTC时间,时区为+0。 | 必须,2016-02-23T12:46:24Z |
返回码code
编码 | 说明 |
0 | 成功 |
-1 | 失败 |
返回说明message
编码 | 说明 |
OK | 成功 |
其他自定义文案 | 失败 |
接口模板
1、会话鉴权
模版说明
会话鉴权接口通过统一的标准,对客户的Session进行识别,从而做到识别客户的账号体系。整个Session鉴权流程如下图所示:
入参(需要带上公共入参)
参数 | 类型 | 含义 | 取值说明 |
action | String | 模版类型 | 必须,AUTH_CHECK |
accountToken | String | 客户端SDK入参数userToken | 必须,业务方token数据,业务方自己解析 |
accountId | String | 客户端SDK入参数userId | 非必须,业务方accountId数据,业务方自己解析 |
frontAppKey | String | 客户端AppKey | 必须,端侧使用的AppKey |
返回(需带上公共参数)
参数 | 类型 | 说明 | 举例 |
code | Integer | 返回编码 | 公共参数 |
message | String | 返回说明 | 公共参数 |
data | 明细数据 | 公共参数 | |
data.sessionState | Integer | 会话状态 0:未识别或已过期;1:识别成功 | 必须 |
data.accountId | String | 用户唯一标示 | sessionState=1时必须返回;sessionState=0时可以不返回 |
data.ttl | Integer | 身份信息缓存的时间,单位:秒 | 非必须,默认60秒,该场景不允许为0,必须指定缓存时间 |
data.accountDomain | Integer | 账号类型 | 非必须,如果业务方有多套账号类型,需要在该字段中返回,默认值0 |
降级策略
信任客户端SDK主动传递的userId
2、游戏准入
模版说明
游戏准入接口模版通过统一的标准,在启动游戏时,请求客户服务进行最终的授权确认,整个游戏准入流程如下图所示:
入参(需要带上公共入参)
参数 | 类型 | 含义 | 取值说明 |
action | String | 模版类型 | 必须,GAME_ACCESS |
gameId | String | 云游戏PaaS平台游戏ID | 必须 |
accountToken | String | 客户端SDK入参数userToken | 必须,业务方token数据,业务方自己解析 |
frontAppKey | String | 客户端AppKey | 必须,端侧使用的AppKey |
ip | String | 客户端请求IP | 非必须 |
userLevel | Integer | 用户调度等级 | 非必须,端侧启动游戏时指定的用户调度等级 |
返回(需带上公共参数)
参数 | 类型 | 含义 | 取值说明 |
code | Int | 返回编码 | 公共参数 |
message | String | 返回说明 | 公共参数 |
data | 明细数据 | 公共参数 | |
data.accessState | Integer | 准入状态 | 必须 0:不允许启动1:允许启动 |
data.ttl | Integer | 准入状态缓存的时间,单位:秒 | 非必须,默认60秒,若为0,则表示不需要缓存;若小于0或者为空,则采用默认值 |
data.message | String | 原因描述 | 非必须 |
data.trialTag | Integer | 试玩标记1:跳过试玩0:进入试玩null:进入试玩 | 非必须,在当前项目配置了试玩策略的情况下才会生效 |
降级策略
跳过游戏准入授权确认,全部可以启动游戏(在当前项目配置了试玩策略的情况下,全部视为试玩)
3、容器生命周期通知
模版说明
容器生命周期(指一次游戏运行的完整流程)通知接口模版通过统一的标准,在游戏容器生命周期的不同场景,将状态反馈给客户服务。
入参(需要带上公共入参)
参数 | 类型 | 含义 | 取值说明 |
action | String | 模版类型 | 必须,CONTAINER_STATE_MESSAGE |
messageType | String | 消息类型 | 必须,
|
projectId | String | 项目ID | 必须,游戏运行的项目ID |
accountId | String | 账号ID | 必须,启动游戏的玩家账号ID |
accountDomain | String | 账号域 | 非必须,启动游戏的玩家账号域,默认值0 |
gameSessionId | String | 游戏会话ID | 必须,一次游戏调度的唯一标识 |
gameId | String | 游戏ID | 必须,运行的游戏ID |
time | Long | 当前行为的时间 | 必须,Unix时间戳(单位:毫秒) |
startTime | Long | 容器启动时间 | 必须,Unix时间戳(单位:毫秒) |
linkedAccountIdList | String | 当前游戏中的玩家accountId集合 | 非必须,多个逗号分割 |
playerDetailList | String | 所有加入游戏的玩家信息集合 | 非必须,JSON格式:
示例:[{"isInitiator":true,"startTime":1606113124250,"accountId":"test1"},{"isInitiator":false,"startTime":1606113124250,"accountId":"test2"}, ....] |
tags | String | 启动游戏时传入的自定义标签 | 非必须,如有多个标签将采用半角逗号分割 |
返回(需带上公共参数)
参数 | 类型 | 含义 | 取值说明 |
code | Int | 返回编码 | 公共参数 |
message | String | 返回说明 | 公共参数 |
data | 明细数据 | 公共参数 | |
data.consumeState | Integer | 消费状态 | 必须 0:消费失败 1:消费成功 |
data.message | String | 原因描述 | 非必须 |
降级策略
丢弃消息(在客户服务响应失败/无法响应超过一定阈值,qps超过最大阈值时才会进入降级流程)
扩展参数
该接口需要通过扩展参数指定需要订阅的消息类型(请根据您的实际场景指定需要订阅的消息类型即可,所有类型均为可选)。订阅的消息需要正常消费,如果消费失败,云游戏平台方会发起重试最多16次,超过16次之后将会丢弃该消息,扩展参数示例如下:
{"subscribeContainerMessage":["CONTAINER_START","CONTAINER_START_FAILED","CONTAINER_QUIT","PLAYER_START"]}
接口说明
为了链路性能考虑,请按需订阅您需要使用的消息类型;
整体容器生命周期通知的接口调用不保证实时性,时间以消息体中的time,startTime等时间为准;
当返回消费失败时,都会重复投递。若不希望重复收到消息时请返回消费成功;
容器退出消息“CONTAINER_QUIT”会尽量保证触达,当请求失败后会发起重试。
4、批量停止游戏回调通知
模版说明
客户方调用云游戏平台提供的批量停止游戏接口时,将采用该方式回调客户方进行通知,将进度反馈给客户服务。(该SPI接口需要配合批量停止游戏API一起使用)。
入参(需要带上公共入参)
参数 | 类型 | 含义 | 取值说明 |
action | String | 模版类型 | 必须,BATCH_STOP_GAME_SESSIONS_CALLBACK |
projectId | String | 项目ID | 必须,发起调用的项目ID |
gameId | String | 游戏ID | 必须,发起调用的游戏ID |
queuersCount | Long | 剩余排队人数 | 必须,操作批量停止的游戏目前剩余排队人数 |
playersCount | Long | 剩余游戏中人数 | 必须,操作批量停止的游戏目前剩余的游戏中人数 |
trackInfo | String | 附加链路信息 | 非必须 |
timeStamp | Long | 当前时间 | 必须,Unit时间戳(单位:毫秒) |
返回(需带上公共参数)
参数 | 类型 | 含义 | 取值说明 |
code | Int | 返回编码 | 公共参数 |
message | String | 返回说明 | 公共参数 |
data | 明细数据 | 公共参数 | |
data.consumeState | Integer | 消费状态 | 必须 0:消费失败1:消费成功 |
data.message | String | 原因描述 | 非必须 |
降级策略
丢弃消息(在客户服务响应失败/无法响应超过一定阈值,qps超过最大阈值时才会进入降级流程)
5、游戏调度事件回调通知
模版说明
在游戏排队调度过程中,将采用该方式回调客户方进行通知,将结果反馈给客户服务。
入参(需要带上公共入参)
参数 | 类型 | 含义 | 取值说明 |
action | String | 模版类型 | 必须,GAME_DISPATCH_EVENT_CALLBACK |
projectId | String | 项目ID | 必须,游戏运行的项目ID |
gameId | String | 游戏ID | 必须,运行的游戏ID |
gameSessionId | String | 游戏会话ID | 非必须,一次游戏调度的唯一标识 |
accountId | String | 账号ID | 必须,启动游戏的玩家账号ID |
accountDomain | String | 账号域 | 非必须,启动游戏的玩家账号域,默认值0 |
eventCode | String | 事件编码 | 必须,10000:调度成功 20000: 异常退出 |
eventMessage | String | 事件说明 | 非必须,调度成功,已分配容器 |
timeStamp | Long | 当前行为的时间 | 必须,Unix时间戳(单位:毫秒) |
dispatchInfo | String | 调度详细信息 | 非必须 |
dispatchInfo字段描述说明:
参数 | 类型 | 含义 | 取值说明 |
dispatched | Boolean | 是否已经分配容器 | 必须 |
failCode | String | 错误码 | 非必须,
|
queued | Boolean | 是否已经加入排队队列 | 必须 |
返回(需带上公共参数)
参数 | 类型 | 含义 | 取值说明 |
code | Int | 返回编码 | 公共参数 |
message | String | 返回说明 | 公共参数 |
data | 明细数据 | 公共参数 | |
data.consumeState | Integer | 消费状态 | 必须 0:消费失败1:消费成功 |
data.message | String | 原因描述 | 非必须 |
降级策略
丢弃消息(在客户服务响应失败/无法响应超过一定阈值,qps超过最大阈值时才会进入降级流程)
验签/加签方式
云游戏PaaS平台发起的请求将会采用以下方式加签,客户方返回参数同样需要对data中的值按照以下方式加签:https://help.aliyun.com/document_detail/25492.html?spm=5176.product25365.6.804.NbGBng