# 游戏登录
## 文档说明
本文档为手游接入登录模块提供指引,游戏登录是玩家在GTarcade平台进入游戏服务器的唯一入口。
## 前端接入
### 进游戏
>主要是为了拉起游戏进程,给游戏方传输相关的参数
+ 游戏接入前需要在游戏中心提前配置,可以联系微端运营同学帮忙配置。
**通信方式:** 启动游戏进程微端传给游戏前端的参数
**参数内容:**
| 参数名 | 必选 | 类型 | 说明 |
| :----------- | :--- | :--- | -------------------------------------- |
| account | 是 | Str | 账号 |
| g_id | 是 | Str | 游戏 ID |
| s_id | 是 | Str | 服务器 ID |
| op_id | 是 | Str | 渠道 ID |
| port_id | 是 | Str | 端口号 |
| LanguageType | 否 | Str | 语言类型 |
| other | 否 | Str | 如果游戏放需要更多参数,可根据需求补充 |
语言对应字段
zh_CN=简体中文
zh_TW=繁体中文
ar=阿拉伯语
es=西班牙语
en=英语
id=印尼语
it=意大利语
de=德语
pl=波兰语
th=泰语
tr=土耳其语
ru=俄语
pt=葡萄牙语
fr=法语
jp=日语
kr=朝鲜语、韩语
vi=越南语
+ 登录进游戏流程如下

### 关联请求
>主要是为了微端精准的识别每一个游戏,防止用户在平台打开多个游戏时,相互之间的通信不会出现错误
**通信方式:** 游戏传给微端的参数(TCP)
**加密方式:** AES
**数据格式:** JSON
**参数内容:**
| 参数名 | 必选 | 类型 | 说明 |
| :------ | :--- | :--- | ---------------------------------------------- |
| account | 是 | Str | 账号 |
| g_id | 是 | Str | 游戏 ID |
| s_id | 是 | Str | 服务器 ID |
| op_id | 是 | Str | 渠道 ID |
| msg_id | 是 | Str | 本地通信的消息 ID,用于分辨每次通信接口,写死9 |
### 游戏登录
> 游戏登录成功后,游戏返回的状态,是为了微端本地记录游戏的状态,方便管理游戏
**通信方式:** 微端发送给游戏的(TCP)
**加密方式:** AES
**数据格式:** JSON
**参数内容:**
| 参数名 | 必选 | 类型 | 说明 |
| :-------- | :--- | :--- | --------------------------------------------- |
| gta_id | 是 | Str | 每次启动 gta 的唯一 ID |
| client_id | 是 | Str | 每一个游戏分配的通信 ID |
| msg_id | 是 | Str | 本地通信的消息 ID,用于分辨每次通信接口,写死1 |
| code | 是 | Str | 登录状态 |
**返回结果**
```
{
errcode: 1, // 0 表示登录成功,其他表示登录失败,并在 msg中返回登录失败详细原因
msg: "获取成功", // 成功、失败信息
data:[{
"account": "帐号", // 帐号
"g_id": 9, // 游戏 ID
"s_id": "1308440003", // 服务器ID
"op_id": 503, // 渠道 ID
"gta_id": "1212",// 每次启动 gta的唯一 ID
"client_id": "1", // 每一个游戏分配的通信 ID
"msg_id": "1" //本地通信的消息 ID,用于分辨每次通信接口,写死1
}]
}
```
## 后端接入
**简要描述:**
- 微端游戏登录【手游】- 面向研发侧文档
**返回示例**
由微端客户端请求并透传该返回值给游戏客户端,游戏客户端在登入游戏服之前进行二次校验,校验后以此account登入游戏服
```
{
code: 0,
message: "success",
data: {
account: "0060015_1603261287587442417267131", //平台用户账号, 游戏方以此账号为准,登入游戏,跟supersdk登入账号保持一致
game_id: 182,//游戏id
game_name: "legacy of discord", //游戏名
type: "micro",//游戏接入类型
time: 1608621455,//当前服务器时间戳
sign: "16f08edd1d703dcd16b52736d5215002",//校验签名,只有game_data字段不参与签名生成,其它返回的参数均参与签名,返回字段数不固定
game_data: {
ip: "61.174.15.246", //客户端ip
country_code: "CN", //国家
continent_code: "AP", //地区
osdk_ticket: "eyJvc2RrX2dhbWVfaWQiOjQwOCwidXNlcl9pZCI6InZ4eXdhbmdAZ21haWwuY29tIiwibG9naW5fc2RrX25hbWUiOiJtaWNybyIsImFjY291bnRfc3lzdGVtX2lkIjoiMDA2MDAxNSIsIm9zZGtfdXNlcl9pZCI6IjAwNjAwMTVfdnh5d2FuZ0BnbWFpbC5jb20iLCJjaGFubmVsX2lkIjoyNzI4LCJleHRlbmQiOiIiLCJ0aW1lIjoxNjI1NDcyODM1LCJpcCI6IjYxLjE3NC4xNS4yNDYiLCJzaWduIjoiMWJmMDFmNGJiZTE1ZDQ0MzAzOTEzMjhlNTgyOTBkYTcifQ==" //兼容supersdk ticket
}//如有特殊需求可使用透传参数
}
}
```
**数据有效性校验**
**校验支持2种方式,2选1:**
**方式1:**
校验sign,只有game_data字段不参与签名生成,其它返回的参数均参与签名,返回字段数不固定
加密方式:
public static function genVerify($data, $signKey)
{
ksort($data);
$items = array();
foreach ($data as $key => $value) {
$items[] = $key . "=" . $value;
}
return md5(join("&", $items) . $signKey);
}
通过以上加密函数,跟返回结果中的sign进行对比,一致则通过校验,加密$signKey在接入之前单独申请, 每个游戏单独生成, 登录账号采用account字段值;
**方式2:**
如已接入supersdk,可校验game_data里的osdk_ticket ,生成和解析规则通supersdk,请参考supersdk 文档-osdk_ticket 解析算法: [SuperSDK服务端接口文档](http://docs.supersdk.cn/zh/docs/%E6%8E%A5%E5%85%A5%E6%96%87%E6%A1%A3/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%8E%A5%E5%85%A5%E6%96%87%E6%A1%A3/docs/server.md "SuperSDK服务端接口文档")
私钥由微端侧分配,接入前先找微端开发申请获取私钥,登录账号使用经解密算法校验通过后的得到的osdk_user_id值;
**接口实效性:**
接口信息有效性,建议5min以内
**返回参数说明**
|参数名|类型|说明|
|:----- |:-----|----- |
|code |int |0,成功,其它失败 |
|msg |string |返回状态 |
|data |array |返回数据 |