提交 e3cbbea1 作者: 黄程泽

H5对接文档

上级 5242c3cb
# H5 SDK 对接文档-v1.0
# H5 SDK 对接文档-v1.0
### 目录
1.[接入说明](#sec1)
    1.1 [术语表](#sec1.1)
    1.2 [数据字典](#sec1.2)
    1.3 [链接登录](#sec1.3)
    1.4 [主动登录](#sec1.4)
    1.5[下单逻辑](#sec1.5)
2.[服务端接入](#sec2)
    2.1 [接口规则](#sec2.1)
        请求域名
        请求方式
        请求格式
        返回格式
        状态说明
        签名规则
        签名示例
    2.2 [登录认证](#sec2.2)
        接口说明
        接口地址
        请求参数
        返回参数
        请求示例
    2.3 [角色信息上报](#sec2.3)
        接口说明
        接口地址
        请求参数
        返回参数
        请求示例
    2.4 [支付通知](#sec2.4)
        接口说明
        接口地址
        请求参数
        返回参数
        请求示例
3.[H5 SDK接入](#sec3)
    3.1 [配置导入H5 SDK](#sec3.1)
        说明
        SDK地址
        必要参数
        导入示例
    3.2 [H5 SDK初始化](#sec3.2)
        说明
        调用方式
        示例
    3.3 [链接登录](#sec3.3)
        说明
        链接参数
        示例
    3.4 [主动登录](#sec3.4)
        说明
        调用方式
        示例
    3.5 [SDK 角色上报](#sec3.5)
        说明
        调用方式
        请求参数
        返回参数
        EVENT枚举
        示例
    3.6 [SDK 下单](#sec3.6)
        接口说明
        调用方式
        请求参数
        返回参数
        示例
    3.7 [SDK 订单查询](#sec3.7)
        接口说明
        调用方式
        请求参数
        返回参数
        示例
## 1. 接入说明<a name="sec1"></a>
### 1.1 术语表<a name="sec1.1"></a>
> | 名称 | 说明 |
> | ---------- | ------------------------------------------------------------ |
> | CP | 游戏研发商。 |
> | H5_SDK | 由平台方提供给游戏研发商,用于游戏客户端接入平台登录,支付。 |
> | SDK服务 | 由平台方开发,用于完成SDK的登录,支付流程,承接游戏服务端的数据。 |
> | 游戏服务 | 游戏研发商开发,为游戏提供服务。 |
> | 游戏客户端 | 游戏研发方商开发的网页版游戏。 |
> | 支付服务 | 由平台方调用支付服务,包括微信支付,支付宝支付等 |
> | 游戏盒子 | 由平台方开发的游戏总入口,可以实现游戏登陆,支付,切换等;H5游戏以iframe的形式在游戏盒子中运行。 |
> | H5游戏入口 | 由CP方提供,进入H5游戏的入口链接。 |
### 1.2 数据字典<a name="sec1.2"></a>
> | 名称 | 说明 |
> | ----------- | ---------------------------------- |
> | player_id | 用户在平台的一个游戏中的唯一标识。 |
> | user_token | 用户在平台登录的会话标识。 |
> | game_id | 游戏在平台的唯一标识。 |
> | game_secret | 平台方提供,游戏签名秘钥。 |
> | cp_order_id | 游戏研发商订单唯一标识 |
> | order_id | 平台方订单唯一标识,与cp_order_id一一对应 |
> | h5_game_url | H5游戏入口,由CP方提供,进入H5游戏的入口链接。 |
### 1.3 链接登录<a name="sec1.3"></a>
```mermaid
sequenceDiagram
链接登录->>游戏客户端:链接(携带参数)
note over 链接登录,游戏客户端:game_id,player_id,state,user_token
游戏客户端->>游戏服务:game_id,player_id,user_token
游戏服务->>SDK服务:登录验证
SDK服务-->>游戏服务:验证结果
游戏服务->>游戏服务:登录验证
游戏服务-->游戏客户端:验证结果
```
### 1.4 主动登录<a name="sec1.4"></a>
```mermaid
sequenceDiagram
游戏客户端->>H5_SDK:调用登录
H5_SDK->>玩家:重新登录
玩家-->H5_SDK:账号密码
H5_SDK->>SDK服务:账号密码&game_id
SDK服务-->H5_SDK:player_id,user_token,game_id
H5_SDK->>H5_SDK:链接登录
```
### 1.5 下单逻辑<a name="sec1.5"></a>
```mermaid
sequenceDiagram
玩家->>游戏客户端: 充值
游戏客户端->>H5_SDK: 订单信息
H5_SDK->>玩家:询问支付方式
玩家-->>H5_SDK:支付方式
H5_SDK->>SDK服务器:订单信息&支付方式&os
SDK服务器-->>H5_SDK:订单号&支付渠道信息
H5_SDK-->>游戏客户端:订单状态(待支付)
H5_SDK->>玩家:等待支付
玩家-->>H5_SDK:支付
H5_SDK->>支付服务:调用支付
支付服务->>SDK服务:支付结果
SDK服务->>游戏服务:支付结果
游戏服务-->>SDK服务:success/fail
游戏服务->>游戏客户端:发货通知
游戏客户端-->>玩家:发货
```
## 2. 服务端接入<a name="sec2"></a>
### 2.1 接口规则<a name="sec2.1"></a>
##### 请求域名
> 【HTTPS】zyou.wozhangwan.com/api
##### 请求方式
> 【POST】
##### 请求格式
> 【JSON】
##### 返回格式
> 【JSON】
##### 状态说明
| 状态码 | 说明 |
| ------ | -------- |
| 1 | 成功 |
| -1 | 错误 |
| -100 | 未登录 |
| -422 | 参数错误 |
##### 签名规则
> **签名秘钥**
>
> game_secret 为16位字符串,由 SDK 对接时提供,每一个小游戏单独提供一个 game_secret
> **签名串**
>
> 请求参数(去除sign)通过参数名作升序排序;如果参数值是一个对象,需要将该对象通过参数名升序排序后转换为json字符串;将排好序的参数与game_secret以一下格式进行字符串拼接(game_secret放在最后)
>
> key1=value1&key2=value2&key3=value3&game_secret=secret
> **签名算法**
>
> 【md5】
>
> sign = md5(签名串)
> ##### 注意
>
> <u>如果参数值是一个对象,需要将该对象通过参数名升序排序后转换为json字符串;</u>
>
> <u>转换json注意不要对中文进行转义</u>
##### 签名示例
```php
<php?
$gameSecret = "game_secret";
$params = ["player_id" => 1245, "game_id" => 14];
$signStr = '';
ksort($params, SORT_REGULAR);
foreach ($params as $key => $val) {
if (is_array($val)) {
ksrot($val, SORT_REGULAR); //对对象参数进行排序
$val = json_encode($val, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
}
$signStr .= $key . '=' . $val . '&';
}
$signStr .= 'game_secret=' . $gameSecret;
$sign = md5($signStr);
```
### 2.2 登录认证<a name="sec2.2"></a>
##### 接口说明
> 小游戏通过 SDK 获得 用户user_token, 游戏服务端需要在用户登录游戏成功后调用登录验证接口,验证user_token是否为有效登录用户会话,SDK 服务端需要通过该接口判断用户是否登录游戏服务 。
>
> 注意:该接口有调用频率限制,建议游戏服务端在完成用户登录后调用该接口;
##### 接口地址
> 【POST】 /h5_sdk/auth/checkLogin
##### 请求参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ----------------------------------- |
> | Content-Type | true | application/json | |
> | User-Token | true | | 小游戏登录后由 SDK 返回的user_token |
> **Body**:
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | --------- | ---- | ------ | ------ | ---------------------------------- |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID |
> | player_id | true | Int | - | 小游戏登录后由 SDK 返回的player_id |
> | sign | true | String | - | 参数签名 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ----- | ------ | ------ | -------------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | false | OBJECT | [] | 返回数据(空) |
>
##### 请求示例
```php
<php?
public function checkLogin(){
$host = 'https://zyou.wozhangwan.com/api';
$checkLoginUrl = '/mini_sdk/auth/checkLogin';
$url = $host.$checkLoginUrl;
$gameSecret = "game_secret";
$body = ["player_id" => 1245, "game_id" => 14];
$userToken = "user_token";
$body["sign"] = makeSign($body, $gameSecret);
$headers = ["Content-Type:application/json","User-Token:".$userToken];
$response = curl_post($url, $body, $hearders);
}
public function makeSign($params,$gameSecret){
$signStr = '';
ksort($params, SORT_REGULAR);
foreach ($params as $key => $val) {
if (is_array($val)) {
ksort($val, SORT_REGULAR);
$val = json_encode($val, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
}
$signStr .= $key . '=' . $val . '&';
}
$signStr .= 'game_secret=' . $gameSecret;
return md5($signStr);
}
public function curl_post($url, $body, $headers){
//初始化
$curl = curl_init ( );
//设置抓取的url
curl_setopt ( $curl, CURLOPT_URL , $url);
//设置头文件的信息作为数据流输出
curl_setopt ( $curl, CURLOPT_HEADER , 1 );
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER , 1 );
//设置post方式提交
curl_setopt ( $curl, CURLOPT_POST , 1 );
//设置post参数
curl_setopt ( $curl, CURLOPT_POSTFIELDS , json_encode($body) );
//设置请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
//执行命令
$data = curl_exec ( $curl );
//关闭URL请求
curl_close ( $curl );
//显示获得的数据
return json_decode($data, true);
}
```
### 2.3 角色信息上报<a name="sec2.3"></a>
##### 接口说明
> 上报游戏角色信息到 SDK 服务器;
>
> 选接,客户端或者服务端一个端接入即可;
##### 接口地址
> 【POST】/h5_sdk/role/serverReport
##### 请求参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ----------------------------------- |
> | Content-Type | true | application/json | |
> | User-Token | true | | 小游戏登录后由 SDK 返回的user_token |
> **Body:**
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :--------------------------------- |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID |
> | player_id | true | Int | - | 小游戏登录后由 SDK 返回的player_id |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | - | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;online_time | false | Int | 0 | 本次在线时长 |
> | sign | true | String | - | 签名 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | | | | |
##### EVENT枚举
> | EVENT | 说明 |
> | -------- | -------- |
> | create | 创建角色 |
> | online | 角色上线 |
> | offline | 角色下线 |
> | level_up | 角色升级 |
> | delete | 删除角色 |
> | recharge | 角色充值 |
> | other | 其他 |
##### 请求示例
```php
<php?
public function report(){
$host = 'https://zyou.wozhangwan.com/api';
$checkLoginUrl = '/mini_sdk/role/severReport';
$url = $host.$checkLoginUrl;
$gameSecret = "game_secret";
$body = ["player_id" => 1245,
"game_id" => 14,
"role" =>[
"event" => 1,
"server_id" =>1,
"server_name" => "区服一",
"cp_role_id" => "roleId",
"role_name" => "角色名称",
"role_level" => 11,
"role_vip" => 0,
"combat_num" => 0,
"online_time" => 0,
]];
$userToken = "user_token";
$body["sign"] = makeSign($body, $gameSecret);
$headers = ["Content-Type:application/json","User-Token:".$userToken];
$response = curl_post($url, $body, $hearders);
}
public function makeSign($params,$gameSecret){
$signStr = '';
ksort($params, SORT_REGULAR);
foreach ($params as $key => $val) {
if (is_array($val)) {
$val = json_encode($val, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
}
$signStr .= $key . '=' . $val . '&';
}
$signStr .= 'game_secret=' . $gameSecret;
return md5($signStr);
}
public function curl_post($url, $body, $headers){
//初始化
$curl = curl_init ( ) ;
//设置抓取的url
curl_setopt ( $curl , CURLOPT_URL , $url) ;
//设置头文件的信息作为数据流输出
curl_setopt ( $curl , CURLOPT_HEADER , 1 ) ;
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt ( $curl , CURLOPT_RETURNTRANSFER , 1 ) ;
//设置post方式提交
curl_setopt ( $curl , CURLOPT_POST , 1 ) ;
//设置post参数
curl_setopt ( $curl , CURLOPT_POSTFIELDS , json_encode($body) ) ;
//设置请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
//执行命令
$data = curl_exec ( $curl ) ;
//关闭URL请求
curl_close ( $curl ) ;
//显示获得的数据
return json_decode($data, true);
}
```
### 2.4 支付通知<a name="sec2.4"></a>
##### 接口说明
> 需要游戏服务端完成该接口,接收平台充值成功的信息。
##### 接口地址
> 【POST】充值结果通知地址,由 CP 方提供
##### 通知参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ---- |
> | Content-Type | true | application/json | |
> | User-Token | | | |
> **Body:**
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :----------------------------------------------------------- | :--- | :-------- | :----- | :----------------------------------------------------------- |
> | order | true | Object | - | 订单相关 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_id | true | String | - | 平台订单ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_order_id | true | String | - | 游戏传入的外部订单号,服务器会根据这个订单号生成对应的平台订单号,<br>请保证每笔订单传入的订单号的唯一性 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_price | true | String | - | 商品单价(分) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount | true | Int | | 商品总价(分) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_id | true | String | - | 商品 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_cnt | true | String | - | 商品数量 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pay_time | true | Timestamp | - | 支付时间(时间戳) |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID |
> | player_id | true | Int | - | 游戏接入时分配的游戏ID |
> | sign | true | String | - | 签名(签名规则参照2.1签名规则,签名的key由SDK提供) |
>
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | | | | |
## 3. H5 SDK 接入<a name="sec3"></a>
### 3.1 配置导入H5 SDK<a name="sec3.1"></a>
##### 说明
> 游戏客户端通过引入外部js的方式,导入H5 SDK
##### SDK地址
> https://sdk.zwnet.cn/h5_sdk.js?v=1.0
##### 必要参数
> | 参数 | 说明 |
> | ----------- | -------------------------------- |
> | game_id | 游戏唯一标识,由平台方提供 |
> | h5_game_url | 需要由CP方提供进入游戏的入口链接 |
##### 导入示例
> ```javascript
> <script src="https://sdk.zwnet.cn/h5_sdk.js?v=1.0"></script>
> ```
>
### 3.2 H5 SDK 初始化<a name="sec3.2"></a>
---
##### 说明
> 游戏客户端需要在一开始初始化H5 SDK的对象,并注册角色上报(updateRole)、下单(createOrder)、订单查询(checkOrder)的回调通知;游戏客户端通过回调通知获得角色上报(updateRole)、下单(createOrder)、订单查询(checkOrder)的结果。
##### 调用示例
> ```javascript
> new zwsdk(config:Object)
> ```
##### 示例
> ```javascript
> const sdk = new zwsdk({
> updateRoleCallBack: (e) => {
> //处理角色上报的结果
> },
> createOrderCallBack: (e) => {
> //处理下单的结果
> },
> checkOrderCallBack: (e) => {
> //处理订单查询的结果
> }
> })
> ```
>
### 3.3 链接登录<a name="sec3.3"></a>
##### 说明
> 玩家通过游戏盒子登录后,游戏盒子在游戏入口链接(h5_game_url)后携带参数,游戏客户端需要将对应的参数回传给游戏服务器,通过[登录认证](#sec2.2)接口进行登录验证,如果校验成功则登录成功。具体流程逻辑以参考 [链接登录](#sec1.3)
##### 链接参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :--------- | :--- | :----- | :----- | :------------------------------------------ |
> | game_id | true | Int | - | 游戏在平台的唯一标识。 |
> | player_id | true | Int | - | 用户在平台的一个游戏中的唯一标识。 |
> | user_token | true | String | - | 用户登录后获取的token,用于验证用户是否登录 |
##### 示例
> 假设由CP方提供的h5_game_url为https://xxx.game.com,携带参数后最终地址为https://xxx.game.com?game_id=108&player_id=19902&user_token=O4T8Ua47Y7TtIuwcY2jbM71rZnTcg457Y2MzZTU4MjU0OWE5ZGQxOTg3YmYO0O0O
### 3.4 主动登录<a name="sec3.3"></a>
---
##### 说明
> 当游戏未登录时(例如:游戏登录状态失效,登录状态失败时),需要游戏客户端调起游戏盒子的登陆。调起登陆后,用户需要通过游戏盒子进行重新登录。
##### 调用方式
> ```javascript
> sdk.reLogin()
> ```
>
##### 示例
> ```javascript
> sdk.reLogin()
> ```
>
### 3.5 SDK 角色上报<a name="sec3.5"></a>
---
##### 说明
> 此方法用于上报角色信息,需在角色信息改变时调用此方法(每次角色登录成功时需上报一次)。如果服务端对接了角色上报接口,客户端可以无需上报。
##### 调用方式
```javascript
sdk.updateRole(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | - | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;online_time | false | Int | 0 | 本次在线时长 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
##### EVENT枚举
> | EVENT | 说明 |
> | -------- | -------- |
> | create | 创建角色 |
> | online | 角色上线 |
> | offline | 角色下线 |
> | level_up | 角色升级 |
> | delete | 删除角色 |
> | recharge | 角色充值 |
> | other | 其他 |
##### 示例
> ```javascript
> sdk.updateRole({
> role: {
> event: 'create',
> server_id: '100001',
> server_name: '主宰服',
> cp_role_id: 'cp_role_id',
> role_name: '哇哦是龙儿',
> role_level: '100',
> role_vip: '7',
> combat_num: '100',
> online_time: '10'
> }
> })
> //回调通知需要在初始化时注册
> ```
>
### 3.6 SDK 下单<a name="sec3.6"></a>
---
##### 接口说明
> 用户在充值后,游戏客户端需要调用sdk下单方法,需在登录成功后调用此方法;改方法会自动拉起支付。
##### 调用方式
```javascript
zwsdk.createOrder(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :----------------------------------------------------------- | :---- | :----- | :------- | :----------------------------------------------------------- |
> | order | true | Object | - | 订单相关 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_order_id | true | String | - | 游戏传入的外部订单号,服务器会根据这个订单号生成对应的平台订单号,请保证每笔订单传入的订单号的唯一性 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_price | true | String | - | 商品价格(单价,单位:分) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_id | true | String | - | 商品 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount | true | String | - | 商品总价(单位:分) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_cnt | true | String | - | 商品数量 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_name | true | String | - | 商品名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_desc | true | String | - | 商品描述 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ext | false | String | "" | CP 自定义扩展字段,透传信息 |
> | role | true | Object | - | 角色相关 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | recharge | 充值上传的角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | "" | 游戏服务器 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | "" | 游戏服务器名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | "" | 玩家角色 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | "" | 玩家角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | String | "0" | 玩家角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | true | String | "0" | 玩家 VIP 等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;online_time | false | Int | 0 | 本次在线时长 |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :----------------------------------------------------------- | :----- | :------------------------- |
> | status_code | String | 返回状态 |
> | msg | String | 返回信息 |
> | data | Object | 用户数据 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data | Object | 用户数据 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_id | String | 订单 ID,可用于订单状态查询 |
##### 示例
```javascript
sdk.createOrder({
order: {
cp_order_id: 'cp_order_id100000000001',
amount: '1',
product_price: '1',
product_id: 'product_id10000001',
product_cnt: '1',
product_name: '元宝',
product_desc: '充值元宝',
ext: '',
},
role: {
server_id: '100001',
server_name: '主宰服',
cp_role_id: 'cp_role_id',
role_name: '哇哦是龙儿',
role_level: '100',
role_vip: '7',
combat_num: '100',
online_time: '10'
}
})
//回调通知需要在初始化时注册
```
### 3.7 SDK 订单查询<a name="sec3.7"></a>
---
##### 说明
> 游戏客户端在下单成功后,可以通过该方法对订单状态进行查询。(可结合[支付通知](#sec2.4)结果进行发货)
##### 调用方式
```javascript
sdk.checkOrder(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :------------------------------------------------------- | :--- | :----- | :----- | :----------- |
> | order | true | Object | - | 订单相关 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_id | true | String | - | 查询的订单号 |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :----------------------------------------------------------- | :----- | :--------------------------------- |
> | status_code | String | 返回状态 |
> | msg | String | 返回信息 |
> | data | Object | 用户数据 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data | Object | 用户数据 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_id | String | 订单 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status | String | 订单状态:待支付,已支付 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callback_status | String | 回调状态:待回调,回调成功,回调错误 |
##### 示例
```javascript
sdk.checkOrder({
order: {
order_id: 'g1635306419-9FA13A0B-EDA1-1D94'
}
})
//回调通知需要在初始化时注册
```
\ No newline at end of file
# H5 SDK 对接文档-v1.0
# H5 SDK 对接文档-v1.0
### 目录
1.[接入说明](#sec1)
&nbsp;&nbsp;&nbsp;&nbsp;1.1 [术语表](#sec1.1)
&nbsp;&nbsp;&nbsp;&nbsp;1.2 [数据字典](#sec1.2)
&nbsp;&nbsp;&nbsp;&nbsp;1.3 [链接登录](#sec1.3)
&nbsp;&nbsp;&nbsp;&nbsp;1.4 [主动登录](#sec1.4)
&nbsp;&nbsp;&nbsp;&nbsp;1.5[下单逻辑](#sec1.5)
2.[服务端接入](#sec2)
&nbsp;&nbsp;&nbsp;&nbsp;2.1 [接口规则](#sec2.1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求域名
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求方式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求格式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回格式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;状态说明
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;签名规则
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;签名示例
&nbsp;&nbsp;&nbsp;&nbsp;2.2 [登录认证](#sec2.2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口说明
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口地址
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求示例
&nbsp;&nbsp;&nbsp;&nbsp;2.3 [角色信息上报](#sec2.3)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口说明
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口地址
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求示例
&nbsp;&nbsp;&nbsp;&nbsp;2.4 [支付通知](#sec2.4)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口说明
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口地址
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求示例
3.[H5 SDK接入](#sec3)
&nbsp;&nbsp;&nbsp;&nbsp;3.1 [配置导入H5 SDK](#sec3.1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SDK地址
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;必要参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;导入示例
&nbsp;&nbsp;&nbsp;&nbsp;3.2 [H5 SDK初始化](#sec3.2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用方式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例
&nbsp;&nbsp;&nbsp;&nbsp;3.3 [链接登录](#sec3.3)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;链接参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例
&nbsp;&nbsp;&nbsp;&nbsp;3.4 [主动登录](#sec3.4)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用方式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例
&nbsp;&nbsp;&nbsp;&nbsp;3.5 [SDK 角色上报](#sec3.5)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用方式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EVENT枚举
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例
&nbsp;&nbsp;&nbsp;&nbsp;3.6 [SDK 下单](#sec3.6)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口说明
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用方式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例
&nbsp;&nbsp;&nbsp;&nbsp;3.7 [SDK 订单查询](#sec3.7)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口说明
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用方式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例
## 1. 接入说明<a name="sec1"></a>
### 1.1 术语表<a name="sec1.1"></a>
> | 名称 | 说明 |
> | ---------- | ------------------------------------------------------------ |
> | CP | 游戏研发商。 |
> | H5_SDK | 由平台方提供给游戏研发商,用于游戏客户端接入平台登录,支付。 |
> | SDK服务 | 由平台方开发,用于完成SDK的登录,支付流程,承接游戏服务端的数据。 |
> | 游戏服务 | 游戏研发商开发,为游戏提供服务。 |
> | 游戏客户端 | 游戏研发方商开发的网页版游戏。 |
> | 支付服务 | 由平台方调用支付服务,包括微信支付,支付宝支付等 |
> | 游戏盒子 | 由平台方开发的游戏总入口,可以实现游戏登陆,支付,切换等;H5游戏以iframe的形式在游戏盒子中运行。 |
> | H5游戏入口 | 由CP方提供,进入H5游戏的入口链接。 |
### 1.2 数据字典<a name="sec1.2"></a>
> | 名称 | 说明 |
> | ----------- | ---------------------------------- |
> | player_id | 用户在平台的一个游戏中的唯一标识。 |
> | user_token | 用户在平台登录的会话标识。 |
> | game_id | 游戏在平台的唯一标识。 |
> | game_secret | 平台方提供,游戏签名秘钥。 |
> | cp_order_id | 游戏研发商订单唯一标识 |
> | order_id | 平台方订单唯一标识,与cp_order_id一一对应 |
> | h5_game_url | H5游戏入口,由CP方提供,进入H5游戏的入口链接。 |
### 1.3 链接登录<a name="sec1.3"></a>
```mermaid
sequenceDiagram
链接登录->>游戏客户端:链接(携带参数)
note over 链接登录,游戏客户端:game_id,player_id,state,user_token
游戏客户端->>游戏服务:game_id,player_id,user_token
游戏服务->>SDK服务:登录验证
SDK服务-->>游戏服务:验证结果
游戏服务->>游戏服务:登录验证
游戏服务-->游戏客户端:验证结果
```
### 1.4 主动登录<a name="sec1.4"></a>
```mermaid
sequenceDiagram
游戏客户端->>H5_SDK:调用登录
H5_SDK->>玩家:重新登录
玩家-->H5_SDK:账号密码
H5_SDK->>SDK服务:账号密码&game_id
SDK服务-->H5_SDK:player_id,user_token,game_id
H5_SDK->>H5_SDK:链接登录
```
### 1.5 下单逻辑<a name="sec1.5"></a>
```mermaid
sequenceDiagram
玩家->>游戏客户端: 充值
游戏客户端->>H5_SDK: 订单信息
H5_SDK->>玩家:询问支付方式
玩家-->>H5_SDK:支付方式
H5_SDK->>SDK服务器:订单信息&支付方式&os
SDK服务器-->>H5_SDK:订单号&支付渠道信息
H5_SDK-->>游戏客户端:订单状态(待支付)
H5_SDK->>玩家:等待支付
玩家-->>H5_SDK:支付
H5_SDK->>支付服务:调用支付
支付服务->>SDK服务:支付结果
SDK服务->>游戏服务:支付结果
游戏服务-->>SDK服务:success/fail
游戏服务->>游戏客户端:发货通知
游戏客户端-->>玩家:发货
```
## 2. 服务端接入<a name="sec2"></a>
### 2.1 接口规则<a name="sec2.1"></a>
##### 请求域名
> 【HTTPS】zyou.wozhangwan.com/api
##### 请求方式
> 【POST】
##### 请求格式
> 【JSON】
##### 返回格式
> 【JSON】
##### 状态说明
| 状态码 | 说明 |
| ------ | -------- |
| 1 | 成功 |
| -1 | 错误 |
| -100 | 未登录 |
| -422 | 参数错误 |
##### 签名规则
> **签名秘钥**
>
> game_secret 为16位字符串,由 SDK 对接时提供,每一个小游戏单独提供一个 game_secret
> **签名串**
>
> 请求参数(去除sign)通过参数名作升序排序;如果参数值是一个对象,需要将该对象通过参数名升序排序后转换为json字符串;将排好序的参数与game_secret以一下格式进行字符串拼接(game_secret放在最后)
>
> key1=value1&key2=value2&key3=value3&game_secret=secret
> **签名算法**
>
> 【md5】
>
> sign = md5(签名串)
> ##### 注意
>
> <u>如果参数值是一个对象,需要将该对象通过参数名升序排序后转换为json字符串;</u>
>
> <u>转换json注意不要对中文进行转义</u>
##### 签名示例
```php
<php?
$gameSecret = "game_secret";
$params = ["player_id" => 1245, "game_id" => 14];
$signStr = '';
ksort($params, SORT_REGULAR);
foreach ($params as $key => $val) {
if (is_array($val)) {
ksrot($val, SORT_REGULAR); //对对象参数进行排序
$val = json_encode($val, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
}
$signStr .= $key . '=' . $val . '&';
}
$signStr .= 'game_secret=' . $gameSecret;
$sign = md5($signStr);
```
### 2.2 登录认证<a name="sec2.2"></a>
##### 接口说明
> 小游戏通过 SDK 获得 用户user_token, 游戏服务端需要在用户登录游戏成功后调用登录验证接口,验证user_token是否为有效登录用户会话,SDK 服务端需要通过该接口判断用户是否登录游戏服务 。
>
> 注意:该接口有调用频率限制,建议游戏服务端在完成用户登录后调用该接口;
##### 接口地址
> 【POST】 /h5_sdk/auth/checkLogin
##### 请求参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ----------------------------------- |
> | Content-Type | true | application/json | |
> | User-Token | true | | 小游戏登录后由 SDK 返回的user_token |
> **Body**:
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | --------- | ---- | ------ | ------ | ---------------------------------- |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID |
> | player_id | true | Int | - | 小游戏登录后由 SDK 返回的player_id |
> | sign | true | String | - | 参数签名 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ----- | ------ | ------ | -------------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | false | OBJECT | [] | 返回数据(空) |
>
##### 请求示例
```php
<php?
public function checkLogin(){
$host = 'https://zyou.wozhangwan.com/api';
$checkLoginUrl = '/mini_sdk/auth/checkLogin';
$url = $host.$checkLoginUrl;
$gameSecret = "game_secret";
$body = ["player_id" => 1245, "game_id" => 14];
$userToken = "user_token";
$body["sign"] = makeSign($body, $gameSecret);
$headers = ["Content-Type:application/json","User-Token:".$userToken];
$response = curl_post($url, $body, $hearders);
}
public function makeSign($params,$gameSecret){
$signStr = '';
ksort($params, SORT_REGULAR);
foreach ($params as $key => $val) {
if (is_array($val)) {
ksort($val, SORT_REGULAR);
$val = json_encode($val, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
}
$signStr .= $key . '=' . $val . '&';
}
$signStr .= 'game_secret=' . $gameSecret;
return md5($signStr);
}
public function curl_post($url, $body, $headers){
//初始化
$curl = curl_init ( );
//设置抓取的url
curl_setopt ( $curl, CURLOPT_URL , $url);
//设置头文件的信息作为数据流输出
curl_setopt ( $curl, CURLOPT_HEADER , 1 );
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER , 1 );
//设置post方式提交
curl_setopt ( $curl, CURLOPT_POST , 1 );
//设置post参数
curl_setopt ( $curl, CURLOPT_POSTFIELDS , json_encode($body) );
//设置请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
//执行命令
$data = curl_exec ( $curl );
//关闭URL请求
curl_close ( $curl );
//显示获得的数据
return json_decode($data, true);
}
```
### 2.3 角色信息上报<a name="sec2.3"></a>
##### 接口说明
> 上报游戏角色信息到 SDK 服务器;
>
> 选接,客户端或者服务端一个端接入即可;
##### 接口地址
> 【POST】/h5_sdk/role/serverReport
##### 请求参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ----------------------------------- |
> | Content-Type | true | application/json | |
> | User-Token | true | | 小游戏登录后由 SDK 返回的user_token |
> **Body:**
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :--------------------------------- |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID |
> | player_id | true | Int | - | 小游戏登录后由 SDK 返回的player_id |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | - | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;online_time | false | Int | 0 | 本次在线时长 |
> | sign | true | String | - | 签名 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | | | | |
##### EVENT枚举
> | EVENT | 说明 |
> | -------- | -------- |
> | create | 创建角色 |
> | online | 角色上线 |
> | offline | 角色下线 |
> | level_up | 角色升级 |
> | delete | 删除角色 |
> | recharge | 角色充值 |
> | other | 其他 |
##### 请求示例
```php
<php?
public function report(){
$host = 'https://zyou.wozhangwan.com/api';
$checkLoginUrl = '/mini_sdk/role/severReport';
$url = $host.$checkLoginUrl;
$gameSecret = "game_secret";
$body = ["player_id" => 1245,
"game_id" => 14,
"role" =>[
"event" => 1,
"server_id" =>1,
"server_name" => "区服一",
"cp_role_id" => "roleId",
"role_name" => "角色名称",
"role_level" => 11,
"role_vip" => 0,
"combat_num" => 0,
"online_time" => 0,
]];
$userToken = "user_token";
$body["sign"] = makeSign($body, $gameSecret);
$headers = ["Content-Type:application/json","User-Token:".$userToken];
$response = curl_post($url, $body, $hearders);
}
public function makeSign($params,$gameSecret){
$signStr = '';
ksort($params, SORT_REGULAR);
foreach ($params as $key => $val) {
if (is_array($val)) {
$val = json_encode($val, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
}
$signStr .= $key . '=' . $val . '&';
}
$signStr .= 'game_secret=' . $gameSecret;
return md5($signStr);
}
public function curl_post($url, $body, $headers){
//初始化
$curl = curl_init ( ) ;
//设置抓取的url
curl_setopt ( $curl , CURLOPT_URL , $url) ;
//设置头文件的信息作为数据流输出
curl_setopt ( $curl , CURLOPT_HEADER , 1 ) ;
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt ( $curl , CURLOPT_RETURNTRANSFER , 1 ) ;
//设置post方式提交
curl_setopt ( $curl , CURLOPT_POST , 1 ) ;
//设置post参数
curl_setopt ( $curl , CURLOPT_POSTFIELDS , json_encode($body) ) ;
//设置请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
//执行命令
$data = curl_exec ( $curl ) ;
//关闭URL请求
curl_close ( $curl ) ;
//显示获得的数据
return json_decode($data, true);
}
```
### 2.4 支付通知<a name="sec2.4"></a>
##### 接口说明
> 需要游戏服务端完成该接口,接收平台充值成功的信息。
##### 接口地址
> 【POST】充值结果通知地址,由 CP 方提供
##### 通知参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ---- |
> | Content-Type | true | application/json | |
> | User-Token | | | |
> **Body:**
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :----------------------------------------------------------- | :--- | :-------- | :----- | :----------------------------------------------------------- |
> | order | true | Object | - | 订单相关 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_id | true | String | - | 平台订单ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_order_id | true | String | - | 游戏传入的外部订单号,服务器会根据这个订单号生成对应的平台订单号,<br>请保证每笔订单传入的订单号的唯一性 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_price | true | String | - | 商品单价(分) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount | true | Int | | 商品总价(分) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_id | true | String | - | 商品 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_cnt | true | String | - | 商品数量 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pay_time | true | Timestamp | - | 支付时间(时间戳) |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID |
> | player_id | true | Int | - | 游戏接入时分配的游戏ID |
> | sign | true | String | - | 签名(签名规则参照2.1签名规则,签名的key由SDK提供) |
>
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | | | | |
## 3. H5 SDK 接入<a name="sec3"></a>
### 3.1 配置导入H5 SDK<a name="sec3.1"></a>
##### 说明
> 游戏客户端通过引入外部js的方式,导入H5 SDK
##### SDK地址
> https://sdk.zwnet.cn/h5_sdk.js?v=1.0
##### 必要参数
> | 参数 | 说明 |
> | ----------- | -------------------------------- |
> | game_id | 游戏唯一标识,由平台方提供 |
> | h5_game_url | 需要由CP方提供进入游戏的入口链接 |
##### 导入示例
> ```javascript
> <script src="https://sdk.zwnet.cn/h5_sdk.js?v=1.0"></script>
> ```
>
### 3.2 H5 SDK 初始化<a name="sec3.2"></a>
---
##### 说明
> 游戏客户端需要在一开始初始化H5 SDK的对象,并注册角色上报(updateRole)、下单(createOrder)、订单查询(checkOrder)的回调通知;游戏客户端通过回调通知获得角色上报(updateRole)、下单(createOrder)、订单查询(checkOrder)的结果。
##### 调用示例
> ```javascript
> new zwsdk(config:Object)
> ```
##### 示例
> ```javascript
> const sdk = new zwsdk({
> updateRoleCallBack: (e) => {
> //处理角色上报的结果
> },
> createOrderCallBack: (e) => {
> //处理下单的结果
> },
> checkOrderCallBack: (e) => {
> //处理订单查询的结果
> }
> })
> ```
>
### 3.3 链接登录<a name="sec3.3"></a>
##### 说明
> 玩家通过游戏盒子登录后,游戏盒子在游戏入口链接(h5_game_url)后携带参数,游戏客户端需要将对应的参数回传给游戏服务器,通过[登录认证](#sec2.2)接口进行登录验证,如果校验成功则登录成功。具体流程逻辑以参考 [链接登录](#sec1.3)
##### 链接参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :--------- | :--- | :----- | :----- | :------------------------------------------ |
> | game_id | true | Int | - | 游戏在平台的唯一标识。 |
> | player_id | true | Int | - | 用户在平台的一个游戏中的唯一标识。 |
> | user_token | true | String | - | 用户登录后获取的token,用于验证用户是否登录 |
##### 示例
> 假设由CP方提供的h5_game_url为https://xxx.game.com,携带参数后最终地址为https://xxx.game.com?game_id=108&player_id=19902&user_token=O4T8Ua47Y7TtIuwcY2jbM71rZnTcg457Y2MzZTU4MjU0OWE5ZGQxOTg3YmYO0O0O
### 3.4 主动登录<a name="sec3.3"></a>
---
##### 说明
> 当游戏未登录时(例如:游戏登录状态失效,登录状态失败时),需要游戏客户端调起游戏盒子的登陆。调起登陆后,用户需要通过游戏盒子进行重新登录。
##### 调用方式
> ```javascript
> sdk.reLogin()
> ```
>
##### 示例
> ```javascript
> sdk.reLogin()
> ```
>
### 3.5 SDK 角色上报<a name="sec3.5"></a>
---
##### 说明
> 此方法用于上报角色信息,需在角色信息改变时调用此方法(每次角色登录成功时需上报一次)。如果服务端对接了角色上报接口,客户端可以无需上报。
##### 调用方式
```javascript
sdk.updateRole(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | - | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;online_time | false | Int | 0 | 本次在线时长 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
##### EVENT枚举
> | EVENT | 说明 |
> | -------- | -------- |
> | create | 创建角色 |
> | online | 角色上线 |
> | offline | 角色下线 |
> | level_up | 角色升级 |
> | delete | 删除角色 |
> | recharge | 角色充值 |
> | other | 其他 |
##### 示例
> ```javascript
> sdk.updateRole({
> role: {
> event: 'create',
> server_id: '100001',
> server_name: '主宰服',
> cp_role_id: 'cp_role_id',
> role_name: '哇哦是龙儿',
> role_level: '100',
> role_vip: '7',
> combat_num: '100',
> online_time: '10'
> }
> })
> //回调通知需要在初始化时注册
> ```
>
### 3.6 SDK 下单<a name="sec3.6"></a>
---
##### 接口说明
> 用户在充值后,游戏客户端需要调用sdk下单方法,需在登录成功后调用此方法;改方法会自动拉起支付。
##### 调用方式
```javascript
zwsdk.createOrder(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :----------------------------------------------------------- | :---- | :----- | :------- | :----------------------------------------------------------- |
> | order | true | Object | - | 订单相关 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_order_id | true | String | - | 游戏传入的外部订单号,服务器会根据这个订单号生成对应的平台订单号,请保证每笔订单传入的订单号的唯一性 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_price | true | String | - | 商品价格(单价,单位:分) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_id | true | String | - | 商品 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount | true | String | - | 商品总价(单位:分) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_cnt | true | String | - | 商品数量 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_name | true | String | - | 商品名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product_desc | true | String | - | 商品描述 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ext | false | String | "" | CP 自定义扩展字段,透传信息 |
> | role | true | Object | - | 角色相关 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | recharge | 充值上传的角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | "" | 游戏服务器 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | "" | 游戏服务器名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | "" | 玩家角色 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | "" | 玩家角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | String | "0" | 玩家角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | true | String | "0" | 玩家 VIP 等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;online_time | false | Int | 0 | 本次在线时长 |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :----------------------------------------------------------- | :----- | :------------------------- |
> | status_code | String | 返回状态 |
> | msg | String | 返回信息 |
> | data | Object | 用户数据 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data | Object | 用户数据 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_id | String | 订单 ID,可用于订单状态查询 |
##### 示例
```javascript
sdk.createOrder({
order: {
cp_order_id: 'cp_order_id100000000001',
amount: '1',
product_price: '1',
product_id: 'product_id10000001',
product_cnt: '1',
product_name: '元宝',
product_desc: '充值元宝',
ext: '',
},
role: {
server_id: '100001',
server_name: '主宰服',
cp_role_id: 'cp_role_id',
role_name: '哇哦是龙儿',
role_level: '100',
role_vip: '7',
combat_num: '100',
online_time: '10'
}
})
//回调通知需要在初始化时注册
```
### 3.7 SDK 订单查询<a name="sec3.7"></a>
---
##### 说明
> 游戏客户端在下单成功后,可以通过该方法对订单状态进行查询。(可结合[支付通知](#sec2.4)结果进行发货)
##### 调用方式
```javascript
sdk.checkOrder(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :------------------------------------------------------- | :--- | :----- | :----- | :----------- |
> | order | true | Object | - | 订单相关 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_id | true | String | - | 查询的订单号 |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :----------------------------------------------------------- | :----- | :--------------------------------- |
> | status_code | String | 返回状态 |
> | msg | String | 返回信息 |
> | data | Object | 用户数据 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data | Object | 用户数据 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_id | String | 订单 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status | String | 订单状态:待支付,已支付 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callback_status | String | 回调状态:待回调,回调成功,回调错误 |
##### 示例
```javascript
sdk.checkOrder({
order: {
order_id: 'g1635306419-9FA13A0B-EDA1-1D94'
}
})
//回调通知需要在初始化时注册
```
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论