提交 d47bf849 作者: Administrator

合并分支 'release' 到 'master'

Release

查看合并请求 zwwl/zw_game_sdk!40
## GameSDKV1.0文档接入使用
## GameSDKV1.0文档接入使用
......@@ -93,7 +93,7 @@
   1.2、所有SDK功能在GameSDK类中,可通过初始化获取改类对象,后续所有更新功能都调用这个类中方法完成
   1.3、文档中所有GameSDK指S从平台获取arr文件或者远程依赖implementation("com.zw.game.sdk:gameSDk:1.0.2.5")
   1.3、文档中所有GameSDK指S从平台获取arr文件或者远程依赖implementation("com.zw.game.sdk:gameSDk:1.0.7.5")
   1.4、小米手机Android12系统未上线到小米应用,通过三方下载系统无法联网SDK提供弹框提示用户打开联网控制
......@@ -114,7 +114,7 @@
#### 1.1、在app工程目录build.gradle中添加依赖<a name="sec3.1"></a>
```
implementation("com.zw.game.sdk:gameSDk:1.0.6.3")
implementation("com.zw.game.sdk:gameSDk:1.0.7.5")
```
......
## GameSDKV1.0文档接入使用
## GameSDKV1.0文档接入使用
[目录](#sec1)
&nbsp;&nbsp;&nbsp;&nbsp;1 [对接说明](#sec1)
&nbsp;&nbsp;&nbsp;&nbsp;2 [获取对接SDK](#sec2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [说明](#sec2.1)
&nbsp;&nbsp;&nbsp;&nbsp;3 [导入配置SDK资源AndroidStudio](#sec3)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [添加依赖](#sec3.1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[maven配置](#sec3.2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[示例](#sec3.2)
&nbsp;&nbsp;&nbsp;&nbsp;4 [配置清单文件](#sec4)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [清单配置说明](#sec4.1)
&nbsp;&nbsp;&nbsp;&nbsp;5 [初始化 SDK](#sec5)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[SDK调用说明](#sec5.1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[application](#sec5.2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[调用示例](#sec5.3)
&nbsp;&nbsp;&nbsp;&nbsp;6 [登录](#sec6)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[接口说明](#sec6.1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[参数说明](#sec6.2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[调用示例](#sec6.3)
&nbsp;&nbsp;&nbsp;&nbsp;7 [调起支付页面](#sec7)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[调用说明](#sec7.1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [接口参数](#sec7.2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [调用示例](#sec7.3)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [下单支付字段说明](#sec7.4)
&nbsp;&nbsp;&nbsp;&nbsp;8 [支付回调结果](#sec8)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[支付文档说明](#sec8.1)
&nbsp;&nbsp;&nbsp;&nbsp;9 [角色上报](#sec9)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[调用示例](#sec9.1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [参数字段说明](#sec9.2)
&nbsp;&nbsp;&nbsp;&nbsp;10 [退出登录](#sec10)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[接口回调说明](#sec10.1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [退出成功](#sec10.3)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [退出失败](#sec10.4)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [调用示例](#sec10.5)
&nbsp;&nbsp;&nbsp;&nbsp;11 [退出应用](#sec11)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [调用方法](#sec11.1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [调用示例](#sec11.1)
&nbsp;&nbsp;&nbsp;&nbsp;12 [gradle依赖](#sec12)
&nbsp;&nbsp;&nbsp;&nbsp;13 [apk打包](#sec13)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[混淆说明](#sec13.1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[打包说明](#sec13.2)
#### 1、对接说明 <a name="sec1"></a>
&nbsp;&nbsp; 1.1、此对接文档只适合与sdkv1.0版本。
&nbsp;&nbsp; 1.2、所有SDK功能在GameSDK类中,可通过初始化获取改类对象,后续所有更新功能都调用这个类中方法完成
&nbsp;&nbsp; 1.3、文档中所有GameSDK指S从平台获取arr文件或者远程依赖implementation("com.zw.game.sdk:gameSDk:1.0.2.5")
&nbsp;&nbsp; 1.4、小米手机Android12系统未上线到小米应用,通过三方下载系统无法联网SDK提供弹框提示用户打开联网控制
```
GameSdk.getInstance().android12(this,"该游戏需要打开您的应用设置开启联网权限,并重启游戏,是否同意?");
```
### 2、对接SDK<a name="sec2"></a>
从平台处获取对接SDK,android studio版本,选择V1.0的版本接入。<a name="sec2.1"></a>
### 3、导入配置SDK资源Androidstudio项目<a name="sec3"></a>
#### 1.1、在app工程目录build.gradle中添加依赖<a name="sec3.1"></a>
```
implementation("com.zw.game.sdk:gameSDk:1.0.6.3")
```
#### 1.2、在主工程中添加maven<a name="sec3.2"></a>
```
maven { url 'http://nexus.zwwlkj01.top/repository/android-game/' }
```
#### 示例<a name="sec3.3"></a>
![示例1](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/default%2Fbuild1.png)
![示例2](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/default%2Fbuild2.png)
### 4、配置清单文件(具体请参考demo)<a name="sec4"></a>
1、参考demo中的清单文件配置,主要分为权限配置、sdk所需的组件配置,meta信息配置。(权限部分SDK已经适配,访问文件权限,Android10网络访问权限,安装适配等均已适配,但不包含所有设备)<a name="sec4.1"></a>
> **参数说明**:
| 参数名 | 说明 |
|:--------| -------------:|
| game_id | 游戏唯一标识,由平台方提供 |
|game_secret|服务端对接时会用到,由平台方提供|
```
<meta-data
android:name="game_id"
android:value="149" />
<!-- 巨量开放平台申请应用,其他对接游戏默认传0-->
<meta-data
android:name="app_id"
android:value="358562" />
<!--用于判断是否激活巨量SDK,其他对接游戏默认false-->
<meta-data
android:name="status"
android:value="false" />
```
### 5、初始化SDK<a name="sec5"></a>
1、sdk初始化操作方法,最先调用,需要在主线程调用,最好游戏主界面activity中调用。此方法的可多次调用用于获得sdk全局管理器。<a name="sec5.1"></a>
2、调用示例:在游戏主界面activity的onCreate方法中调用
3、自己主工程application需要继承GameSdkApplication
> **application调用示例**:<a name="sec5.2"></a>
```
public class App extends GameSdkApplication {
@Override
public void onCreate() {
super.onCreate();
}
}
```
> **初始化示例**:<a name="sec5.3"></a>
```
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
ConfigInfo.allowPORTRAIT=false;
GameSdk.getInstance().init(mActivity);
GameSdk.getInstance().onCreate(mActivity);
}
```
### 6、登录<a name="sec6"></a>
1、添加登录回调监听<a name="sec6.1"></a>
```
public void addLoginListener(OnLoginListener onLoginListener)
```
- 说明:在登陆前必须注册登陆回调监听,用于接收登陆结果,登录成功返回token
- 需游戏服务端调用登录验证之后,才能进入游戏参照(SDK对接说明 2.2)
#### 参数说明<a name="sec6.2"></a>
| 参数 | 说明|
| :-------- | -------------: |
| OnLoginListener | 登录回调接口 |
- 参数类说明:OnLoginListener需要实现两个方法:
> **登录成功**:
```
void loginSuccess(Object data);
```
> **登录成功返回参数**:
| 参数 | 类型 | 说明 |
| :-------- | -------------: | -------------: |
| status_code | int| 状态码 |
| data| object | 返回数据 |
| msg| String| 描述信息 |
| data| object | 返回数据 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data | object | 用户数据 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; player_id | String | 玩家ID |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; avatar | String | 用户头像 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; has_identify | boolean | 是否实名 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user_token | strng | token |
> **登录失败**:
```
void loginError(Object data);
```
> **登录失败返回参数**:
| 参数 | 类型 | 说明 |
| :-------- | -------------: | -------------: |
| status_code | int| 状态码 |
| data| object | 返回数据 |
| msg| String| 描述信息 |
| data| object | 返回数据 |
#### 调用示例<a name="sec6.3"></a>
```
GameSdk.getInstance().addLoginListener(this, new OnLoginListener() {
@Override
public void loginSuccess(Object data) {
Log.e("loginSuccess",data+"");
//显示悬浮球(根据游戏需求显示,可以在初始化显示,可以登录成功之后显示)
GameSdk.getInstance().show(SdkDemoActivity.this);
}
@Override
public void loginError(Object data) {
}
});
```
#### 悬浮球生命周期中调佣
```
@Override
protected void onDestroy() {
super.onDestroy();
GameSdk.getInstance().onDestroy(this);
}
```
### 7、调起支付页面<a name="sec7"></a>
1、调起支付页面方法<a name="sec7.1"></a>
```
public void showPay(CustomPayParam payParam, OnPaymentListener paymentListener)
```
### 接口参数<a name="sec7.2"></a>
| 参数 | 说明 |
|:----|-----:|
|payParam|支付参数|
|paymentListener|回调接口|
#### 调用示例<a name="sec7.3"></a>
```
CustomPayParam data=new CustomPayParam();
CustomPayParam.RoleBean role=new CustomPayParam.RoleBean();
CustomPayParam.OrderBean orderInfo=new CustomPayParam.OrderBean();
data.setRole_id("425");
role.setEvent("other");
role.setServer_id("100001");
role.setRole_name("主宰传奇");
role.setCp_role_id("2413930833603897345");
role.setServer_name("主宰服");
role.setRole_vip("0");
orderInfo.setCp_order_id("312223131");
orderInfo.setAmount("1");
orderInfo.setProduct_price("1");
orderInfo.setProduct_id("101");
orderInfo.setProduct_cnt("1");
orderInfo.setProduct_name("8元档充值");
orderInfo.setProduct_desc("商品");
orderInfo.setExt("测试数据");
data.setRole(role);
data.setOrder(orderInfo);
GameSdk.getInstance().showPay(this,data, new OnPaymentListener() {
@Override
public void Success(String msg) {
}
@Override
public void Failed(String msg) {
}
});
```
#### 下单支付字段说明<a name="sec7.4"></a>
| 名称 | 类型 | 是否必须 | 默认值|说明 |
|:--------------|-------:|-----:|-----:|-----------------:|
| cp_order_id | string | 必须 || CP订单ID |
| amount | number | 必须 | |商品总价(单位:分 |
| product_price | number | 必须 | |商品价格(整数,后台自动换算分) |
| product_id | String | 非必须 |0| 商品ID |
| product_cnt | number | 必须 | |商品数量 |
| product_name | string | 必须 |""| 商品名称 |
| product_desc | string | 非必须 |""| 商品描述 |
| ext | string | 必须 |""| 订 调用方定义 单额外信息用(json)|
| event | string | 必须 |""| 事件|
| server_id | string | 必须 |0| 区服id |
| server_name | string | 必须 |""| 区服名称|
| cp_role_id | string | 必须 | cp角色id |
| role_name | string | 必须 | ""|角色名称 |
| role_vip | string | 必须 | 0|角色vip等级 |
| role_id | string | 必须 |0| 角色ID |
### 8、支付回调通知<a name="sec8"></a>
1.1、支付回调通知请参考对接文档H5 SDK 对接文档-v1.0、服务端接入2.3<a name="sec8.1"></a>
### 9、角色上报<a name="sec9"></a>
#### 调用示例<a name="sec9.1"></a>
```
GameInfoSetting setting=new GameInfoSetting();
GameRoleInfo roleInfo=new GameRoleInfo();
roleInfo.setEvent("create");//事件类型,online: 角色登录, create: 创建角色,level_up: 提升等级,offline: 角色退出,other: 其他,delete: 删除角色
roleInfo.setServer_id("100001");//区服ID
roleInfo.setServer_name("主宰服");//区服
roleInfo.setCp_role_id(System.currentTimeMillis()+"");//CP角色ID
roleInfo.setRole_name("大鲨鱼");//角色名称
roleInfo.setPower("国家");//角色名称
roleInfo.setRole_vip("23");//角色VIP等级
roleInfo.setMain_City_Level("23");//官邸等级
roleInfo.setChapter_Index("23");//章节等级
roleInfo.setCombat_num("25564");//角色战力
roleInfo.setOnline_time("15426");//本次在线时长
roleInfo.setAttack("0");//攻击力
roleInfo.setProfession("法师");//职业
roleInfo.setGang_name("大竹帮");//帮会(行会)名称
roleInfo.setTrans_level("5");//转生等级
roleInfo.setSponsor_level("12");//赞助等级/会员等级
roleInfo.setReiki_num("12"); //灵符值
setting.setRole(roleInfo);
GameSdk.getInstance().putRoleReport(setting, new SubmitRoleInfoCallBack() {
@Override
public void onSuccess(Object o) {
showToast(o.toString()+"");
}
@Override
public void onFailure(int code, String msg) {
}
});
```
#### 参数字段说明<a name="sec9.2"></a>
###### 创建角色 create
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | &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;power | true | String | "" | 国家 | |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reiki_num | false | Int | 0 | 最新角色灵符值 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
###### 角色上线 online 角色下线 offline
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | &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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 | |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reiki_num | false | Int | 0 | 最新角色灵符值 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;online_time | false | Int | 0 | 本次在线时长 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 | |
###### 角色升级 level_up
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | &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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
> | &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 | 本次在线时长 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 | |
###### 官邸升级事件 main_city_upgrade
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | &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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
###### 章节完成事件 chapter_complete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | &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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
###### 删除角色 delete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | &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 | - | 游戏角色名称 |
### 10、退出登录<a name="sec9"></a>
#### 添加登出回调监听<a name="sec10.1"></a>
```
public void addLogoutListener(OnLogoutListener onLogoutListener)
```
1、在退出登陆前必须注册退出登陆回调监听,用于接收退出登陆,或者登陆过期的退出登陆结果。
2、 参数类说明:OnLogoutListener需要实现两个方法:
3、 退出登陆成功:
4、退出登录成功并返回所有信息与code状态
#### 退出登录成功<a name="sec10.3"></a>
```
public void logoutSuccess(String s);
```
#### 退出登录失败<a name="sec10.4"></a>
```
public void logoutError(String msg);
```
#### 调用示例<a name="sec10.5"></a>
```
GameSdk.getInstance().addLogoutListener(new OnLogoutListener() {
@Override
public void logoutSuccess(String s) {
}
@Override
public void logoutError(String s) {
}
});
```
- 说明:在需要退出登陆时可调用此方法,注意此方法为退出,并不会调出登陆界面
### 11、退出应用弹框<a name="sec10"></a>
1、添加退出回调监听
#### 调用方法<a name="sec11.1"></a>
```
public void exitApp(ExitAppListener listener)
```
1、退出应用程序弹出提示框。
#### 调用示例<a name="sec11.2"></a>
```
@Override
public void onBackPressed() {
GameSdk.getInstance().exitApp(this, data -> {
});
}
```
- 说明:onBackPressed方法调用
### 12 gradle依赖说明<a name="sec12"></a>
1、打包arr依Glide库需要在主工程中添加依赖
2、如遇到OKhttp无法下载下来,请按照下方依赖进行添加
```
api 'com.github.bumptech.glide:glide:4.11.0'
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
```
### 13 apk打包<a name="sec13"></a>
1.sdk 的代码已经经过混淆,请勿混淆sdk的代码<a name="sec13.1"></a>
2、打包apk签名机制需要勾选V1、V2签名<a name="sec13.2"></a>
3、sdk代码已经经过混淆,请不要再次混淆sdk代码,demo会贴出SDK混淆代码,可复制到自己混淆中(具体请参考demo)
## 服务端接口 调用方直接使用http 调用接口:
### 接口地址
> 【POST】 /android_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 | - | 状态码 1 正常在线,否则不允许登录|
> | msg | true | STRING | - | 返回信息 |
> | data | false | OBJECT | [] | 返回数据(空) |
>
##### 接口说明
调用方检测当前用户是否登录过,在线状态; 如果返回参数不是正常登录则不允许登录游戏。
##### 请求示例
```php
<php?
public function checkLogin(){
$host = 'https://zyou.wozhangwan.com/api';
$checkLoginUrl = '/android_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);
}
$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);
}
```
\ 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;请求示例
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】
##### 状态说明
| 状态码(status_code) | 说明 |
| ------------------- | -------- |
| 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);
}
$signStr .= $key . '=' . $val . '&';
}
$signStr .= 'game_secret=' . $gameSecret;
$sign = md5($signStr);
```
### 2.2 登录认证<a name="sec2.2"></a>
##### 接口说明
> 小游戏通过 SDK 获得 用户user_token, 游戏服务端需要在用户登录游戏成功后调用登录验证接口,验证user_token是否为有效登录用户会话,SDK 服务端需要通过该接口判断用户是否登录游戏服务 。
>
> 注意:该接口有调用频率限制,建议游戏服务端在完成用户登录后调用该接口;
>
> 接口需要进行签名,签名方法详见[接口规则](#sec2.1)
##### 接口地址
> 【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);
}
$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.3s"></a>
##### 接口说明
> 需要游戏服务端完成该接口,接收平台充值成功的信息。
>
> 接口需要进行签名验证,签名方法详见[接口规则](#sec2.1)
##### 接口地址
> 【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 | String | | 商品总价(分) |
> | &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 | - | 支付时间(时间戳,到秒) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ext | true | String | - | CP 自定义扩展字段,透传信息 |
> | game_id | true | String | - | 游戏接入时分配的游戏ID |
> | player_id | true | String | - | 游戏接入时分配的游戏ID |
> | sign | true | String | - | 签名(签名规则参照2.1签名规则,签名的key由SDK提供) |
>
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | | | | |
##### 注意
> 通知使用的参数格式均为字符串(String)
##### 请求示例
```php
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);
}
$signStr .= $key . '=' . $val . '&';
}
$signStr .= 'game_secret=' . $gameSecret;
return md5($signStr);
}
function curl_post($url, $body, $headers){
//初始化
$curl = curl_init ( );
//设置抓取的url
curl_setopt ( $curl, CURLOPT_URL , $url);
//设置头文件的信息作为数据流输出
curl_setopt ( $curl, CURLOPT_HEADER , 0 );
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER , 1 );
//设置post方式提交
curl_setopt ( $curl, CURLOPT_POST , 1 );
//设置post参数
curl_setopt ( $curl, CURLOPT_POSTFIELDS , json_encode($body) );
//设置请求头
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
//执行命令
$data = curl_exec ( $curl );
//关闭URL请求
curl_close ( $curl );
//显示获得的数据
return json_decode($data, true);
}
function payNotify(){
$payNotifyUrl = 'CP 方充值成功回调地址';
$gameSecret = "#替换为SDK方参数game_secret#";
$body = [
"player_id" => 990218,
"game_id" => 138,
"order"=>["amount"=>"800",
"cp_order_id"=>"1333066913427335168_101_990218_1",
"ext"=>"1333066913424879617",
"order_id"=>"g1641507637-CA7714D0-064D-D4BA",
"pay_time"=>"1641507647",
"product_cnt"=>"1",
"product_id"=>"101",
"product_price"=>"800"
]
];
$body["sign"] = makeSign($body, $gameSecret);
$headers = ["Content-Type:application/json"];
$response = curl_post($payNotifyUrl, $body, $headers);
print_r($response);
}
payNotify();
```
## 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
```javascript
sdk.updateRole(config:Object)
```
##### 请求参数
###### 创建角色 create
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | 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;power | true | String | "" | 国家 | |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reiki_num | false | Int | 0 | 最新角色灵符值 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
###### 角色上线 online 角色下线 offline
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | 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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 | |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reiki_num | false | Int | 0 | 最新角色灵符值 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;online_time | false | Int | 0 | 本次在线时长 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 | |
###### 角色升级 level_up
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | 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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
> | &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 | 本次在线时长 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 | |
###### 官邸升级事件 main_city_upgrade
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | &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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
###### 章节完成事件 chapter_complete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | &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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
###### 删除角色 delete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | &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 | - | 游戏角色名称 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
##### EVENT枚举
> | EVENT | 说明 |
> | -------- | -------- |
> | create | 创建角色 |
> | online | 角色上线 |
> | offline | 角色下线 |
> | level_up | 角色升级 |
> | delete | 删除角色 |
> | main_city_upgrade | 官邸升级事件 |
> | chapter_complete | 章节完成事件 |
##### 示例
> ```javascript
> sdk.updateRole({
> role: {
> event: 'create',
> server_id: '100001',
> server_name: '主宰服',
> cp_role_id: 'cp_role_id',
> main_city_level: 1,
> chapter_index: 2,
> power: '蜀国',
> role_name: '哇哦是龙儿',
> role_vip: '7',
> combat_num: '100',
> online_time: '10',
> reiki_num: '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'
}
})
//回调通知需要在初始化时注册
```
# 游戏 SDK 对接文档-v1.0.3
# 游戏 SDK 对接文档-v1.0.3
### 目录
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)
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;请求示例
3.[小游戏 SDK 接入](#sec3)
&nbsp;&nbsp;&nbsp;&nbsp;3.1 [调用 SDK 初始化](#sec3.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;3.2 [游戏配置获取](#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;&nbsp;&nbsp;&nbsp;&nbsp;示例
&nbsp;&nbsp;&nbsp;&nbsp;3.3 [调用 SDK 登录](#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;&nbsp;&nbsp;&nbsp;&nbsp;返回参数
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例
&nbsp;&nbsp;&nbsp;&nbsp;3.4 [SDK 账号更新](#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;&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;示例
&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;3.8 [SDK 角色上报](#sec3.8)
&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.9 [SDK 敏感词监测](#sec3.9)
&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.10 [SDK 敏感图片监测](#sec3.10)
&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.11 [SDK 客服消息](#sec3.11)
&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 | 游戏研发商。 |
> | SDK | 由平台方提供给游戏研发商,用于游戏接入平台登录,支付。 |
> | SDK 服务 | 由平台方开发,用于完成 SDK 的登录,支付流程,承接游戏服务端的数据。 |
> | 游戏服务 | 游戏研发商开发,为游戏提供服务。 |
> | 小游戏 | 游戏研发方商开发的微信小游戏。 |
> | 支付服务 | 由平台方调用支付服务,包括米大师,微信支付等 |
> | 小游戏入口 | 小游戏的入口链接,SDK 方默认为 pages/index/index(如果 CP 方不同需要提前与 SDK 沟通) |
### 1.2 数据字典<a name="sec1.2"></a>
> | 名称 | 说明 |
> | ----------- | ------------------------------------------------- |
> | player_id | 用户在平台的一个游戏中的唯一标识。 |
> | user_token | 用户在平台登录的会话标识。 |
> | game_id | 游戏在平台的唯一标识。 |
> | game_secret | 平台方提供,游戏签名秘钥。 |
> | cp_order_id | 游戏研发商订单唯一标识 |
> | order_id | 平台方提供,订单唯一标识,与 cp_order_id 一一对应 |
### 1.3 登录流程<a name="sec1.3"></a>
```mermaid
sequenceDiagram
用户->>小游戏: 打开小游戏
小游戏->>SDK: 调用登录
SDK->>SDK服务: 发起登录
SDK服务-->>SDK: member_id,player_id,user_token
SDK-->>小游戏: member_id,player_id,user_token
小游戏->>游戏服务:player_id,user_token
游戏服务->>SDK服务: 登录验证
SDK服务-->>游戏服务: 验证成功
游戏服务-->>小游戏: 登录成功
小游戏-->>用户: 进入游戏
```
### 1.4 充值流程<a name="sec1.4"></a>
```mermaid
sequenceDiagram
用户->>小游戏: 购买商品
小游戏->>SDK: 调用下单,提供cp_order_id
SDK->>SDK服务: 发起下单,cp_order_id
SDK服务-->>SDK: order_id
SDK->>小游戏: 拉起支付
Note over 小游戏,用户:等待用户支付
用户->>小游戏: 支付
SDK->>支付服务: 调用支付
loop [支付结果]
SDK->>SDK服务: 查询订单支付状态
end
支付服务->>SDK服务: 支付结果
par 通知小游戏
SDK服务-->>SDK: 订单支付结果
SDK-->小游戏: 订单支付结果
and 通知服务
SDK服务->>游戏服务: 充值结果
游戏服务-->>SDK服务: succes/fail
end
小游戏->>游戏服务: 验证订单
游戏服务-->小游戏: 更新数据
```
## 2. 服务端接入<a name="sec2"></a>
### 2.1 接口规则<a name="sec2.1"></a>
##### 请求域名
> 【HTTPS】zyou.wozhangwan.com/api
##### 请求方式
> 【POST】
##### 请求格式
> 【JSON】
##### 返回格式
> 【JSON】
##### 状态说明
| 状态码(status_code) | 说明 |
| ------------------- | -------- |
| 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);
}
$signStr .= $key . '=' . $val . '&';
}
$signStr .= 'game_secret=' . $gameSecret;
$sign = md5($signStr);
```
### 2.2 登录认证<a name="sec2.2"></a>
##### 接口说明
> 小游戏通过 SDK 获得 用户 user_token, 游戏服务端需要在用户登录游戏成功后调用登录验证接口,验证 user_token 是否为有效登录用户会话,SDK 服务端需要通过该接口判断用户是否登录游戏服务 。
>
> 注意:该接口有调用频率限制,建议游戏服务端在完成用户登录后调用该接口;
##### 接口地址
> 【POST】 /mini_sdk/auth/checkLogin
##### 请求参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ------------------------------------ |
> | Content-Type | true | application/json | |
> | User-Token | true | | 小游戏登录后由 SDK 返回的 user_token |
> **Body**:
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | --------- | ---- | ------ | ------ | ----------------------------------- |
> | game_id | true | Int | - | 游戏接入时分配的game_id(建议从user_token中取,#后面的数字即为game_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, $headers);
}
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);
}
$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 , 0 );
//设置获取的信息以文件流的形式返回,而不是直接输出。
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>
##### 接口说明
> 需要游戏服务端完成该接口,接收平台充值成功的信息。
##### 接口地址
> 【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 | String | | 商品总价(分) |
> | &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 | String | - | 支付时间(时间戳,到秒) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ext | true | String | - | CP 自定义参数,透传信息 |
> | game_id | true | String | - | 游戏接入时分配的游戏 ID |
> | player_id | true | String | - | 游戏接入时分配的游戏 ID |
> | sign | true | String | - | 签名(签名规则参照 2.1 签名规则,签名的 key 由 SDK 提供) |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | | | | |
##### 注意
> 通知使用的参数格式均为字符串(String)
##### 请求示例
```php
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);
}
$signStr .= $key . '=' . $val . '&';
}
$signStr .= 'game_secret=' . $gameSecret;
return md5($signStr);
}
function curl_post($url, $body, $headers){
//初始化
$curl = curl_init ( );
//设置抓取的url
curl_setopt ( $curl, CURLOPT_URL , $url);
//设置头文件的信息作为数据流输出
curl_setopt ( $curl, CURLOPT_HEADER , 0 );
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER , 1 );
//设置post方式提交
curl_setopt ( $curl, CURLOPT_POST , 1 );
//设置post参数
curl_setopt ( $curl, CURLOPT_POSTFIELDS , json_encode($body) );
//设置请求头
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
//执行命令
$data = curl_exec ( $curl );
//关闭URL请求
curl_close ( $curl );
//显示获得的数据
return json_decode($data, true);
}
function payNotify(){
$payNotifyUrl = 'CP 方充值成功回调地址';
$gameSecret = "#替换为SDK方参数game_secret#";
$body = [
"player_id" => 990218,
"game_id" => 138,
"order"=>["amount"=>"800",
"cp_order_id"=>"1333066913427335168_101_990218_1",
"ext"=>"1333066913424879617",
"order_id"=>"g1641507637-CA7714D0-064D-D4BA",
"pay_time"=>"1641507647",
"product_cnt"=>"1",
"product_id"=>"101",
"product_price"=>"800"
]
];
$body["sign"] = makeSign($body, $gameSecret);
$headers = ["Content-Type:application/json"];
$response = curl_post($payNotifyUrl, $body, $headers);
print_r($response);
}
payNotify();
```
## 3. 小游戏 SDK 接入<a name="sec3"></a>
### 3.1 调用 SDK 初始化<a name="sec3.1"></a>
---
##### 接口说明
> 请确保在初始化返回成功后,再调用其他 api。
##### 调用方式
```javascript
import zwsdk from './sdk.js' //引入SDK
// zwsdk= require('./sdk.js').default 引入SDK
const zwsdk = new zwsdk(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :------ | :--- | :----- | :----- | :----------- |
> | app_id | true | String | - | 小程序 APPID |
> | game_id | true | String | - | 小游戏 ID |
##### 示例
```javascript
const zwsdk = new zwsdk({
app_id: '123123123',
game_id: '123123123'
})
```
### 3.2 游戏配置获取<a name="sec3.2"></a>
##### 接口说明
> 获取游戏的配置参数,例如:是否显示支付,可对充值按钮的显示进行后台控制(用于 iOS 的过审,审核期间不能显示充值入口)。
##### 调用方式
```javascript
zwsdk.getGameConf()
```
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :-------------------------------------------------------------------------------------------------------------- | :----- | :------------------------------------- |
> | 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;game_id | Int | 游戏 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pay_button_show | Int | 充值入口是否显示(1:显示,2:不显示) |
##### 示例
```javascript
zwsdk.getGameConf().then((res) => {
// .......
// res.status 返回状态
// res.msg 返回信息
// res.data.data 返回数据
})
```
### 3.3 调用 SDK 登录<a name="sec3.3"></a>
---
##### 接口说明
> **\***接口返回 Promise 对象
> <br>注意:如果需要标识归属渠道,则调用本接口时必须传递 state 参数。
> <br> 小程序可在 wx.getLaunchOptionsSync() 或 wx.getEnterOptionsSync() 获取启动参数中的 query,在 query 参数中携带有 state 信息。
> <br> 小游戏可在 wx.getLaunchOptionsSync() 或 wx.getEnterOptionsSync()或 wx.onShow() 获取启动参数中的 query,在 query 参数中携带有 state 信息。
> <br> state 信息并非一定会携带,所以此字段非必填字段,但是如果获取到此信息,务必通过本接口传递,否则会丢失归属渠道信息。
##### 调用方式
```javascript
zwsdk.login(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :------------ | :---- | :------ | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------- |
> | state | true | String | - | 渠道信息 (wx.getEnterOptionsSync() 返回值里 query.state ) |
> | query | true | String | - | 启动小游戏的 query 参数 (需要 JSON.stringify 转成 String) |
> | showLoading | false | Boolean | false | 异步请求中,是否显示微信小程序 loading 提示框 |
> | loadingParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showLoading](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showLoading.html) 参数一致 |
> | showToast | false | Boolean | false | 异步请求失败,是否显示微信小程序消息提示框 <br>异步请求成功,若要显示消息提示,需主动调用微信小程序消息提示框框 |
> | toastParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showToast](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showToast.html) 参数一致 |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :----------------------------------------------------------- | :----- | :------- |
> | 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;player_id | String | 玩家 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avatar | String | 头像 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;has_identify | String | 是否实名 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_token | String | TOKEN |
##### 示例
```javascript
const { query } = wx.getEnterOptionsSync()
zwsdk
.login({
state: query.state || '',
query: query
})
.then((res) => {
// .......
// res.status 返回状态
// res.msg 返回信息
// res.data.data 返回数据
})
```
### 3.4 SDK 账号更新<a name="sec3.4"></a>
---
##### 接口说明
> **\***接口返回 Promise 对象
> <br> SDK 不主动上传用户信息,若要更新用户信息,需主动调用此接口
##### 调用方式
```javascript
zwsdk.updateUserInfo(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :------------- | :---- | :------ | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------- |
> | raw_data | true | String | - | 不包括敏感信息的原始数据字符串,用于计算签名 |
> | signature | true | String | - | 使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息 |
> | encrypted_date | true | String | - | 包括敏感数据在内的完整用户信息的加密数据 |
> | iv | true | String | - | 加密算法的初始向量 |
> | user_info | True | Object | - | wx.getUserInfo 返回值里的 userInfo 字段 |
> | showLoading | false | Boolean | false | 异步请求中,是否显示微信小程序 loading 提示框 |
> | loadingParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showLoading](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showLoading.html) 参数一致 |
> | showToast | false | Boolean | false | 异步请求失败,是否显示微信小程序消息提示框 <br>异步请求成功,若要显示消息提示,需主动调用微信小程序消息提示框框 |
> | toastParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showToast](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showToast.html) 参数一致 |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :----------------------------------------------------------- | :----- | :------- |
> | 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;player_id | String | 玩家 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avatar | String | 头像 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mobile | String | 手机号 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;has_identify | String | 是否实名 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_token | String | TOKEN |
##### 示例
```
<button bindgetuserinfo="updateUserInfo" open-type="getUserInfo"> 授权</button>
```
```javascript
function updateUserInfo(e) {
zwsdk
.updateUserInfo({
raw_data: e.detail.rawData,
signature: e.detail.signature,
encrypted_data: e.detail.encryptedData,
iv: e.detail.iv,
user_info: e.detail.userInfo
})
.then((res) => {
// .......
// res.status 返回状态
// res.msg 返回信息
// res.data.data 返回数据
})
}
// 主动上传用户信息,需先校验用户是否开启授权
wx.getSetting({
success: (res) => {
if (res.authSetting['scope.userInfo']) {
// 用户当前已授权,则可调用 wx.getUserInfo 获取用户最新个人信息
wx.getUserInfo({
success: (userInfo) => {
zwsdk.updateUserInfo({
raw_data: userInfo.rawData,
signature: userInfo.signature,
encrypted_data: userInfo.encryptedData,
iv: userInfo.iv,
user_info: userInfo.userInfo
})
}
})
}
}
})
```
### 3.5 SDK 下单<a name="sec3.5"></a>
---
##### 接口说明
> **\***接口返回 Promise 对象
>
> 此接口会依据管理后台配置,分二种处理情况:
>
> - 调起米大师支付
> - 调起支付小程序支付
##### 调用方式
```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 | true | String | "" | CP 自定义扩展字段,透传信息 |
> | 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_vip | true | String | "0" | 玩家 VIP 等级 |
> | showLoading | false | Boolean | false | 异步请求中,是否显示微信小程序 loading 提示框 |
> | loadingParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showLoading](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showLoading.html) 参数一致 |
> | showToast | false | Boolean | false | 异步请求失败,是否显示微信小程序消息提示框 <br>异步请求成功,若要显示消息提示,需主动调用微信小程序消息提示框框 |
> | toastParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showToast](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showToast.html) 参数一致 |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :------------------------------------------------------------------------------------------------------- | :----- | :------- |
> | 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
zwsdk
.createOrder({
order: {
cp_order_id: '10001',
product_price: '1',
amount: '1'
product_id: '1000000001',
product_cnt: '1',
product_name: '金币',
product_desc: '金币',
ext: ''
},
role: {
event: '',
server_id: '',
server_name: '',
cp_role_id: '',
role_name: '',
role_vip: '0'
}
})
.then((res) => {
// .......
// res.status 返回状态
// res.msg 返回信息
// res.data.data 返回数据
})
```
### 3.6 SDK 查询支付结果<a name="sec3.6"></a>
---
##### 接口说明
> **\***接口返回 Promise 对象
##### 调用方式
```javascript
zwsdk.checkOrder(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :------------------------------------------------------- | :---- | :------ | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------- |
> | order | true | Object | - | 订单相关 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_id | true | String | - | 查询的订单号 |
> | showLoading | false | Boolean | false | 异步请求中,是否显示微信小程序 loading 提示框 |
> | loadingParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showLoading](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showLoading.html) 参数一致 |
> | showToast | false | Boolean | false | 异步请求失败,是否显示微信小程序消息提示框 <br>异步请求成功,若要显示消息提示,需主动调用微信小程序消息提示框框 |
> | toastParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showToast](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showToast.html) 参数一致 |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :-------------------------------------------------------------------------------------------------------------- | :----- | :------- |
> | 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
zwsdk
.checkOrder({
order: {
order_id: '10001'
}
})
.then((res) => {
// .......
// res.status 返回状态
// res.msg 返回信息
// res.data.data 返回数据
})
```
### 3.7 SDK 分享内容<a name="sec3.7"></a>
---
##### 接口说明
> **\***接口主动发起分享
##### 调用方式
```javascript
zwsdk.getShareInfo()
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :-------------- | :---- | :------ | :----- | :----------------------------------------------------------- |
> | path | true | String | - | 分享参数,可记录分享者信息;用户通过分享进入游戏会原样携带这些参数 |
> | shareAppMessage | true | Boolean | true | 是否主动拉起分享;默认拉起,false为不拉起 |
> | showLoading | false | Boolean | false | 异步请求中,是否显示微信小程序 loading 提示框 |
> | loadingParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showLoading](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showLoading.html) 参数一致 |
> | showToast | false | Boolean | false | 异步请求失败,是否显示微信小程序消息提示框 <br>异步请求成功,若要显示消息提示,需主动调用微信小程序消息提示框框 |
> | toastParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showToast](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showToast.html) 参数一致 |
##### 示例
```javascript
zwsdk.getShareInfo({
path: '?role_id=1405&server_id=1',//参数示例,仅供参考,具体根据需要传参;如果不需要则可以直接传空字符串;
shareAppMessage: true //是否拉起分享,true为拉起,false为不拉起,只作设置分享
})
```
##### 注意
> path参数不为空时,必须以"?"开始,若不以"?"开始,一律以无效参数处理;其中state,material_id,zyou_inviter为内置参数,避免使用!
### 3.8 SDK 角色上报<a name="sec3.8"></a>
---
##### 接口说明
> **\***接口返回 Promise 对象
##### 调用方式
```javascript
zwsdk.updateRole(config:Object)
```
##### 请求参数
###### 创建角色 create
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | 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;power | true | String | "" | 国家 | |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reiki_num | false | Int | 0 | 最新角色灵符值 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
###### 角色上线 online 角色下线 offline
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | 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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 | |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reiki_num | false | Int | 0 | 最新角色灵符值 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;online_time | false | Int | 0 | 本次在线时长 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 | |
###### 角色升级 level_up
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | 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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
> | &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 | 本次在线时长 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 | |
###### 官邸升级事件 main_city_upgrade
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | &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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
###### 章节完成事件 chapter_complete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | &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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
###### 删除角色 delete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | &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 | - | 游戏角色名称 |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :---------- | :----- | :------- |
> | status_code | String | 返回状态 |
> | msg | String | 返回信息 |
##### EVENT 枚举
> | EVENT | 说明 |
> | -------- | -------- |
> | create | 创建角色 |
> | online | 角色上线 |
> | offline | 角色下线 |
> | level_up | 角色升级 |
> | delete | 删除角色 |
> | recharge | 角色充值 |
> | main_city_upgrade | 官邸升级事件 |
> | chapter_complete | 章节完成事件 |
> | other | 其他 |
##### 示例
```javascript
zwsdk
.updateRole({
role: {
event: 'create',
server_id: '10001',
server_name: '一区',
cp_role_id: '1000005',
power: '1000005',
main_city_level: 1,
chapter_index: 2,
role_name: '角色名称',
role_vip: '7',
combat_num: '1500000',
online_time: '0',
reiki_num: '10',
}
})
.then((res) => {
// .......
// res.status 返回状态
// res.msg 返回信息
})
```
### 3.9 SDK 敏感词监测<a name="sec3.9"></a>
---
##### 接口说明
> **\***接口返回 Promise 对象
##### 调用方式
```javascript
zwsdk.checkMsg(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :------------ | :---- | :------ | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------- |
> | content | true | String | - | 用于检测的字符串 |
> | showLoading | false | Boolean | false | 异步请求中,是否显示微信小程序 loading 提示框 |
> | loadingParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showLoading](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showLoading.html) 参数一致 |
> | showToast | false | Boolean | false | 异步请求失败,是否显示微信小程序消息提示框 <br>异步请求成功,若要显示消息提示,需主动调用微信小程序消息提示框框 |
> | toastParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showToast](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showToast.html) 参数一致 |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :---------- | :----- | :------- |
> | status_code | String | 返回状态 |
> | msg | String | 返回信息 |
##### 返回数据样例
> status_code 为 1 且 data.data.check_result 为 1 则表示检测通过
```javascript
{
"status_code": 1,
"msg": "操作成功",
"data": {
"data": {
"errcode": 0,
"errmsg": "ok",
"detail": [
{
"strategy": "content_model",
"errcode": 0,
"suggest": "pass",
"label": 100,
"prob": 90
},
{
"strategy": "keyword",
"errcode": 0
}
],
"trace_id": "61dbc649-5c6b05aa-2cf825e6",
"result": {
"suggest": "pass",
"label": 100
},
"message": "",
"check_result": 1 // 1 表示检测通过、0 未通过
}
},
"extra": {}
}
```
##### sdk调用示例
```javascript
zwsdk
.checkMsg({
content: '中华人民共和国万岁!'
})
.then((res) => {
// .......
// res.status 返回状态
// res.msg 返回信息
})
```
### 3.10 SDK 敏感图片监测<a name="sec3.10"></a>
---
##### 接口说明
> **\***接口返回 Promise 对象
##### 调用方式
```javascript
zwsdk.checkImg(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :------------ | :---- | :------ | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------- |
> | filePath | true | String | - | 用于检测的图片链接 |
> | showLoading | false | Boolean | false | 异步请求中,是否显示微信小程序 loading 提示框 |
> | loadingParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showLoading](https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showLoading.html) 参数一致 |
> | showToast | false | Boolean | false | 异步请求失败,是否显示微信小程序消息提示框 <br>异步请求成功,若要显示消息提示,需主动调用微信小程序消息提示框框 |
> | toastParams | false | Object | - | showLoading 为 true 时生效。与[微信小程序 showToast](https://developers.weixin.qq.com/minigame/dev/api/ui/interaction/wx.showToast.html) 参数一致 |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :---------- | :----- | :------- |
> | status_code | String | 返回状态 |
> | msg | String | 返回信息 |
##### 示例
```javascript
wx.chooseImage({
count: 1,
success: (res) => {
zwsdk
.checkImg({
filePath: res.tempFilePaths[0]
})
.then((res) => {
// .......
// res.status 返回状态
// res.msg 返回信息
})
}
})
```
### 3.11 SDK 客服消息<a name="sec3.11"></a>
##### 接口说明
> **\***按钮调用接口
##### 调用方式
```javascript
zwsdk.customMessage()
```
##### 示例
```javascript
wx.customMessage()
```
'use strict';var __awaiter=this&&this['__awaiter']||function(_0x28563b,_0x288eec,_0x388769,_0x16c3c1){function _0x254542(_0x38f985){return _0x38f985 instanceof _0x388769?_0x38f985:new _0x388769(function(_0x31050e){_0x31050e(_0x38f985);});}return new(_0x388769||(_0x388769=Promise))(function(_0xe2ef40,_0x36d582){function _0x26d6c8(_0x216808){try{_0x5035a0(_0x16c3c1['next'](_0x216808));}catch(_0xe75a90){_0x36d582(_0xe75a90);}}function _0x513fc1(_0x1bf988){try{_0x5035a0(_0x16c3c1['throw'](_0x1bf988));}catch(_0x5d901c){_0x36d582(_0x5d901c);}}function _0x5035a0(_0x47673d){_0x47673d['done']?_0xe2ef40(_0x47673d['value']):_0x254542(_0x47673d['value'])['then'](_0x26d6c8,_0x513fc1);}_0x5035a0((_0x16c3c1=_0x16c3c1['apply'](_0x28563b,_0x288eec||[]))['next']());});};var __generator=this&&this['__generator']||function(_0x2e853a,_0x1d9ef1){var _0x1a3148={'label':0x0,'sent':function(){if(_0x294b7c[0x9fcfc^0x9fcfc]&(0x4eca7^0x4eca6))throw _0x294b7c[0xe3a82^0xe3a83];return _0x294b7c[0xb38aa^0xb38ab];},'trys':[],'ops':[]},_0x4eac1f,_0xf36625,_0x294b7c,_0x2c24b7;return _0x2c24b7={'next':_0x99ae55(0x8a312^0x8a312),'throw':_0x99ae55(0xd38fc^0xd38fd),'return':_0x99ae55(0xf0c1d^0xf0c1f)},typeof Symbol==='function'&&(_0x2c24b7[Symbol['iterator']]=function(){return this;}),_0x2c24b7;function _0x99ae55(_0x321202){return function(_0x13cbd4){return _0x2091e5([_0x321202,_0x13cbd4]);};}function _0x2091e5(_0x1346c1){if(_0x4eac1f)throw new TypeError('Generator\x20is\x20already\x20executing.');while(_0x1a3148)try{if(_0x4eac1f=0xe9fb1^0xe9fb0,_0xf36625&&(_0x294b7c=_0x1346c1[0x53189^0x53189]&(0x44629^0x4462b)?_0xf36625['return']:_0x1346c1[0xe5552^0xe5552]?_0xf36625['throw']||((_0x294b7c=_0xf36625['return'])&&_0x294b7c['call'](_0xf36625),0x26279^0x26279):_0xf36625['next'])&&!(_0x294b7c=_0x294b7c['call'](_0xf36625,_0x1346c1[0x71da7^0x71da6]))['done'])return _0x294b7c;if(_0xf36625=0x72be4^0x72be4,_0x294b7c)_0x1346c1=[_0x1346c1[0xdc812^0xdc812]&(0xf31a3^0xf31a1),_0x294b7c['value']];switch(_0x1346c1[0x9acba^0x9acba]){case 0xb786b^0xb786b:case 0x33706^0x33707:_0x294b7c=_0x1346c1;break;case 0xc2dcf^0xc2dcb:_0x1a3148['label']++;return{'value':_0x1346c1[0xe0fa1^0xe0fa0],'done':![]};case 0x9e9fa^0x9e9ff:_0x1a3148['label']++;_0xf36625=_0x1346c1[0x2c0a3^0x2c0a2];_0x1346c1=[0xf0d54^0xf0d54];continue;case 0xc7862^0xc7865:_0x1346c1=_0x1a3148['ops']['pop']();_0x1a3148['trys']['pop']();continue;default:if(!(_0x294b7c=_0x1a3148['trys'],_0x294b7c=_0x294b7c['length']>(0x7e088^0x7e088)&&_0x294b7c[_0x294b7c['length']-(0x1d786^0x1d787)])&&(_0x1346c1[0x79d69^0x79d69]===(0x2a2ce^0x2a2c8)||_0x1346c1[0x3aa83^0x3aa83]===(0x439e5^0x439e7))){_0x1a3148=0xec5cb^0xec5cb;continue;}if(_0x1346c1[0xedf51^0xedf51]===(0x55fc2^0x55fc1)&&(!_0x294b7c||_0x1346c1[0xab1dc^0xab1dd]>_0x294b7c[0x48667^0x48667]&&_0x1346c1[0x8fd88^0x8fd89]<_0x294b7c[0xe3dbd^0xe3dbe])){_0x1a3148['label']=_0x1346c1[0xe9d66^0xe9d67];break;}if(_0x1346c1[0xe42d5^0xe42d5]===(0x1a39a^0x1a39c)&&_0x1a3148['label']<_0x294b7c[0x4636b^0x4636a]){_0x1a3148['label']=_0x294b7c[0x504d8^0x504d9];_0x294b7c=_0x1346c1;break;}if(_0x294b7c&&_0x1a3148['label']<_0x294b7c[0xbd199^0xbd19b]){_0x1a3148['label']=_0x294b7c[0x82b31^0x82b33];_0x1a3148['ops']['push'](_0x1346c1);break;}if(_0x294b7c[0x46f93^0x46f91])_0x1a3148['ops']['pop']();_0x1a3148['trys']['pop']();continue;}_0x1346c1=_0x1d9ef1['call'](_0x2e853a,_0x1a3148);}catch(_0x19d579){_0x1346c1=[0xec3eb^0xec3ed,_0x19d579];_0xf36625=0xb89fc^0xb89fc;}finally{_0x4eac1f=_0x294b7c=0xc7807^0xc7807;}if(_0x1346c1[0x69749^0x69749]&(0xace7a^0xace7f))throw _0x1346c1[0xe9fa9^0xe9fa8];return{'value':_0x1346c1[0x66c48^0x66c48]?_0x1346c1[0x1c808^0x1c809]:void(0xeb31f^0xeb31f),'done':!![]};}};exports['__esModule']=!![];var zwsdk=function(){function _0x15904a(){this['VERSION']='1.3.0';var _0x4f4626=arguments['length']>(0x8751b^0x8751b)&&void(0xd5a8e^0xd5a8e)!==arguments[0xe9e32^0xe9e32]?arguments[0x50dc7^0x50dc7]:null;var _0x2db653=wx['getEnterOptionsSync']()['query'];if(_0x4f4626){_0x15904a['default']['appId']=_0x4f4626['app_id'];_0x15904a['default']['gameId']=_0x4f4626['game_id'];_0x15904a['default']['os']=_0x15904a['getSystemOS']();_0x15904a['default']['baseUrl']=_0x4f4626['dev']?'https://zs.zwwlkj03.top/api':'https://zyou.wozhangwan.com/api';_0x15904a['default']['query']=_0x2db653;_0x15904a['default']['state']=_0x15904a['getState'](_0x2db653);var _0xa73416=wx['getSystemInfoSync']()['SDKVersion'];console['log']('lib\x20version:'+_0xa73416);if(_0x15904a['selfCompareVersion'](_0xa73416,'1.4.0')>=(0xac6ac^0xac6ac)){wx['setKeepScreenOn']({'keepScreenOn':!![]});console['log']('设置不息屏');}else{}}}_0x15904a['selfCompareVersion']=function(_0x18599b,_0xe37c94){_0x18599b=_0x18599b['split']('.');_0xe37c94=_0xe37c94['split']('.');var _0x19c783=Math['max'](_0x18599b['length'],_0xe37c94['length']);while(_0x18599b['length']<_0x19c783){_0x18599b['push']('0');}while(_0xe37c94['length']<_0x19c783){_0xe37c94['push']('0');}for(var _0x48ca79=0x8478f^0x8478f;_0x48ca79<_0x19c783;_0x48ca79++){var _0x174966=parseInt(_0x18599b[_0x48ca79]);var _0x315734=parseInt(_0xe37c94[_0x48ca79]);if(_0x174966>_0x315734){return 0xa75f2^0xa75f3;}else if(_0x174966<_0x315734){return-(0xcd19b^0xcd19a);}}return 0xa81f6^0xa81f6;};_0x15904a['prototype']['getGameConf']=function(){return new Promise(function(_0x206ae3,_0x4537cc){_0x15904a['ajax']('/mini_sdk/game/getConf',{'app_id':_0x15904a['default']['appId'],'game_id':_0x15904a['default']['gameId'],'app_version':'1.0'})['then'](function(_0x2aaeb7){_0x206ae3(_0x2aaeb7);});});};_0x15904a['prototype']['login']=function(){var _0x11fc77=arguments['length']>(0x60548^0x60548)&&void(0x45d4f^0x45d4f)!==arguments[0x2fd36^0x2fd36]?arguments[0xd00fd^0xd00fd]:{};return new Promise(function(_0x179274,_0x1f67db){wx['login']({'success':function(_0x4fa27c){var _0x581334=_0x4fa27c['code'];_0x15904a['ajax']('/mini_sdk/auth/login',{'code':_0x581334,'state':_0x15904a['default']['state'],'query':_0x15904a['default']['query'],'app_id':_0x15904a['default']['appId'],'game_id':_0x15904a['default']['gameId'],'os':_0x15904a['default']['os'],'device_number':_0x15904a['default']['device_brand'],'device_brand':_0x15904a['default']['device_brand']})['then'](function(_0x14a77d){var _0x12d057=_0x14a77d;if(_0x14a77d['status_code']===(0x6d429^0x6d428)){_0x15904a['default']['userToken']=_0x14a77d['data']['data']['user_token'];_0x15904a['default']['memberId']=_0x14a77d['data']['data']['member_id'];}_0x15904a['initShare']();_0x179274(_0x12d057);});}});});};_0x15904a['prototype']['updateUserInfo']=function(){var _0x456ad3=arguments['length']>(0xb66d2^0xb66d2)&&void(0x2cf1f^0x2cf1f)!==arguments[0x270f3^0x270f3]?arguments[0x22fc7^0x22fc7]:{};return new Promise(function(_0x2b014e,_0x3da1e4){_0x15904a['ajax']('/mini_sdk/member/updateInfo',{'app_id':_0x15904a['default']['appId'],'game_id':_0x15904a['default']['gameId'],'member_id':_0x15904a['default']['memberId'],'raw_data':_0x456ad3['raw_data']||'','signature':_0x456ad3['signature']||'','encrypted_data':_0x456ad3['encrypted_data']||'','iv':_0x456ad3['iv']||'','user_info':_0x456ad3['user_info']||''})['then'](function(_0x5b6460){_0x15904a['default']['roleId']=_0x5b6460['data']['data']['role_id']||'';_0x2b014e(_0x5b6460);});});};_0x15904a['prototype']['createOrder']=function(){var _0x2bfd80=this;var _0xd75bdc=arguments['length']>(0xa7a89^0xa7a89)&&void(0x478f1^0x478f1)!==arguments[0x23e92^0x23e92]?arguments[0x5648a^0x5648a]:{};return new Promise(function(_0x5467a5,_0x383fa0){return __awaiter(_0x2bfd80,void(0x3648c^0x3648c),void(0xa4103^0xa4103),function(){var _0x58d01a,_0x3ea7d0,_0x33115a,_0x780349,_0x3a46a2,_0x222bd8,_0x361623,_0x394d62,_0x5184be,_0x27b59c;var _0x11b137=this;return __generator(this,function(_0x15224f){switch(_0x15224f['label']){case 0xe6383^0xe6383:return[0x222b3^0x222b7,_0x15904a['ajax']('/mini_sdk/order/create',{'app_id':_0x15904a['default']['appId'],'game_id':_0x15904a['default']['gameId'],'member_id':_0x15904a['default']['memberId'],'os':_0x15904a['default']['os'],'device_number':_0x15904a['default']['device_number'],'device_brand':_0x15904a['default']['device_brand'],'order':_0xd75bdc['order']||{},'role':_0xd75bdc['role']||{},'role_id':_0x15904a['default']['roleId']})];case 0x35a07^0x35a06:_0x58d01a=_0x15224f['sent']();if(_0x58d01a['status_code']===(0xbbab1^0xbbab0)){_0x5467a5({'status_code':_0x58d01a['status_code'],'msg':_0x58d01a['msg'],'data':{'data':{'order_id':_0x58d01a['data']['data']['order_id']}}});_0x3ea7d0=_0x58d01a['data']['data']['pay_type'];if(_0x3ea7d0==='customer'){wx['showModal']({'title':'充值教程','content':'即将跳转官方【客服会话】充值,给客服回复“1”获取充值链接','confirmText':'客服充值','showCancel':![],'success':function(_0x3fb3c7){if(_0x3fb3c7['confirm']){console['log']('res');_0x11b137['customMessage']();}}});}if(_0x3ea7d0==='minipay'){wx['navigateToMiniProgram']({'appId':_0x58d01a['data']['data']['mini_pay']['app_id'],'path':_0x58d01a['data']['data']['mini_pay']['path']});}if(_0x3ea7d0==='mpay'){_0x33115a=_0x58d01a['data']['data']['mpay'],_0x780349=_0x33115a['mode'],_0x3a46a2=_0x33115a['env'],_0x222bd8=_0x33115a['offer_id'],_0x361623=_0x33115a['currency_type'],_0x394d62=_0x33115a['platform'],_0x5184be=_0x33115a['buy_quantity'],_0x27b59c=_0x33115a['zone_id'];wx['requestMidasPayment']({'mode':_0x780349,'env':_0x3a46a2,'offerId':_0x222bd8,'currencyType':_0x361623,'buyQuantity':_0x5184be,'platform':_0x394d62,'zoneId':_0x27b59c,'complete':function(_0x477422){_0x15904a['ajax']('/mini_sdk/mds_pay/callback',{'order_id':_0x58d01a['data']['data']['order_id']||'','status':_0x477422['errCode']?![]:!![],'code':_0x477422['errCode'],'msg':_0x477422['errMsg']})['then'](function(_0x4906aa){});}});}}else{_0x5467a5(_0x58d01a);}return[0x4f592^0x4f590];}});});});};_0x15904a['prototype']['checkOrder']=function(){var _0x56f6f9=arguments['length']>(0xabf23^0xabf23)&&void(0xb1f32^0xb1f32)!==arguments[0xa1eff^0xa1eff]?arguments[0xac9da^0xac9da]:{};return new Promise(function(_0x160594,_0x1c81cd){_0x15904a['ajax']('/mini_sdk/order/getPayStatus',{'order':_0x56f6f9['order']})['then'](function(_0x2286d5){_0x160594(_0x2286d5);});});};_0x15904a['initShare']=function(){_0x15904a['ajax']('/mini_sdk/share/getShareInfo',{'game_id':_0x15904a['default']['gameId'],'member_id':_0x15904a['default']['memberId'],'app_id':_0x15904a['default']['appId']})['then'](function(_0x3f0b6b){wx['onShareAppMessage'](function(){_0x15904a['log']('系统转发:onShareAppMessage',{'params':{'game_id':_0x15904a['default']['gameId'],'member_id':_0x15904a['default']['memberId'],'app_id':_0x15904a['default']['appId']},'result':_0x3f0b6b});_0x15904a['reportShare']({'share_id':_0x3f0b6b['data']['data']['share_id']});return{'title':_0x3f0b6b['data']['data']['title'],'imageUrl':_0x3f0b6b['data']['data']['share_img'],'query':'state='+_0x3f0b6b['data']['data']['state']};});wx['showShareMenu']({'withShareTicket':!![],'menus':['shareAppMessage','shareTimeline']});});};_0x15904a['prototype']['getShareInfo']=function(){var _0x1af2c6=arguments['length']>(0xdcb79^0xdcb79)&&void(0xcf7d4^0xcf7d4)!==arguments[0x2723a^0x2723a]?arguments[0x9f197^0x9f197]:{};_0x15904a['ajax']('/mini_sdk/share/getShareInfo',{'game_id':_0x15904a['default']['gameId'],'member_id':_0x15904a['default']['memberId'],'app_id':_0x15904a['default']['appId'],'path':_0x1af2c6['path']||''})['then'](function(_0xb2a9e5){wx['onShareAppMessage'](function(){_0x15904a['log']('系统转发:onShareAppMessage',{'params':{'game_id':_0x15904a['default']['gameId'],'member_id':_0x15904a['default']['memberId'],'app_id':_0x15904a['default']['appId'],'path':_0x1af2c6['path']||''},'result':_0xb2a9e5});_0x15904a['reportShare']({'share_id':_0xb2a9e5['data']['data']['share_id']});return{'title':_0xb2a9e5['data']['data']['title'],'imageUrl':_0xb2a9e5['data']['data']['share_img'],'query':'state='+_0xb2a9e5['data']['data']['state']};});wx['showShareMenu']({'withShareTicket':!![],'menus':['shareAppMessage','shareTimeline']});if(_0x1af2c6['shareAppMessage']||_0x1af2c6['shareAppMessage']===undefined){wx['shareAppMessage']({'title':_0xb2a9e5['data']['data']['title'],'imageUrl':_0xb2a9e5['data']['data']['share_img'],'query':'state='+_0xb2a9e5['data']['data']['state']});_0x15904a['reportShare']({'share_id':_0xb2a9e5['data']['data']['share_id']});_0x15904a['log']('主动转发:shareAppMessage',{'share_id':_0xb2a9e5['data']['data']['share_id']});}});};_0x15904a['reportShare']=function(){var _0x484198=arguments['length']>(0x65393^0x65393)&&void(0xda347^0xda347)!==arguments[0xc51ba^0xc51ba]?arguments[0x79a24^0x79a24]:{};_0x15904a['ajax']('/mini_sdk/share/report',{'game_id':_0x15904a['default']['gameId'],'member_id':_0x15904a['default']['memberId'],'app_id':_0x15904a['default']['appId'],'share_id':_0x484198['share_id']||'','ext':_0x484198['ext']||''})['then'](function(_0x4ad097){console['log'](_0x4ad097);});};_0x15904a['prototype']['updateRole']=function(){var _0x44bb52=arguments['length']>(0xb2b36^0xb2b36)&&void(0xe005f^0xe005f)!==arguments[0xdd5d6^0xdd5d6]?arguments[0xe49b8^0xe49b8]:{};return new Promise(function(_0x464df5,_0x465453){_0x15904a['ajax']('/mini_sdk/role/report',{'app_id':_0x15904a['default']['appId'],'game_id':_0x15904a['default']['gameId'],'member_id':_0x15904a['default']['memberId'],'os':_0x15904a['default']['os'],'device_number':_0x15904a['default']['device_number'],'device_brand':_0x15904a['default']['device_brand'],'role':_0x44bb52['role']||{}})['then'](function(_0x9381b8){_0x464df5(_0x9381b8);});});};_0x15904a['prototype']['checkMsg']=function(){var _0x31899b=arguments['length']>(0xeda5c^0xeda5c)&&void(0x26bb8^0x26bb8)!==arguments[0xa2f59^0xa2f59]?arguments[0xf39cb^0xf39cb]:{};return new Promise(function(_0x1200de,_0x35e106){_0x15904a['ajax']('/mini_sdk/check/message',{'game_id':_0x15904a['default']['gameId'],'member_id':_0x15904a['default']['memberId'],'app_id':_0x15904a['default']['appId'],'content':_0x31899b['content']||''})['then'](function(_0x2587e5){_0x1200de(_0x2587e5);});});};_0x15904a['prototype']['checkImg']=function(){var _0x35e031=arguments['length']>(0x7a121^0x7a121)&&void(0xb8602^0xb8602)!==arguments[0xcd016^0xcd016]?arguments[0x9dd4d^0x9dd4d]:{};return new Promise(function(_0x8f255c,_0x1652d5){wx['uploadFile']({'url':_0x15904a['default']['baseUrl']+'/mini_sdk/check/image','filePath':_0x35e031['filePath'],'name':'image','header':{'User-Token':_0x15904a['default']['userToken']},'formData':{'game_id':_0x15904a['default']['gameId'],'member_id':_0x15904a['default']['memberId'],'app_id':_0x15904a['default']['appId'],'user_token':_0x15904a['default']['userToken']},'success':function(_0x1f472c){_0x8f255c(_0x1f472c);}});});};_0x15904a['prototype']['customMessage']=function(){_0x15904a['ajax']('/mini_sdk/custom_message/config',{'game_id':_0x15904a['default']['gameId']})['then'](function(_0x13780a){if(_0x13780a['status_code']===(0xd38ea^0xd38eb)){wx['openCustomerServiceConversation']({'sessionFrom':_0x13780a['data']['data']['session_from'],'showMessageCard':_0x13780a['data']['data']['show_message_card'],'sendMessageTitle':_0x13780a['data']['data']['send_message_title'],'sendMessagePath':_0x13780a['data']['data']['send_message_path'],'sendMessageImg':_0x13780a['data']['data']['send_message_img'],'complete':function(_0x52052a){console['log']('openCustomerServiceConversation:',_0x52052a);_0x15904a['log']('客服会话:openCustomerServiceConversation',_0x52052a);}});}});};_0x15904a['prototype']['sendCaptcha']=function(){var _0x137bb1=arguments['length']>(0xabb47^0xabb47)&&void(0x92028^0x92028)!==arguments[0xbb4b0^0xbb4b0]?arguments[0x67b71^0x67b71]:{};return new Promise(function(_0x1a6c6c,_0x10bb2b){_0x15904a['ajax']('/mini_sdk/captcha/send',{'mobile':_0x137bb1['mobile']||''})['then'](function(_0x3d04cc){_0x1a6c6c(_0x3d04cc);});});};_0x15904a['prototype']['bindMobile']=function(){var _0xba527b=arguments['length']>(0xace51^0xace51)&&void(0x27517^0x27517)!==arguments[0x2a961^0x2a961]?arguments[0x2b365^0x2b365]:{};return new Promise(function(_0x2a7151,_0x83ff0e){_0x15904a['ajax']('/mini_sdk/member/bindMobile',{'member_id':_0x15904a['default']['memberId'],'mobile':_0xba527b['mobile']||'','code':_0xba527b['code']||'','key':_0xba527b['key']||''})['then'](function(_0x28ca44){_0x2a7151(_0x28ca44);});});};_0x15904a['ajax']=function(_0x412024,_0x2a2db6){var _0x96b655={'content-type':'application/json'};if(_0x15904a['default']['userToken']){_0x96b655['User-Token']=_0x15904a['default']['userToken'];}var _0x565482=_0x2a2db6['showLoading'],_0x458030=_0x2a2db6['loadingParams'],_0x23354=_0x2a2db6['showToast'],_0x129e81=_0x2a2db6['toastParams'];_0x565482&&wx['showLoading'](_0x458030);return new Promise(function(_0x598395,_0x3a79e1){wx['request']({'method':'POST','url':_0x15904a['default']['baseUrl']+_0x412024,'data':_0x2a2db6,'header':_0x96b655,'success':function(_0x5afa2c){_0x565482&&wx['hideLoading']();if(_0x23354){_0x129e81['title']=_0x5afa2c['data']['msg'];wx['showToast'](_0x129e81);}_0x598395(_0x5afa2c['data']);},'fail':function(_0x5298c3){_0x565482&&wx['hideLoading']();if(_0x23354){_0x129e81['title']=_0x5298c3['errMsg'];wx['showToast'](_0x129e81);}_0x598395(_0x5298c3);}});});};_0x15904a['getSystemOS']=function(){var _0x4b57d1=wx['getSystemInfoSync']()['system'];if(_0x4b57d1['toLocaleLowerCase']()['indexOf']('android')>-(0x533bf^0x533be))return'android';if(_0x4b57d1['toLocaleLowerCase']()['indexOf']('ios')>-(0x4a280^0x4a281))return'ios';if(_0x4b57d1['toLocaleLowerCase']()['indexOf']('windows')>-(0xaa3fa^0xaa3fb))return'windows';if(_0x4b57d1['toLocaleLowerCase']()['indexOf']('macos')>-(0x62012^0x62013))return'macos';return'other';};_0x15904a['getSystemBrand']=function(){var _0x326326=wx['getSystemInfoSync']()['brand'];return _0x326326;};_0x15904a['getSystemNumber']=function(){var _0x4757c0=wx['getSystemInfoSync']()['model'];return _0x4757c0;};_0x15904a['midasPay']=function(_0x294a56){return wx['requestMidasPayment'](_0x294a56);};_0x15904a['getQueryVariable']=function(_0x1da603,_0x5a331a){var _0x10a17e=_0x1da603;var _0x275c7b=_0x10a17e['split']('&');for(var _0x2b8c0c=0xa52bd^0xa52bd;_0x2b8c0c<_0x275c7b['length'];_0x2b8c0c++){var _0x3b8208=_0x275c7b[_0x2b8c0c]['split']('=');if(_0x3b8208[0x369db^0x369db]===_0x5a331a){return _0x3b8208[0x8b2db^0x8b2da];}}return'';};_0x15904a['getState']=function(_0x195037){if(_0x195037['state']){return _0x195037['state'];}if(_0x195037['scene']&&_0x195037['scene']['indexOf']('state')>-(0xb0aab^0xb0aaa)){return _0x15904a['getQueryVariable'](decodeURIComponent(_0x195037['scene']),'state');}return'';};_0x15904a['log']=function(_0x3819d2,_0x306377){_0x15904a['ajax']('/mini_sdk/sdk_log/miniLog',{'name':_0x3819d2,'value':_0x306377})['then'](function(_0x2fb3c2){console['log']('log:',_0x2fb3c2);});};_0x15904a['default']={'appId':'','gameId':'','os':_0x15904a['getSystemOS'](),'device_number':_0x15904a['getSystemNumber'](),'device_brand':_0x15904a['getSystemBrand'](),'memberId':'','roleId':'','playerId':'','userToken':'','baseUrl':''};return _0x15904a;}();exports['default']=zwsdk;
\ No newline at end of file
# 服务端接口说明-v1.0.1
# 服务端接口说明-v1.0.1
### 目录
1.[接入说明](#sec1)
&nbsp;&nbsp;&nbsp;&nbsp;1.1 [术语表](#sec1.1)
&nbsp;&nbsp;&nbsp;&nbsp;1.2 [数据字典](#sec1.2)
2.[服务端接口](#sec1)
&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;请求示例
## 1. 接入说明<a name="sec1"></a>
### 1.1 术语表<a name="sec1.1"></a>
> | 名称 | 说明 |
> | ---------- | ------------------------------------------------------------ |
> | CP | 游戏研发商。 |
> | SDK | 由平台方提供给游戏研发商,用于游戏接入平台登录,支付。 |
> | SDK 服务 | 由平台方开发,用于完成 SDK 的登录,支付流程,承接游戏服务端的数据。 |
> | 游戏服务 | 游戏研发商开发,为游戏提供服务。 |
> | 小游戏 | 游戏研发方商开发的微信小游戏。 |
> | H5游戏 | 游戏研发商开发的网页版游戏一般情况系与小游戏同游同服 |
> | 支付服务 | 由平台方调用支付服务,包括米大师,微信支付等 |
> | 小游戏入口 | 小游戏的入口链接,SDK 方默认为 pages/index/index(如果 CP 方不同需要提前与 SDK 沟通) |
### 1.2 数据字典<a name="sec1.2"></a>
> | 名称 | 说明 |
> | ----------- | ------------------------------------------------- |
> | member_id | 用户在平台注册账号的唯一标识。 |
> | player_id | 用户在平台的一个游戏中的唯一标识。 |
> | user_token | 用户在平台登录的会话标识。 |
> | game_id | 游戏在平台的唯一标识。 |
> | game_secret | 平台方提供,游戏签名秘钥。 |
> | cp_order_id | 游戏研发商订单唯一标识 |
> | order_id | 平台方提供,订单唯一标识,与 cp_order_id 一一对应 |
## 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 服务器;
>
> 接口需要进行签名,签名方法详见[接口规则](#sec2.1)
##### 接口地址
> 【POST】/server/role/serverReportV2
##### 请求参数
###### 创建角色 create
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | 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;power | true | String | "" | 国家 | |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reiki_num | false | Int | 0 | 最新角色灵符值 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
###### 角色上线 online 角色下线 offline
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | 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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 | |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reiki_num | false | Int | 0 | 最新角色灵符值 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;online_time | false | Int | 0 | 本次在线时长 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 | |
###### 角色升级 level_up
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | 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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
> | &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 | 本次在线时长 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 | |
###### 官邸升级事件 main_city_upgrade
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | &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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
###### 章节完成事件 chapter_complete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | &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;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | false | Int | 0 | 角色等级 |
###### 删除角色 delete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | game_id | true | Int | - | 游戏的game_id, 角色当前游戏ID |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 ios windows android
> | &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 | - | 游戏角色名称 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | | | | |
##### EVENT枚举
> | EVENT | 说明 |
> | -------- | -------- |
> | create | 创建角色 |
> | online | 角色上线 |
> | offline | 角色下线 |
> | level_up | 角色升级 |
> | delete | 删除角色 |
> | recharge | 角色充值 |
> | main_city_upgrade | 官邸升级事件 |
> | chapter_complete | 章节完成事件 |
> | other | 其他 |
##### 请求示例
```php
<php?
public function report(){
$host = 'https://zyou.wozhangwan.com/api';
$checkLoginUrl = '/mini_sdk/role/severReport';
$url = $host.$checkLoginUrl;
$gameSecret = "game_secret";
$body = ["game_id" => 121, //角色当前SDK方游戏ID
"player_id" => 1245,//游戏登录后由 SDK 返回的player_id
"type" => 1,//游戏角色操作环境,1:H5网页端,2:小游戏端,3:android游戏
"os" => "windows",//游戏操作系统:windows,android,ios
"role" =>[
"event" => 1,//角色事件类型
"server_id" =>1,//游戏区服ID
"server_name" => "区服一",//游戏区服名称
"cp_role_id" => "roleId",//游戏中角色唯一ID
"role_name" => "角色名称",//游戏角色名称
"power" => "国家",//国家
"main_city_level" => 1,//官邸等级
"chapter_index" => 1,//章节等级
"role_vip" => "0",//角色vip等级
"combat_num" => "0",//角色战力值
"online_time" => "0"//角色在线时长,单位为秒
]
];
$body["sign"] = makeSign($body, $gameSecret);
$headers = ["Content-Type:application/json"];
$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)) {
ksrot($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服务器一个游戏账号是否允许继续创角;
>
> 接口需要进行签名,签名方法详见[接口规则](#sec2.1)
##### 接口地址
> 【POST】/server/role/checkRoleCreate
##### 请求参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ---- |
> | Content-Type | true | application/json | |
> **Body:**
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------------------------------------- |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id | |
> | sign | true | String | - | 签名 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ------------------------------------------------------------ | ---- | ------ | ------ | ------------------------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | String | - | 返回信息 |
> | data | true | Object | | 返回数据对象 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data | true | Object | | 数据对象 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_create | true | Int | 1 | 1:允许创角,0:不允许创角 |
##### 请求示例
```php
<php?
public function report(){
$host = 'https://zyou.wozhangwan.com/api';
$checkLoginUrl = '/server/role/checkRoleCreate';
$url = $host.$checkLoginUrl;
$gameSecret = "game_secret";
$body = ["player_id" => 1245,//游戏登录后由 SDK 返回的player_id];
$body["sign"] = makeSign($body, $gameSecret);
$headers = ["Content-Type:application/json"];
$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)) {
ksrot($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);
}
```
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论