提交 79d0df5e 作者: 陈晨

fix conflicts

## GameSDKV1.0文档接入使用
## GameSDKV1.0文档接入使用
......@@ -77,6 +77,8 @@
               [调用示例](#sec11.1)
    12 [gradle依赖](#sec12)
    13 [apk打包](#sec13)
......@@ -86,43 +88,60 @@
               [打包说明](#sec13.2)
    14 [服务端接口说明](#sec14)
#### 1、对接说明 <a name="sec1"></a>
&nbsp;&nbsp; 1.1、此对接文档只适合与sdkv1.0版本。
&nbsp;&nbsp; 1.1、此对接文档只适合与sdkv1.0.53.4版本。
&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,"该游戏需要打开您的应用设置开启联网权限,并重启游戏,是否同意?");
```
&nbsp;&nbsp; 1.3、文档中所有GameSDK指S从平台获取arr文件或者远程依赖implementation("com.zw.game.sdk:gameSDk:1.0.53.4")
&nbsp;&nbsp; 1.4、开发工具:要求使用Android Studio 3.0版本及以上,Gradle版本建议5.4.1版本及以上,Gradle插件(Android gradle plugin)版本建议3.2.2版本及以上,- Android SDK版本:最低支持Android 5.0版本(minSdkVersion>=21),targetSdkVersion不支持30以上,建议targetSdkVersion=28;
游戏包体的VersionCode以及VersionName必须设置,不要留空。
### 2、对接SDK<a name="sec2"></a>
从平台处获取对接SDK,android studio版本,选择V1.0的版本接入。<a name="sec2.1"></a>
从平台处获取对接SDK,android studio版本,选择V1.0.53.4的版本接入。<a name="sec2.1"></a>
### 3、导入配置SDK资源Androidstudio项目<a name="sec3"></a>
#### 1.1、在app工程目录build.gradle中添加依赖<a name="sec3.1"></a>
#### 3.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.53.4")
```
#### 1.2、在主工程中添加maven<a name="sec3.2"></a>
#### 3.2、在主工程中添加maven<a name="sec3.2"></a>
```
//抖音SDK
maven {
url 'https://artifact.bytedance.com/repository/ttgamesdk/'
}
//巨量SDK
maven {
url 'https://artifact.bytedance.com/repository/Volcengine/'
}
maven {
url 'https://jitpack.io'
}
mavenCentral()
jcenter()
//掌玩SDK
maven { url 'http://nexus.zwwlkj01.top/repository/android-game/' }
```
#### 3.3本地ARR在gradle依赖
maven { url 'http://nexus.zwwlkj01.top/repository/android-game/' }
```
```
......@@ -130,9 +149,9 @@
#### 示例<a name="sec3.3"></a>
![示例1](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/default%2Fbuild1.png)
![示例1](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/android_game_png1.png)
![示例2](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/default%2Fbuild2.png)
![示例2](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/android_ganmepng2.png)
### 4、配置清单文件(具体请参考demo)<a name="sec4"></a>
......@@ -153,19 +172,30 @@
```
<meta-data
<!--掌玩SDK游戏ID-->
<meta-data
android:name="game_id"
android:value="149" />
<!-- 巨量开放平台申请应用,其他对接游戏默认传0-->
<!-- 巨量、快手、腾讯开放平台申请应用,用于转端包选择0 -->
<meta-data
android:name="app_id"
android:value="358562" />
android:value="517181" />
<!--用于判断是否激活巨量SDK,其他对接游戏默认false-->
<!--腾讯广告必填-->
<meta-data
android:name="status"
android:value="false" />
android:name="secret"
android:value="e15a3e99760a598a55f29e99ccb5ea7b" />
<!--快手平台申请应用名称,不是快手投放包可以选择不填写-->
<meta-data
android:name="app_name"
android:value="tlcq" />
<!--0默认SDK,1表示巨量AD,2表示快手,3表示腾讯-->
<meta-data
android:name="app_status"
android:value="1" />
```
......@@ -203,17 +233,41 @@ public class App extends GameSdkApplication {
```
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
ConfigInfo.allowPORTRAIT=false;
GameSdk.getInstance().init(mActivity);
GameSdk.getInstance().onCreate(mActivity);
setContentView(R.layout.activity_main);
init();
}
//游戏前必须首先进行初始化:
private void init() {
GameService.getInstance().onCreate(this, new InitZyCallback() {
@Override
public void onSuccess(int status) {
//1表示SDK默认登录初始化 2表示抖音
}
@Override
public void onFailed(Object o) {
showToast(o.toString());
}
});
//配置横竖屏,等一些可配置信息
ConfigInfo.allowPORTRAIT = false;
}
```
### 6、登录<a name="sec6"></a>
1、添加登录回调监听<a name="sec6.1"></a>
......@@ -221,7 +275,7 @@ public class App extends GameSdkApplication {
public void addLoginListener(OnLoginListener onLoginListener)
```
- 说明:在登陆前必须注册登陆回调监听,用于接收登陆结果,登录成功返回token
- 需游戏服务端调用登录验证之后,才能进入游戏参照(SDK对接说明 2.2)
- 需游戏服务端调用登录验证之后,才能进入游戏参照[SDK对接说明](#sec14)
#### 参数说明<a name="sec6.2"></a>
......@@ -279,12 +333,12 @@ void loginError(Object data);
#### 调用示例<a name="sec6.3"></a>
```
GameSdk.getInstance().addLoginListener(this, new OnLoginListener() {
GameService.getInstance().showLogin(new OnLoginListener() {
@Override
public void loginSuccess(Object data) {
public void loginSuccess(Object data,String token) {
Log.e("loginSuccess",data+"");
//显示悬浮球(根据游戏需求显示,可以在初始化显示,可以登录成功之后显示)
GameSdk.getInstance().show(SdkDemoActivity.this);
GameService.getInstance().showBall(SdkDemoActivity.this);
}
@Override
......@@ -295,13 +349,51 @@ void loginError(Object data);
```
#### 悬浮球生命周期中调佣
#### 抖音退出登录(不上架抖音游戏可忽略此方法)
```
GameService.getInstance().outLoginDy(new OnLogoutListener() {
@Override
public void logoutSuccess(String s) {
}
@Override
public void logoutError(String s) {
}
});
```
#### 游戏中有切换登录按钮可对接switchLogin方法(上架抖音平台)
```
//处理方式可参考登录方法
GameService.getInstance().switchLogin(new OnLoginListener() {
@Override
public void loginSuccess(Object data) {
}
@Override
public void loginError(Object data) {
}
});
```
#### 悬浮球生命周期中调佣(对接抖音不需要)
```
@Override
protected void onDestroy() {
super.onDestroy();
GameSdk.getInstance().onDestroy(this);
GameService.getInstance().onDestroy(this);
}
......@@ -332,7 +424,7 @@ public void showPay(CustomPayParam payParam, OnPaymentListener paymentListener)
CustomPayParam data=new CustomPayParam();
CustomPayParam.RoleBean role=new CustomPayParam.RoleBean();
CustomPayParam.OrderBean orderInfo=new CustomPayParam.OrderBean();
data.setRole_id("425");
//data.setRole_id("425");
role.setEvent("other");
role.setServer_id("100001");
role.setRole_name("主宰传奇");
......@@ -352,7 +444,7 @@ public void showPay(CustomPayParam payParam, OnPaymentListener paymentListener)
data.setRole(role);
data.setOrder(orderInfo);
GameSdk.getInstance().showPay(this,data, new OnPaymentListener() {
GameService.getInstance().showPay(data, new OnPaymentListener() {
@Override
public void Success(String msg) {
......@@ -392,7 +484,118 @@ public void showPay(CustomPayParam payParam, OnPaymentListener paymentListener)
### 8、支付回调通知<a name="sec8"></a>
1.1、支付回调通知请参考对接文档H5 SDK 对接文档-v1.0、服务端接入2.3<a name="sec8.1"></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();
```
### 9、角色上报<a name="sec9"></a>
......@@ -409,6 +612,7 @@ public void showPay(CustomPayParam payParam, OnPaymentListener paymentListener)
roleInfo.setRole_name("大鲨鱼");//角色名称
roleInfo.setRole_level("15"); //角色等级
roleInfo.setRole_vip("23");//角色VIP等级
roleInfo.setCp_account("23");//cp账号
roleInfo.setCombat_num("25564");//角色战力
roleInfo.setOnline_time("15426");//本次在线时长
......@@ -419,7 +623,10 @@ public void showPay(CustomPayParam payParam, OnPaymentListener paymentListener)
roleInfo.setTrans_level("5");//转生等级
roleInfo.setSponsor_level("12");//赞助等级/会员等级
roleInfo.setReiki_num("12"); //灵符值
//没有官邸等级之类传请传空
roleInfo.setMain_city_level("大司马");//官邸等级
roleInfo.setPower("阔克萨斯");//国家
roleInfo.setChapter_index("12");//章节等级
setting.setRole(roleInfo);
GameSdk.getInstance().putRoleReport(setting, new SubmitRoleInfoCallBack() {
@Override
......@@ -438,25 +645,39 @@ public void showPay(CustomPayParam payParam, OnPaymentListener paymentListener)
#### 参数字段说明<a name="sec9.2"></a>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | event | true | String | other | 事件类型 |
> | server_id | true | String | - | 区服ID |
> | server_name | true | String | - | 区服名称 |
> | cp_role_id | true | String | - | 游戏方角色ID |
> | role_name | true | String | - | 游戏角色名称 |
> | role_level | true | Int | - | 角色等级 |
> | cp_account | false | String | - | cp账号 |
> | role_vip | false | Int | 0 | 角色VIP等级(赞助等级) |
> | combat_num | false | String | "0" | 角色战力 |
> | reiki_num | false | Int | 0 | 角色灵符值 |
> | online_time | false | Int | 0 | 本次在线时长 |
> | attack | false | Int | 0 | 攻击力 |
> | profession | false | String | - | 职业 |
> | gang_name | false | String | - | 帮会(行会)名称 |
> | trans_level | false | Int | 0 | 转生等级 |
事件类型event
| EVENT | 说明 |
| -------- | -------- |
| create | 创建角色 |
| online | 角色上线 |
| offline | 角色下线 |
| level_up | 角色升级 |
| delete | 删除角色 |
| recharge | 角色充值 |
| other | 其他 |
| 名称 | 类型 | 是否必须| 默认值 |说明 |
|:--------| -------------:| -------------------:|-------------:|-------------:|
| role{} | object | 必须 | | 角色信息 |
| event | String | 必须 |other |事件类型,online: 角色登录, create: 创建角色,level_up: 提升等级,offline: 角色退出,other: 其他,delete: 删除角色 |
| server_id | string | 必须 |0 | 区服ID |
| server_name | string | 必须 |"" | 区服名称 |
| cp_role_id |string | 必须 |"" | CP角色ID |
| role_name | string | 必须 |"" | 角色名称 |
| role_level | number | 必须 | 0| 角色等级 |
| role_vip | number | 必须 |0| 角色VIP等级 |
| combat_num | number | 必须 |0 | 角色战力 |
| reiki_num | String | 必须 | "0"| 角色灵符值|
| online_time | number | 必须 | 0| 本次在线时长 |
| attack | number | 必须 |0| 攻击力 |
| profession | string | 必须 |""| 职业 |
| game_name | string | 必须 |"" |帮会(行会)名称 |
| trans_level | string | 必须 | 0| 转生等级 |
| sponsor_level | string | 必须 |0 | 赞助等级/会员等级 |
### 10、退出登录<a name="sec9"></a>
......@@ -464,7 +685,7 @@ public void showPay(CustomPayParam payParam, OnPaymentListener paymentListener)
#### 添加登出回调监听<a name="sec10.1"></a>
```
public void addLogoutListener(OnLogoutListener onLogoutListener)
public void outLoginDy(OnLogoutListener onLogoutListener)
```
......@@ -493,20 +714,19 @@ public void logoutError(String msg);
```
#### 调用示例<a name="sec10.5"></a>
```
GameSdk.getInstance().addLogoutListener(new OnLogoutListener() {
@Override
public void logoutSuccess(String s) {
```
GameService.getInstance().outLoginDy(new OnLogoutListener() {
@Override
public void logoutSuccess(String s) {
}
}
@Override
public void logoutError(String s) {
@Override
public void logoutError(String s) {
}
});
}
});
```
- 说明:在需要退出登陆时可调用此方法,注意此方法为退出,并不会调出登陆界面
......@@ -517,19 +737,17 @@ public void logoutError(String msg);
#### 调用方法<a name="sec11.1"></a>
```
public void exitApp(ExitAppListener listener)
public void exitApp()
```
1、退出应用程序弹出提示框。
#### 调用示例<a name="sec11.2"></a>
```
@Override
public void onBackPressed() {
GameSdk.getInstance().exitApp(this, data -> {
});
GameService.getInstance().exitApp();
}
```
- 说明:onBackPressed方法调用
......@@ -555,7 +773,7 @@ public void exitApp(ExitAppListener listener)
3、sdk代码已经经过混淆,请不要再次混淆sdk代码,demo会贴出SDK混淆代码,可复制到自己混淆中(具体请参考demo)
## 服务端接口 调用方直接使用http 调用接口:
### 14 服务端接口 调用方直接使用http 调用接口:<a name="sec14">
### 接口地址
......@@ -574,7 +792,7 @@ public void exitApp(ExitAppListener listener)
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | --------- | ---- | ------ | ------ | ---------------------------------- |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID(建议从user_token中取,#后面的数字即为game_id)|
> | player_id | true | Int | - | 小游戏登录后由 SDK 返回的player_id |
> | sign | true | String | - | 参数签名 |
......
# H5 SDK 对接文档-v1.0
# H5 SDK 对接文档-v1.0
......@@ -55,19 +55,20 @@
&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)
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;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;3.2 [H5 SDK 初始化](#sec3.2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明
......@@ -101,7 +102,7 @@
&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;EVENT 枚举
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例
......@@ -117,7 +118,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例
&nbsp;&nbsp;&nbsp;&nbsp;3.7 [SDK 订单查询](#sec3.7)
&nbsp;&nbsp;&nbsp;&nbsp;3.7 [SDK 订单查询](#sec3.7)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口说明
......@@ -129,38 +130,56 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例
&nbsp;&nbsp;&nbsp;&nbsp;3.8 [SDK 设置存储数据](#sec3.8)
## 1. 接入说明<a name="sec1"></a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口说明
### 1.1 术语表<a name="sec1.1"></a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用方式
> | 名称 | 说明 |
> | ---------- | ------------------------------------------------------------ |
> | CP | 游戏研发商。 |
> | H5_SDK | 由平台方提供给游戏研发商,用于游戏客户端接入平台登录,支付。 |
> | SDK服务 | 由平台方开发,用于完成SDK的登录,支付流程,承接游戏服务端的数据。 |
> | 游戏服务 | 游戏研发商开发,为游戏提供服务。 |
> | 游戏客户端 | 游戏研发方商开发的网页版游戏。 |
> | 支付服务 | 由平台方调用支付服务,包括微信支付,支付宝支付等 |
> | 游戏盒子 | 由平台方开发的游戏总入口,可以实现游戏登陆,支付,切换等;H5游戏以iframe的形式在游戏盒子中运行。 |
> | H5游戏入口 | 由CP方提供,进入H5游戏的入口链接。 |
&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.2 数据字典<a name="sec1.2"></a>
&nbsp;&nbsp;&nbsp;&nbsp;3.9 [SDK 读取存储数据](#sec3.9)
> | 名称 | 说明 |
> | ----------- | ---------------------------------- |
> | player_id | 用户在平台的一个游戏中的唯一标识。 |
> | user_token | 用户在平台登录的会话标识。 |
> | game_id | 游戏在平台的唯一标识。 |
> | game_secret | 平台方提供,游戏签名秘钥。 |
> | cp_order_id | 游戏研发商订单唯一标识 |
> | order_id | 平台方订单唯一标识,与cp_order_id一一对应 |
> | h5_game_url | H5游戏入口,由CP方提供,进入H5游戏的入口链接。 |
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口说明
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用方式
&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>
......@@ -175,7 +194,6 @@ sequenceDiagram
游戏服务-->游戏客户端:验证结果
```
### 1.4 主动登录<a name="sec1.4"></a>
```mermaid
......@@ -209,8 +227,6 @@ sequenceDiagram
游戏客户端-->>玩家:发货
```
## 2. 服务端接入<a name="sec2"></a>
### 2.1 接口规则<a name="sec2.1"></a>
......@@ -244,27 +260,25 @@ sequenceDiagram
> **签名秘钥**
>
> game_secret 为16位字符串,由 SDK 对接时提供,每一个小游戏单独提供一个 game_secret
> game_secret 为 16 位字符串,由 SDK 对接时提供,每一个小游戏单独提供一个 game_secret
> **签名串**
>
> 请求参数(去除sign)通过参数名作升序排序;如果参数值是一个对象,需要将该对象通过参数名升序排序后转换为json字符串;将排好序的参数与game_secret以一下格式进行字符串拼接(game_secret放在最后)
> 请求参数(去除 sign)通过参数名作升序排序;如果参数值是一个对象,需要将该对象通过参数名升序排序后转换为 json 字符串;将排好序的参数与 game_secret 以一下格式进行字符串拼接(game_secret 放在最后)
>
> key1=value1&key2=value2&key3=value3&game_secret=secret
> **签名算法**
>
> 【md5】
> 【md5】
>
> sign = md5(签名串)
> sign = md5(签名串)
> ##### 注意
>
> <u>如果参数值是一个对象,需要将该对象通过参数名升序排序后转换为json字符串;</u>
> <u>如果参数值是一个对象,需要将该对象通过参数名升序排序后转换为 json 字符串;</u>
>
> <u>转换json注意不要对中文进行转义</u>
> <u>转换 json 注意不要对中文进行转义</u>
##### 签名示例
......@@ -289,7 +303,7 @@ sequenceDiagram
##### 接口说明
> 小游戏通过 SDK 获得 用户user_token, 游戏服务端需要在用户登录游戏成功后调用登录验证接口,验证user_token是否为有效登录用户会话,SDK 服务端需要通过该接口判断用户是否登录游戏服务 。
> 小游戏通过 SDK 获得 用户 user_token, 游戏服务端需要在用户登录游戏成功后调用登录验证接口,验证 user_token 是否为有效登录用户会话,SDK 服务端需要通过该接口判断用户是否登录游戏服务 。
>
> 注意:该接口有调用频率限制,建议游戏服务端在完成用户登录后调用该接口;
>
......@@ -303,18 +317,18 @@ sequenceDiagram
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ----------------------------------- |
> | Content-Type | true | application/json | |
> | User-Token | true | | 小游戏登录后由 SDK 返回的user_token |
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ------------------------------------ |
> | 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 | - | 参数签名 |
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | --------- | ---- | ------ | ------ | ------------------------------------------------------------------------ |
> | game_id | true | Int | - | 游戏接入时分配的游戏 ID(建议从 user_token 中取,#后面的数字即为 game_id) |
> | player_id | true | Int | - | 小游戏登录后由 SDK 返回的 player_id |
> | sign | true | String | - | 参数签名 |
##### 返回参数
......@@ -323,7 +337,6 @@ sequenceDiagram
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | false | OBJECT | [] | 返回数据(空) |
>
##### 请求示例
......@@ -369,7 +382,7 @@ sequenceDiagram
//设置post参数
curl_setopt ( $curl, CURLOPT_POSTFIELDS , json_encode($body) );
//设置请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
//执行命令
$data = curl_exec ( $curl );
//关闭URL请求
......@@ -402,21 +415,20 @@ sequenceDiagram
> **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提供) |
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :------------------------------------------------------------ | :--- | :-------- | :----- | :------------------------------------------------------------------------------------------------------- |
> | 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 提供) |
##### 返回参数
......@@ -498,31 +510,28 @@ payNotify();
## 3. H5 SDK 接入<a name="sec3"></a>
### 3.1 配置导入H5 SDK<a name="sec3.1"></a>
### 3.1 配置导入 H5 SDK<a name="sec3.1"></a>
##### 说明
> 游戏客户端通过引入外部js的方式,导入H5 SDK
> 游戏客户端通过引入外部 js 的方式,导入 H5 SDK
##### SDK地址
##### SDK 地址
> https://sdk.zwnet.cn/h5_sdk.js?v=1.0
##### 必要参数
> | 参数 | 说明 |
> | ----------- | -------------------------------- |
> | game_id | 游戏唯一标识,由平台方提供 |
> | h5_game_url | 需要由CP方提供进入游戏的入口链接 |
> | 参数 | 说明 |
> | ----------- | ---------------------------------- |
> | game_id | 游戏唯一标识,由平台方提供 |
> | h5_game_url | 需要由 CP 方提供进入游戏的入口链接 |
##### 导入示例
> ```javascript
> <script src="https://sdk.zwnet.cn/h5_sdk.js?v=1.0"></script>
> <script src='https://sdk.zwnet.cn/h5_sdk.js?v=1.1'></script>
> ```
>
### 3.2 H5 SDK 初始化<a name="sec3.2"></a>
......@@ -530,7 +539,7 @@ payNotify();
##### 说明
> 游戏客户端需要在一开始初始化H5 SDK的对象,并注册角色上报(updateRole)、下单(createOrder)、订单查询(checkOrder)的回调通知;游戏客户端通过回调通知获得角色上报(updateRole)、下单(createOrder)、订单查询(checkOrder)的结果。
> 游戏客户端需要在一开始初始化 H5 SDK 的对象,并注册角色上报(updateRole)、下单(createOrder)、订单查询(checkOrder)的回调通知;游戏客户端通过回调通知获得角色上报(updateRole)、下单(createOrder)、订单查询(checkOrder)的结果。
##### 调用示例
......@@ -542,20 +551,23 @@ payNotify();
> ```javascript
> const sdk = new zwsdk({
> updateRoleCallBack: (e) => {
> //处理角色上报的结果
> },
> createOrderCallBack: (e) => {
> //处理下单的结果
> },
> checkOrderCallBack: (e) => {
> //处理订单查询的结果
> }
> })
> updateRoleCallBack: (e) => {
> //处理角色上报的结果
> },
> createOrderCallBack: (e) => {
> //处理下单的结果
> },
> checkOrderCallBack: (e) => {
> //处理订单查询的结果
> },
> getLocalStorageCallBack: (e) => {
> //获取读取的结果
> },
> setLocalStorageCallBack: (e) => {
> //获取设置的结果
> }
> })
> ```
>
### 3.3 链接登录<a name="sec3.3"></a>
......@@ -565,18 +577,15 @@ payNotify();
##### 链接参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :--------- | :--- | :----- | :----- | :------------------------------------------ |
> | game_id | true | Int | - | 游戏在平台的唯一标识。 |
> | player_id | true | Int | - | 用户在平台的一个游戏中的唯一标识。 |
> | user_token | true | String | - | 用户登录后获取的token,用于验证用户是否登录 |
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :--------- | :--- | :----- | :----- | :------------------------------------------- |
> | 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
> 假设由 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>
......@@ -589,18 +598,14 @@ payNotify();
##### 调用方式
> ```javascript
> sdk.reLogin()
> sdk.reLogin()
> ```
>
##### 示例
> ```javascript
> sdk.reLogin()
> ```
>
### 3.5 SDK 角色上报<a name="sec3.5"></a>
......@@ -618,24 +623,24 @@ sdk.updateRole(config:Object)
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | - | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;profession | false | String | - | 职业 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trans_level | false | Int | 0 | 转生等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sponsor_level | false | Int | 0 | 赞助等级/会员等级 |
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :---------------------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | other | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | - | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_account | false | String | - | cp 账号 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 角色 VIP 等级(赞助等级) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;profession | false | String | - | 职业 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trans_level | false | Int | 0 | 转生等级 |
##### 返回参数
......@@ -644,7 +649,7 @@ sdk.updateRole(config:Object)
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
##### EVENT枚举
##### EVENT 枚举
> | EVENT | 说明 |
> | -------- | -------- |
......@@ -660,24 +665,21 @@ sdk.updateRole(config:Object)
> ```javascript
> sdk.updateRole({
> role: {
> event: 'create',
> server_id: '100001',
> server_name: '主宰服',
> cp_role_id: 'cp_role_id',
> role_name: '哇哦是龙儿',
> role_level: '100',
> role_vip: '7',
> combat_num: '100',
> online_time: '10',
> reiki_num: '10',
> }
> role: {
> event: 'create',
> server_id: '100001',
> server_name: '主宰服',
> cp_role_id: 'cp_role_id',
> role_name: '哇哦是龙儿',
> role_level: '100',
> role_vip: '7',
> combat_num: '100',
> online_time: '10',
> reiki_num: '10'
> }
> })
> //回调通知需要在初始化时注册
> ```
>
### 3.6 SDK 下单<a name="sec3.6"></a>
......@@ -685,7 +687,7 @@ sdk.updateRole(config:Object)
##### 接口说明
> 用户在充值后,游戏客户端需要调用sdk下单方法,需在登录成功后调用此方法;改方法会自动拉起支付。
> 用户在充值后,游戏客户端需要调用 sdk 下单方法,需在登录成功后调用此方法;改方法会自动拉起支付。
##### 调用方式
......@@ -695,63 +697,63 @@ 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 | 本次在线时长 |
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :------------------------------------------------------------ | :---- | :----- | :------- | :--------------------------------------------------------------------------------------------------- |
> | 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 | 用户数据 |
> | 参数 | 类型 | 说明 |
> | :------------------------------------------------------------------------------------------------------- | :----- | :------------------------- |
> | 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'
}
})
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'
}
})
//回调通知需要在初始化时注册
```
......@@ -778,23 +780,99 @@ sdk.checkOrder(config:Object)
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :----------------------------------------------------------- | :----- | :--------------------------------- |
> | 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 | 订单状态:待支付,已支付 |
> | 参数 | 类型 | 说明 |
> | :-------------------------------------------------------------------------------------------------------------- | :----- | :--------------------------------- |
> | 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'
}
})
order: {
order_id: 'g1635306419-9FA13A0B-EDA1-1D94'
}
})
//回调通知需要在初始化时注册
```
### 3.8 SDK 设置存储数据<a name="sec3.8"></a>
---
##### 说明
> 设置 localStorage ,结果在 setLocalStorageCallBack() 返回
##### 调用方式
```javascript
sdk.setLocalStorage(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---- | :--- | :----- | :----- | :---- |
> | key | true | String | - | key |
> | value | true | String | - | value |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :---------- | :----- | :------- |
> | status_code | String | 返回状态 |
> | msg | String | 返回信息 |
##### 示例
```javascript
sdk.setLocalStorage({
key: 'testKey',
value: 'test'
})
//
```
### 3.9 SDK 读取存储数据<a name="sec3.9"></a>
---
##### 说明
> 读取 localStorage ,结果在 getLocalStorageCallBack() 返回
##### 调用方式
```javascript
sdk.getLocalStorage(config:Object)
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :--- | :--- | :----- | :----- | :--- |
> | key | true | String | - | key |
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :---------- | :----- | :------- |
> | status_code | String | 返回状态 |
> | msg | String | 返回信息 |
> | value | String | value |
##### 示例
```javascript
sdk.getLocalStorage({
key: 'testKey'
})
//
```
# 游戏 SDK 对接文档-v1.0.3
# 游戏 SDK 对接文档-v1.0.4
# 游戏 SDK 对接文档-v1.0.3
# 游戏 SDK 对接文档-v1.0.4
### 目录
......@@ -42,7 +42,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求示例
&nbsp;&nbsp;&nbsp;&nbsp;2.3 [支付通知](#sec2.3)
&nbsp;&nbsp;&nbsp;&nbsp;2.3 [支付通知](#sec2.3)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口说明
......@@ -178,6 +178,22 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例
&nbsp;&nbsp;&nbsp;&nbsp;3.12 [SDK 订阅消息](#sec3.12)
&nbsp;&nbsp;&nbsp;&nbsp;&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.13 [SDK 游戏圈](#sec3.13)
&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>
......@@ -341,11 +357,11 @@ sequenceDiagram
> **Body**:
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | --------- | ---- | ------ | ------ | ----------------------------------- |
> | game_id | true | Int | - | 游戏接入时分配的game_id(建议从user_token中取,#后面的数字即为game_id)|
> | player_id | true | Int | - | 小游戏登录后由 SDK 返回的 player_id |
> | sign | true | String | - | 参数签名 |
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | --------- | ---- | ------ | ------ | ------------------------------------------------------------------------- |
> | game_id | true | Int | - | 游戏接入时分配的 game_id(建议从 user_token 中取,#后面的数字即为 game_id) |
> | player_id | true | Int | - | 小游戏登录后由 SDK 返回的 player_id |
> | sign | true | String | - | 参数签名 |
##### 返回参数
......@@ -561,7 +577,7 @@ const zwsdk = new zwsdk({
##### 接口说明
> 获取游戏的配置参数,例如:是否显示支付,可对充值按钮的显示进行后台控制(用于 iOS 的过审,审核期间不能显示充值入口)。
> 获取游戏的配置参数,例如:是否显示支付,可对充值按钮的显示进行后台控制(用于 iOS 的过审,审核期间不能显示充值入口),只需要调用一次!!!!!
##### 调用方式
......@@ -571,14 +587,15 @@ 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:不显示) |
> | 参数 | 类型 | 说明 |
> | :-------------------------------------------------------------------------------------------------------------- | :------ | :---------------------------------------------------------- |
> | 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:不显示) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;game_club | Boolean | 是否开启游戏圈功能(若范围为"true",sdk 会自动初始游戏圈按钮) |
##### 示例
......@@ -622,16 +639,19 @@ zwsdk.login(config:Object)
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :----------------------------------------------------------- | :----- | :------- |
> | 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 |
> | 参数 | 类型 | 说明 |
> | :----------------------------------------------------------------------------------------------------------- | :----- | :----------------------------------------------------------- |
> | 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 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isAduser | String | 是否通过广告带来的用户 1 是 0 否 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h5_url | String | H5 免密登录链接 当为空字符串时不用处理,当有值时需生成转端码 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is_force | int | 是否强制窗 0:非强制 1:强制,配合 h5_url 一起使用 |
##### 示例
......@@ -650,7 +670,7 @@ zwsdk
})
```
### 3.4 SDK 账号更新<a name="sec3.4"></a>
### 3.4 SDK 账号更新[暂时可不用接入]<a name="sec3.4"></a>
---
......@@ -681,17 +701,17 @@ zwsdk.updateUserInfo(config:Object)
##### 返回参数
> | 参数 | 类型 | 说明 |
> | :----------------------------------------------------------- | :----- | :------- |
> | 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 | 手机号 |
> | 参数 | 类型 | 说明 |
> | :----------------------------------------------------------------------------------------------------------- | :----- | :------- |
> | 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 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_token | String | TOKEN |
##### 示例
......@@ -896,27 +916,27 @@ zwsdk.getShareInfo()
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :-------------- | :---- | :------ | :----- | :----------------------------------------------------------- |
> | path | true | String | - | 分享参数,可记录分享者信息;用户通过分享进入游戏会原样携带这些参数 |
> | shareAppMessage | true | Boolean | true | 是否主动拉起分享;默认拉起,false为不拉起 |
> | showLoading | false | Boolean | false | 异步请求中,是否显示微信小程序 loading 提示框 |
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :-------------- | :---- | :------ | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------- |
> | 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) 参数一致 |
> | 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',//参数示例,仅供参考,具体根据需要传参;如果不需要则可以直接传空字符串;
path: '?role_id=1405&server_id=1', //参数示例,仅供参考,具体根据需要传参;如果不需要则可以直接传空字符串;
shareAppMessage: true //是否拉起分享,true为拉起,false为不拉起,只作设置分享
})
```
##### 注意
> path参数不为空时,必须以"?"开始,若不以"?"开始,一律以无效参数处理;其中state,material_id,zyou_inviter为内置参数,避免使用!
> path 参数不为空时,必须以"?"开始,若不以"?"开始,一律以无效参数处理;其中 state,material_id,zyou_inviter 为内置参数,避免使用!
### 3.8 SDK 角色上报<a name="sec3.8"></a>
......@@ -937,21 +957,21 @@ zwsdk.updateRole(config:Object)
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :------ | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------- |
> | role | true | String | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 角色上传事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | other | 事件类型 |
> | &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 | - | CP 角色 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | CP 角色名称|
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | String | - | 角色等级 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | true | String | - | 角色 VIP 等级 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | true | String | - | 角色战力 ID
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reiki_num | false | Int | 0 | 角色灵符值 | |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;online_time | true | String | - | 本次在线时长 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;profession | false | String | - | 职业 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trans_level | false | Int | 0 | 转生等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sponsor_level | false | Int | 0 | 赞助等级/会员等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色 ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | - | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_account | false | String | - | cp 账号 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 角色 VIP 等级(赞助等级) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;profession | false | String | - | 职业 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trans_level | false | Int | 0 | 转生等级 |
> | 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>异步请求成功,若要显示消息提示,需主动调用微信小程序消息提示框框 |
......@@ -991,7 +1011,7 @@ zwsdk
role_vip: '7',
combat_num: '1500000',
online_time: '0',
reiki_num: '10',
reiki_num: '10'
}
})
.then((res) => {
......@@ -1032,9 +1052,10 @@ zwsdk.checkMsg(config:Object)
> | status_code | String | 返回状态 |
> | msg | String | 返回信息 |
##### 返回数据样例
> status_code 为 1 且 data.data.check_result 为 1 则表示检测通过
```javascript
{
"status_code": 1,
......@@ -1068,7 +1089,8 @@ zwsdk.checkMsg(config:Object)
"extra": {}
}
```
##### sdk调用示例
##### sdk 调用示例
```javascript
zwsdk
......@@ -1147,5 +1169,73 @@ zwsdk.customMessage()
##### 示例
```javascript
wx.customMessage()
zwsdk.customMessage()
```
### 3.12 SDK 订阅消息<a name="sec3.12"></a>
##### 接口说明
> **\***按钮调用接口
##### 调用方式
```javascript
zwsdk.subscribeMessage()
```
##### 示例
```javascript
zwsdk.subscribeMessage()
```
### 3.13 SDK 游戏圈<a name="sec3.13"></a>
##### 接口说明
> **\***按钮调用, 需要调用 "[zwsdk.getGameConf()](#sec3.2)"(全局只需要调用一次) 才可以开启游戏圈功能,
> 目的是 设置游戏圈按钮透明度,按钮坐标,盖在素材按钮上
##### 调用方式
```javascript
// 设置游戏圈按钮样式
zwsdk.gameClubSetStyle(style:Object)
// 显示游戏圈按钮
zwsdk.gameClubShow()
// 隐藏游戏圈按钮
zwsdk.gameClubHide()
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :-------------- | :---- | :----- | :----- | :-------------- |
> | left | false | Number | 0 | 左上角横坐标 |
> | top | false | Number | 0 | 左上角纵坐标 |
> | width | false | Number | 0 | 宽度 |
> | height | false | Number | 0 | 高度 |
> | backgroundColor | false | string | - | 背景颜色 |
> | opacity | false | Number | 1 | 按钮透明度(0-1) |
##### 示例
```javascript
// 设置游戏圈按钮样式
zwsdk.gameClubSetStyle({
left: 300,
right: 300,
width: 500,
height: 200,
opacity: 0 //调试阶段 可以设置为1, 配合设置 backgroundColor 预览按钮位置,以达到预期位置
})
// 显示游戏圈按钮
zwsdk.gameClubShow()
// 隐藏游戏圈按钮
zwsdk.gameClubHide()
```
## ZYouSDK V1.0.0文档接入使用
## ZYouSDK V1.0.0文档接入使用
......@@ -284,6 +284,7 @@ app启动时调用注册sdk
@"cp_role_id":@"1314900", //CP角色ID
@"role_name":@"test_name", //角色名称
@"role_level":@"100", //角色等级
@"cp_account":@"7", //cp账号
@"role_vip":@"7", //角色VIP等级
@"combat_num":@"1000", //角色战力
@"online_time":@"10", //本次在线时长
......@@ -305,32 +306,37 @@ app启动时调用注册sdk
```
#### 参数字段说明<a name="sec8.3"></a>
| 名称 | 类型 | 是否必须| 默认值 |说明 |
|:--------| -------------:| -------------------:|-------------:|-------------:|
| role{} | object | 必须 | | 角色信息 |
| event | String | 必须 |other |事件类型,online: 角色登录, create: 创建角色,level_up: 提升等级,offline: 角色退出,other: 其他,delete: 删除角色 |
| server_id | string | 必须 |0 | 区服ID |
| server_name | string | 必须 |"" | 区服名称 |
| cp_role_id |string | 必须 |"" | CP角色ID |
| role_name | string | 必须 |"" | 角色名称 |
| role_level | number | 必须 | 0| 角色等级 |
| role_vip | number | 必须 |0| 角色VIP等级 |
| combat_num | number | 必须 |0 | 角色战力 |
| reiki_num | String | 必须 | "0"| 角色灵符值|
| online_time | number | 必须 | 0| 本次在线时长 |
| attack | number | 必须 |0| 攻击力 |
| profession | string | 必须 |""| 职业 |
| game_name | string | 必须 |"" |帮会(行会)名称 |
| trans_level | string | 必须 | 0| 转生等级 |
| sponsor_level | string | 必须 |0 | 赞助等级/会员等级 |
| reiki_num | number | 必须 |0 | 灵符值 默认0 |
| power | string | 必须 | "" | 国家 |
| main_city_level | number | 必须 |0 | 官邸等级 |
| chapter_index | number | 必须 |0 | 章节等级 |
| 参数 | 必选 | 类型 | 默认值 | 说明 |
| :----------------------------------------------------------- | :---- | :----- | :----- | :---------------- |
| event | true | String | other | 事件类型 |
| server_id | true | String | - | 区服ID |
| server_name | true | String | - | 区服名称 |
| cp_role_id | true | String | - | 游戏方角色ID |
| role_name | true | String | - | 游戏角色名称 |
| role_level | true | Int | - | 角色等级 |
| cp_account | false | String | - | cp账号 |
| role_vip | false | Int | 0 | 角色VIP等级(赞助等级) |
| combat_num | false | Int | 0 | 角色战力 |
| reiki_num | false | Int | 0 | 角色灵符值 |
| online_time | false | Int | 0 | 本次在线时长 |
| attack | false | Int | 0 | 攻击力 |
| profession | false | String | - | 职业 |
| gang_name | false | String | - | 帮会(行会)名称 |
| trans_level | false | Int | 0 | 转生等级 |
事件类型event
| EVENT | 说明 |
| -------- | -------- |
| create | 创建角色 |
| online | 角色上线 |
| offline | 角色下线 |
| level_up | 角色升级 |
| delete | 删除角色 |
| recharge | 角色充值 |
| other | 其他 |
### 9、退出登录<a name="sec9"></a>
......@@ -341,7 +347,7 @@ app启动时调用注册sdk
```
#### 调用示例<a name="sec9.1"></a>
```
[[ZYouManager shareInstance]zy_loginoutSuccessBlock:^(id _Nonnull responseObject) {
......@@ -371,7 +377,7 @@ app启动时调用注册sdk
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | --------- | ---- | ------ | ------ | ---------------------------------- |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID(建议从user_token中取,#后面的数字即为game_id)|
> | player_id | true | Int | - | 小游戏登录后由 SDK 返回的player_id |
> | sign | true | String | - | 参数签名 |
......
## ZYouSDK V1.0.0文档接入使用
## ZYouSDK V1.0.0文档接入使用
......@@ -83,6 +83,7 @@
&nbsp;&nbsp; 3.9、Xcode添加白名单
&nbsp;&nbsp; 在 Info.plist 中添加 LSApplicationQueriesSchemes 类型 Array
&nbsp;&nbsp; 在LSApplicationQueriesSchemes下添加以下白名单
```
weixin
wechat
......@@ -106,7 +107,7 @@ app启动时调用注册sdk
```
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[[ZYouManager shareInstance]zy_registerGame];
[[ZYouManager shareInstance]zy_registerGameWithApplication:application options:launchOptions];
return YES;
}
......@@ -294,6 +295,7 @@ app启动时调用注册sdk
@"role_name":@"test_name", //角色名称
@"role_level":@"100", //角色等级
@"role_vip":@"7", //角色VIP等级
@"cp_account":@"7", //cp账号
@"combat_num":@"1000", //角色战力
@"online_time":@"10", //本次在线时长
@"attack":@"2000", //攻击力
......@@ -317,29 +319,37 @@ app启动时调用注册sdk
#### 参数字段说明<a name="sec8.3"></a>
| 名称 | 类型 | 是否必须| 默认值 |说明 |
|:--------| -------------:| -------------------:|-------------:|-------------:|
| role{} | object | 必须 | | 角色信息 |
| event | String | 必须 |other |事件类型,online: 角色登录, create: 创建角色,level_up: 提升等级,offline: 角色退出,other: 其他,delete: 删除角色 |
| server_id | string | 必须 |0 | 区服ID |
| server_name | string | 必须 |"" | 区服名称 |
| cp_role_id |string | 必须 |"" | CP角色ID |
| role_name | string | 必须 |"" | 角色名称 |
| role_level | number | 必须 | 0| 角色等级 |
| role_vip | number | 必须 |0| 角色VIP等级 |
| combat_num | number | 必须 |0 | 角色战力 |
| reiki_num | String | 必须 | "0"| 角色灵符值|
| online_time | number | 必须 | 0| 本次在线时长 |
| attack | number | 必须 |0| 攻击力 |
| profession | string | 必须 |""| 职业 |
| game_name | string | 必须 |"" |帮会(行会)名称 |
| trans_level | string | 必须 | 0| 转生等级 |
| sponsor_level | string | 必须 |0 | 赞助等级/会员等级 |
| reiki_num | number | 必须 |0 | 灵符值 默认0 |
| power | string | 必须 | "" | 国家 |
| main_city_level | number | 必须 |0 | 官邸等级 |
| chapter_index | number | 必须 |0 | 章节等级 |
| 参数 | 必选 | 类型 | 默认值 | 说明 |
| :----------------------------------------------------------- | :---- | :----- | :----- | :---------------- |
| role | true | Object | - | 角色信息 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | other | 事件类型 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | - | 角色等级 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_account | false | String | - | cp账号 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 角色VIP等级 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | String | "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;profession | false | String | - | 职业 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trans_level | false | Int | 0 | 转生等级 |
| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sponsor_level | false | Int | 0 | 赞助等级/会员等级 |
事件类型event
| EVENT | 说明 |
| -------- | -------- |
| create | 创建角色 |
| online | 角色上线 |
| offline | 角色下线 |
| level_up | 角色升级 |
| delete | 删除角色 |
| recharge | 角色充值 |
| other | 其他 |
### 9、退出登录<a name="sec9"></a>
......@@ -350,7 +360,7 @@ app启动时调用注册sdk
```
#### 调用示例<a name="sec9.1"></a>
```
[[ZYouManager shareInstance]zy_loginoutSuccessBlock:^(id _Nonnull responseObject) {
......@@ -380,7 +390,7 @@ app启动时调用注册sdk
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | --------- | ---- | ------ | ------ | ---------------------------------- |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID(建议从user_token中取,#后面的数字即为game_id)|
> | player_id | true | Int | - | 小游戏登录后由 SDK 返回的player_id |
> | sign | true | String | - | 参数签名 |
......
## 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)
&nbsp;&nbsp;&nbsp;&nbsp;14 [SDK对接说明](#sec14)
#### 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.7.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.7.5")
```
#### 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对接说明](#sec14)
#### 参数说明<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"); //灵符值
roleInfo.setMain_city_level("大司马");//官邸等级
roleInfo.setPower("阔克萨斯");//国家
roleInfo.setChapter_index("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;role_level | true | Int | 0 | 角色等级 |
> | &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;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 | - | 帮会(联盟)名称
###### 角色上线 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;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | true | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级(online,offline务必上传) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级(online,offline务必上传) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &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;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;role_level | true | Int | 0 | 角色等级 |
> | &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;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;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;role_level | true | Int | 0 | 角色等级 |
> | &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 | 最新官邸等级 |
###### 章节完成事件 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;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | 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)
### 14 服务端接口 调用方直接使用http 调用接口:
### 接口地址
> 【POST】 https://zyou.wozhangwan.com/api/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
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | true | Int | 0 | 最新角色战力 |
> | &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;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 | - | 帮会(行会)名称 |
###### 角色上线 online
###### 角色下线 offline
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | true | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级(online,offline务必上传) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级(online,offline务必上传) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &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;gang_name | false | String | - | 帮会(联盟)名称 |
###### 角色升级 level_up
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | 0 | 角色等级 |
> | &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;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;gang_name | false | String | - | 帮会(行会)名称 |
###### 官邸升级事件 main_city_upgrade
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | 0 | 角色等级 |
> | &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 | 最新官邸等级 |
###### 章节完成事件 chapter_complete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
###### 删除角色 delete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | 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 | - | 游戏角色名称 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | 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
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | true | Int | 0 | 最新角色战力 |
> | &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;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 | - | 帮会(行会)名称 |
> | 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) 参数一致 |
###### 角色上线 online
###### 角色下线 offline
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | true | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级(online,offline务必上传) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级(online,offline务必上传) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &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;gang_name | false | 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) 参数一致 |
###### 角色升级 level_up
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | 0 | 角色等级 |
> | &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;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;gang_name | false | 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) 参数一致 |
###### 官邸升级事件 main_city_upgrade
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | 0 | 角色等级 |
> | &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 | 最新官邸等级 |
> | 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) 参数一致 |
###### 章节完成事件 chapter_complete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级 |
> | 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) 参数一致 |
###### 删除角色 delete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | 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 | - | 游戏角色名称 |
> | 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 | 返回信息 |
##### EVENT 枚举
> | EVENT | 说明 |
> | -------- | -------- |
> | create | 创建角色 |
> | online | 角色上线 |
> | offline | 角色下线 |
> | level_up | 角色升级 |
> | delete | 删除角色 |
> | main_city_upgrade | 官邸升级事件 |
> | chapter_complete | 章节完成事件 |
##### 示例
```javascript
zwsdk
.updateRole({
role: {
event: 'create',
server_id: '3',
server_name: '三区',
cp_role_id: '3_1000005',
power: '魏国',
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()
```
## ZYouSDK V1.0.0文档接入使用
## ZYouSDK V1.0.0文档接入使用
[目录](#sec1)
&nbsp;&nbsp;&nbsp;&nbsp;1 [对接说明](#sec1)
&nbsp;&nbsp;&nbsp;&nbsp;2 [参数说明](#sec2)
&nbsp;&nbsp;&nbsp;&nbsp;3 [对接SDK](#sec3)
&nbsp;&nbsp;&nbsp;&nbsp;4 [初始化SDK](#se4)
&nbsp;&nbsp;&nbsp;&nbsp;5 [登录](#sec5)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[接口参数](#sec5.1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[登录调用示例](#sec5.2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[悬浮球显示](#sec5.3)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[悬浮球隐藏](#sec5.4)
&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.2)
&nbsp;&nbsp;&nbsp;&nbsp;7 [支付回调通知](#sec7)
&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;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[调用示例](#sec8.2)
&nbsp;&nbsp;&nbsp;&nbsp;9 [退出登录](#sec9)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[调用示例](#sec9.1)
#### 1、对接说明 <a name="sec1"></a>
&nbsp;&nbsp; 1.1、此sdk只支持iOS9.0以上版本
&nbsp;&nbsp; 1.2、此sdk支持横竖屏
&nbsp;&nbsp; 1.3、所有SDK功能在ZYouManager类中,可通过初始化获取改类对象,后续所有更新功能都调用这个类中方法完成
### 2、参数说明<a name="sec2"></a>
> **参数说明**:
| 参数名 | 说明 |
|:--------| -------------:|
| game_id | 游戏唯一标识,由平台方提供 |
|game_secret|服务端对接时会用到,由平台方提供|
### 3、对接SDK<a name="sec3"></a>
&nbsp;&nbsp; 2.1、从平台处获取对接SDK
&nbsp;&nbsp; 2.2、手动集成
&nbsp;&nbsp;&nbsp;&nbsp; 将ZYouSDKFramework文件夹直接添加进工程,ZYouSDKFramework文件夹中包含ZYouSDK,ZYSDKConfig,ZYouBundle,alipay四个文件
![ios1.png](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/ios1.png)
&nbsp;&nbsp; 2.3 ZYSDKConfig配置文件中 game_id为平台方提供, zyscheme 为zy+game_id+sdk.zwnet.cn 的拼写 其他配置参数请勿修改
&nbsp;&nbsp; 2.4 点击项目名称,点击 Info 选项卡,在 URL Types 选项中,点击 +,在 URL Schemes 中输入 ZYSDKConfig文件中zyscheme的值
&nbsp;&nbsp; 2.5 在 Build Phases 选项卡的 Link Binary With Libraries 中,增加以下依赖:
![ios5.png](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/ios5.png)
&nbsp;&nbsp; 2.6、Xcode开启https请求
&nbsp;&nbsp; 在 Info.plist 中添加 NSAppTransportSecurity 类型 Dictionary
&nbsp;&nbsp; 在 NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads 类型 Boolean ,值设为 YES
&nbsp;&nbsp; 2.7、Xcode添加白名单
&nbsp;&nbsp; 在 Info.plist 中添加 LSApplicationQueriesSchemes 类型 Array
&nbsp;&nbsp; 在LSApplicationQueriesSchemes下添加以下白名单
```
weixin
wechat
mqq
mqqapi
alipay
```
![example2.png](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/example2.png)
&nbsp;&nbsp; 2.8、在Build Settings - Other Linker Flags里面加入-ObjC参数
![example3.png](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/example3.png)
### 4、初始化SDK<a name="sec4"></a>
app启动时调用注册sdk
```
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[[ZYouManager shareInstance]zy_registerGame];
return YES;
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
return [[ZYouManager shareInstance]zy_application:app openURL:url];
}
```
### 5、登录<a name="sec5"></a>
登录方法<a name="sec6.1"></a>
```
- (void)zy_loginViewSuccessBlock:(void(^)(id responseObject))successBlock failureBlock:(void(^)(NSString *error))failureBlock;
```
- 说明:调出登录页面登录成功返回token
- 需游戏服务端调用登录验证之后,才能进入游戏参照(SDK对接说明 2.2)
> **登录成功返回参数**:
| 参数 | 类型 | 说明 |
| :-------- | -------------: | -------------: |
| 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 |
> **登录失败返回参数**:
| 参数 | 类型 | 说明 |
| :-------- | -------------: | -------------: |
| msg| String| 描述信息 |
### 参数说明<a name="sec5.1"></a>
| 参数 | 说明 |
|:----|-----:|
|successBlock|成功回调|
|failureBlock|失败回调|
#### 登录调用示例<a name="sec5.2"></a>
```
[[ZYouManager shareInstance]zy_loginViewSuccessBlock:^(id _Nonnull responseObject) {
//显示悬浮球
[[ZYouManager shareInstance]zy_showSuspensionBallCancleBlock:^{
//退出个人中心页面
}];
} failureBlock:^(NSString * _Nonnull error) {
}];
```
#### 悬浮球显示<a name="sec5.3"></a>
```
//显示悬浮球
[[ZYouManager shareInstance]zy_showSuspensionBallCancleBlock:^{
//退出个人中心页面
}];
```
#### 悬浮球隐藏<a name="sec5.4"></a>
```
[[ZYouManager shareInstance]zy_hideSuspensionBall];
```
### 6、调起支付页面<a name="sec6"></a>
调起支付页面方法<a name="sec7.1"></a>
```
- (void)zy_payWithOrder:(NSDictionary *)order role:(NSDictionary *)role roleId:(NSString *)roleId successBlock:(void(^)(id responseObject))successBlock failureBlock:(void(^)(NSString *error))failureBlock;
```
### 参数说明<a name="sec6.1"></a>
| 参数 | 说明 |
|:----|-----:|
|ZYPayInfoModel|支付参数|
|successBlock|成功回调|
|failureBlock|失败回调|
#### 调用示例<a name="sec6.2"></a>
```
NSDictionary *order = @{
@"cp_order_id":@"1531691516911368192_16006_9690822_425", //CP订单ID
@"amount":@"1", //商品总价(单位:分)
@"product_price":@"1", //商品价格(单价,单位:分)
@"product_id":@"16006", //商品ID
@"product_cnt":@"1", //商品数量
@"product_name":@"周三直购", //商品名称
@"product_desc":@"0.1元惊喜包", //商品描述
@"ext":@"1531691514967582720", //订单额外信息用(json)
};
NSDictionary *role = @{
@"event":@"create", // 事件类型,online: 角色登录, create: 创建角色,level_up: 提升等级,offline: 角色退出,other: 其他,delete: 删除角色,main_city_upgrade:官邸升级事件,chapter_complete:章节完成事件
@"server_id":@"100001", //区服ID
@"server_name":@"主宰服", //区服名称
@"cp_role_id":@"1314900", //CP角色ID
@"role_name":@"test_name", //角色名称
@"role_level":@"100", //角色等级
@"role_vip":@"7" //角色VIP等级
};
//roleId 角色ID
[[ZYouManager shareInstance] zy_payWithOrder:order role:role roleId:@"1314900" successBlock:^(id _Nonnull responseObject) {
} failureBlock:^(NSString * _Nonnull error) {
}];
```
#### 下单支付字段说明<a name="sec6.3"></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_level | string | 必须 |0| 角色等级 |
| role_vip | string | 必须 | 0|角色vip等级 |
| role_id | string | 必须 |0| 角色ID |
### 7、支付回调通知<a name="sec7"></a>
1.1
1.1、支付回调通知请参考对接文档H5 SDK 对接文档-v1.0、服务端接入
### 8、角色上报<a name="sec8"></a>
角色上报方法
```
//角色上报
- (void)zy_reportRoleInfoWithRole:(NSDictionary*)role successBlock:(void(^)(id responseObject))successBlock failureBlock:(void(^)(NSString *error))failureBlock;
```
### 参数说明<a name="sec8.1"></a>
| 参数 | 说明 |
|:----|-----:|
|ZYReportInfoModel|上报信息|
|successBlock|成功回调|
|failureBlock|失败回调|
#### 调用示例<a name="sec8.2"></a>
```
NSDictionary *dic = @{
@"event":@"create", // 事件类型,online: 角色登录, create: 创建角色,level_up: 提升等级,offline: 角色退出,other: 其他,delete: 删除角色,main_city_upgrade:官邸升级事件,chapter_complete:章节完成事件
@"server_id":@"100001", //区服ID
@"server_name":@"主宰服", //区服名称
@"cp_role_id":@"1314900", //CP角色ID
@"role_name":@"test_name", //角色名称
@"role_level":@"100", //角色等级
@"role_vip":@"7", //角色VIP等级
@"combat_num":@"1000", //角色战力
@"online_time":@"10", //本次在线时长
@"attack":@"2000", //攻击力
@"profession":@"", //职业
@"gang_name":@"", //帮会(行会)名称
@"trans_level":@"", //转生等级
@"sponsor_level":@"", //赞助等级/会员等级
@"reiki_num":@"", //灵符值 默认0
@"power":@"", //国家
@"main_city_level":@"", //官邸等级
@"chapter_index":@"" // 章节等级
};
[[ZYouManager shareInstance]zy_reportRoleInfoWithRole:dic successBlock:^(id _Nonnull responseObject) {
NSLog(@"上报成功");
} failureBlock:^(NSString * _Nonnull error) {
}];
```
#### 参数字段说明<a name="sec8.3"></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;role_level | true | Int | 0 | 角色等级 |
> | &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;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 | - | 帮会(联盟)名称 |
###### 角色上线 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;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | true | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级(online,offline务必上传) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级(online,offline务必上传) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &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;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;role_level | true | Int | 0 | 角色等级 |
> | &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;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;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;role_level | true | Int | 0 | 角色等级 |
> | &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 | 最新官邸等级 |
###### 章节完成事件 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;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | 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 | - | 游戏角色名称 |
### 9、退出登录<a name="sec9"></a>
```
//退出登录
- (void)zy_loginoutSuccessBlock:(void(^)(id responseObject))successBlock failureBlock:(void(^)(NSString *error))failureBlock;
```
#### 调用示例<a name="sec9.1"></a>
```
[[ZYouManager shareInstance]zy_loginoutSuccessBlock:^(id _Nonnull responseObject) {
} failureBlock:^(NSString * _Nonnull error) {
}];
```
- 说明:在需要退出登陆时可调用此方法,注意此方法为退出,并不会调出登陆界面
## 服务端接口 调用方直接使用http 调用接口:
### 接口地址
> 【POST】 /ios_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 = '/ios_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);
}
```
## ZYouSDK V1.0.0文档接入使用
## ZYouSDK V1.0.0文档接入使用
[目录](#sec1)
&nbsp;&nbsp;&nbsp;&nbsp;1 [对接说明](#sec1)
&nbsp;&nbsp;&nbsp;&nbsp;2 [参数说明](#sec2)
&nbsp;&nbsp;&nbsp;&nbsp;3 [对接SDK](#sec3)
&nbsp;&nbsp;&nbsp;&nbsp;4 [初始化SDK](#se4)
&nbsp;&nbsp;&nbsp;&nbsp;5 [登录](#sec5)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[接口参数](#sec5.1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[登录调用示例](#sec5.2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[悬浮球显示](#sec5.3)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[悬浮球隐藏](#sec5.4)
&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.2)
&nbsp;&nbsp;&nbsp;&nbsp;7 [支付回调通知](#sec7)
&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;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[调用示例](#sec8.2)
&nbsp;&nbsp;&nbsp;&nbsp;9 [退出登录](#sec9)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[调用示例](#sec9.1)
#### 1、对接说明 <a name="sec1"></a>
&nbsp;&nbsp; 1.1、此sdk只支持iOS9.0以上版本
&nbsp;&nbsp; 1.2、此sdk支持横竖屏
&nbsp;&nbsp; 1.3、所有SDK功能在ZYouManager类中,可通过初始化获取改类对象,后续所有更新功能都调用这个类中方法完成
&nbsp;&nbsp; 1.4、此sdk适用于需上架到App Store的应用
### 2、参数说明<a name="sec2"></a>
> **参数说明**:
| 参数名 | 说明 |
|:--------| -------------:|
| game_id | 游戏唯一标识,由平台方提供 |
|game_secret|服务端对接时会用到,由平台方提供|
> **内购说明**:
支持内购cp方需要提供内购的商品列表
cp测试内购需使用平台方提供的Bundle Identifier
### 3、对接SDK<a name="sec3"></a>
&nbsp;&nbsp; 3.1、从平台处获取对接SDK
&nbsp;&nbsp; 3.2、手动集成
&nbsp;&nbsp;&nbsp;&nbsp; 将ZYouSDKFramework-iOS文件夹直接添加进工程,ZYouSDKFramework-iOS 文件夹中包含ZYouSDK,ZYSDKConfig,ZYouBundle三个文件
&nbsp;&nbsp; 3.3 ZYSDKConfig配置文件中 game_id为平台方提供, zyscheme 为zy+game_id+sdk.zwnet.cn 的拼写 其他配置参数请勿修改
&nbsp;&nbsp; 3.4 点击项目名称,点击 Info 选项卡,在 URL Types 选项中,点击 +,在 URL Schemes 中输入 ZYSDKConfig文件中zyscheme的值
&nbsp;&nbsp; 3.5、添加IAP
&nbsp;&nbsp; 在TARGETS - Signing & Capabilities 下添加In-App Purchase
&nbsp;&nbsp; 3.6、Xcode开启https请求
&nbsp;&nbsp; 在 Info.plist 中添加 NSAppTransportSecurity 类型 Dictionary
&nbsp;&nbsp; 在 NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads 类型 Boolean ,值设为 YES
&nbsp;&nbsp; 3.7、Xcode添加白名单
&nbsp;&nbsp; 在 Info.plist 中添加 LSApplicationQueriesSchemes 类型 Array
&nbsp;&nbsp; 在LSApplicationQueriesSchemes下添加以下白名单
```
weixin
wechat
mqq
mqqapi
alipay
```
![example2.png](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/example2.png)
&nbsp;&nbsp; 3.8、在Build Settings - Other Linker Flags里面加入-ObjC参数
![example3.png](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/example3.png)
### 4、初始化SDK<a name="sec4"></a>
app启动时调用注册sdk
```
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[[ZYouManager shareInstance]zy_registerGame];
return YES;
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
return [[ZYouManager shareInstance]zy_application:app openURL:url];
}
```
### 5、登录<a name="sec5"></a>
登录方法<a name="sec6.1"></a>
```
- (void)zy_loginViewSuccessBlock:(void(^)(id responseObject))successBlock failureBlock:(void(^)(NSString *error))failureBlock;
```
- 说明:调出登录页面登录成功返回token
- 需游戏服务端调用登录验证之后,才能进入游戏参照(SDK对接说明 2.2)
> **登录成功返回参数**:
| 参数 | 类型 | 说明 |
| :-------- | -------------: | -------------: |
| 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 |
> **登录失败返回参数**:
| 参数 | 类型 | 说明 |
| :-------- | -------------: | -------------: |
| msg| String| 描述信息 |
### 参数说明<a name="sec5.1"></a>
| 参数 | 说明 |
|:----|-----:|
|successBlock|成功回调|
|failureBlock|失败回调|
#### 登录调用示例<a name="sec5.2"></a>
```
[[ZYouManager shareInstance]zy_loginViewSuccessBlock:^(id _Nonnull responseObject) {
//显示悬浮球
[[ZYouManager shareInstance]zy_showSuspensionBallCancleBlock:^{
//退出个人中心页面
}];
} failureBlock:^(NSString * _Nonnull error) {
}];
```
#### 悬浮球显示<a name="sec5.3"></a>
```
//显示悬浮球
[[ZYouManager shareInstance]zy_showSuspensionBallCancleBlock:^{
//退出个人中心页面
}];
```
#### 悬浮球隐藏<a name="sec5.4"></a>
```
[[ZYouManager shareInstance]zy_hideSuspensionBall];
```
### 6、调起支付页面<a name="sec6"></a>
调起支付页面方法<a name="sec7.1"></a>
```
- (void)zy_payWithOrder:(NSDictionary *)order role:(NSDictionary *)role roleId:(NSString *)roleId successBlock:(void(^)(id responseObject))successBlock failureBlock:(void(^)(NSString *error))failureBlock;
```
### 参数说明<a name="sec6.1"></a>
| 参数 | 说明 |
|:----|-----:|
|ZYPayInfoModel|支付参数|
|successBlock|成功回调|
|failureBlock|失败回调|
#### 调用示例<a name="sec6.2"></a>
```
NSDictionary *order = @{
@"cp_order_id":@"1531691516911368192_16006_9690822_425", //CP订单ID
@"amount":@"1", //商品总价(单位:分)
@"product_price":@"1", //商品价格(单价,单位:分)
@"product_id":@"16006", //商品ID
@"product_cnt":@"1", //商品数量
@"product_name":@"周三直购", //商品名称
@"product_desc":@"0.1元惊喜包", //商品描述
@"ext":@"1531691514967582720", //订单额外信息用(json)
};
NSDictionary *role = @{
@"event":@"create", // 事件类型,online: 角色登录, create: 创建角色,level_up: 提升等级,offline: 角色退出,other: 其他,delete: 删除角色,main_city_upgrade:官邸升级事件,chapter_complete:章节完成事件
@"server_id":@"100001", //区服ID
@"server_name":@"主宰服", //区服名称
@"cp_role_id":@"1314900", //CP角色ID
@"role_name":@"test_name", //角色名称
@"role_level":@"100", //角色等级
@"role_vip":@"7" //角色VIP等级
};
//roleId 角色ID
[[ZYouManager shareInstance] zy_payWithOrder:order role:role roleId:@"1314900" successBlock:^(id _Nonnull responseObject) {
} failureBlock:^(NSString * _Nonnull error) {
}];
```
#### 下单支付字段说明<a name="sec6.3"></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_level | string | 必须 |0| 角色等级 |
| role_vip | string | 必须 | 0|角色vip等级 |
| role_id | string | 必须 |0| 角色ID |
### 7、支付回调通知<a name="sec7"></a>
1.1
1.1、支付回调通知请参考对接文档H5 SDK 对接文档-v1.0、服务端接入
### 8、角色上报<a name="sec8"></a>
角色上报方法
```
//角色上报
- (void)zy_reportRoleInfoWithRole:(NSDictionary*)role successBlock:(void(^)(id responseObject))successBlock failureBlock:(void(^)(NSString *error))failureBlock;
```
### 参数说明<a name="sec8.1"></a>
| 参数 | 说明 |
|:----|-----:|
|ZYReportInfoModel|上报信息|
|successBlock|成功回调|
|failureBlock|失败回调|
#### 调用示例<a name="sec8.2"></a>
```
NSDictionary *dic = @{
@"event":@"create", // 事件类型,online: 角色登录, create: 创建角色,level_up: 提升等级,offline: 角色退出,other: 其他,delete: 删除角色,main_city_upgrade:官邸升级事件,chapter_complete:章节完成事件
@"server_id":@"100001", //区服ID
@"server_name":@"主宰服", //区服名称
@"cp_role_id":@"1314900", //CP角色ID
@"role_name":@"test_name", //角色名称
@"role_level":@"100", //角色等级
@"role_vip":@"7", //角色VIP等级
@"combat_num":@"1000", //角色战力
@"online_time":@"10", //本次在线时长
@"attack":@"2000", //攻击力
@"profession":@"", //职业
@"gang_name":@"", //帮会(行会)名称
@"trans_level":@"", //转生等级
@"sponsor_level":@"", //赞助等级/会员等级
@"reiki_num":@"", //灵符值 默认0
@"power":@"", //国家
@"main_city_level":@"", //官邸等级
@"chapter_index":@"" // 章节等级
};
[[ZYouManager shareInstance]zy_reportRoleInfoWithRole:dic successBlock:^(id _Nonnull responseObject) {
NSLog(@"上报成功");
} failureBlock:^(NSString * _Nonnull error) {
}];
```
###### 创建角色 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;role_level | true | Int | 0 | 角色等级 |
> | &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;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 | - | 帮会(联盟)名称 |
###### 角色上线 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;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | true | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级(online,offline务必上传) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级(online,offline务必上传) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &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;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;role_level | true | Int | 0 | 角色等级 |
> | &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;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;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;role_level | true | Int | 0 | 角色等级 |
> | &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 | 最新官邸等级 |
###### 章节完成事件 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;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | 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 | - | 游戏角色名称 |
### 9、退出登录<a name="sec9"></a>
```
//退出登录
- (void)zy_loginoutSuccessBlock:(void(^)(id responseObject))successBlock failureBlock:(void(^)(NSString *error))failureBlock;
```
#### 调用示例<a name="sec9.1"></a>
```
[[ZYouManager shareInstance]zy_loginoutSuccessBlock:^(id _Nonnull responseObject) {
} failureBlock:^(NSString * _Nonnull error) {
}];
```
- 说明:在需要退出登陆时可调用此方法,注意此方法为退出,并不会调出登陆界面
## 服务端接口 调用方直接使用http 调用接口:
### 接口地址
> 【POST】 /ios_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 = '/ios_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);
}
```
'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
##### 请求参数
###### 角色下线 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;role_level | true | Int | 0 | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;power | true | String | "" | 国家 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | true | Int | 0 | 最新角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_city_level | true | Int | 0 | 最新官邸等级(online,offline务必上传) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chapter_index | true | Int | 0 | 最新章节等级(online,offline务必上传) |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 最新角色VIP等级 |
> | &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;gang_name | false | String | - | 帮会(联盟)名称 |
###### 删除角色 delete
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | 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 | - | 游戏角色名称 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | | | | |
##### EVENT枚举
> | EVENT | 说明 |
> | -------- | -------- |
> | offline | 角色下线 |
> | delete | 删除角色 |
##### 请求示例
```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);
}
```
'use strict';var __awaiter=this&&this['__awaiter']||function(_0x472ec7,_0x5b2454,_0x276db8,_0x2bafe4){function _0x21ff89(_0x39c75a){return _0x39c75a instanceof _0x276db8?_0x39c75a:new _0x276db8(function(_0x2fdbe6){_0x2fdbe6(_0x39c75a);});}return new(_0x276db8||(_0x276db8=Promise))(function(_0x5f1f25,_0x97cf77){function _0x1fd72d(_0x165fed){try{_0x3261ad(_0x2bafe4['next'](_0x165fed));}catch(_0x5dba1f){_0x97cf77(_0x5dba1f);}}function _0x42806a(_0x5d27db){try{_0x3261ad(_0x2bafe4['throw'](_0x5d27db));}catch(_0xea8bc2){_0x97cf77(_0xea8bc2);}}function _0x3261ad(_0x240f36){_0x240f36['done']?_0x5f1f25(_0x240f36['value']):_0x21ff89(_0x240f36['value'])['then'](_0x1fd72d,_0x42806a);}_0x3261ad((_0x2bafe4=_0x2bafe4['apply'](_0x472ec7,_0x5b2454||[]))['next']());});};var __generator=this&&this['__generator']||function(_0x40e447,_0x514d91){var _0x388720={'label':0x0,'sent':function(){if(_0x1499b3[0xb1ec4^0xb1ec4]&(0xf2ad3^0xf2ad2))throw _0x1499b3[0x55bec^0x55bed];return _0x1499b3[0x337ba^0x337bb];},'trys':[],'ops':[]},_0x3c2c5f,_0x290450,_0x1499b3,_0x6e1b28;return _0x6e1b28={'next':_0x55c02f(0x47a36^0x47a36),'throw':_0x55c02f(0x81bc3^0x81bc2),'return':_0x55c02f(0xb673a^0xb6738)},typeof Symbol==='function'&&(_0x6e1b28[Symbol['iterator']]=function(){return this;}),_0x6e1b28;function _0x55c02f(_0x12e9d3){return function(_0x5f408b){return _0x4ceb7f([_0x12e9d3,_0x5f408b]);};}function _0x4ceb7f(_0xa33ea5){if(_0x3c2c5f)throw new TypeError('Generator\x20is\x20already\x20executing.');while(_0x388720)try{if(_0x3c2c5f=0x4ab7b^0x4ab7a,_0x290450&&(_0x1499b3=_0xa33ea5[0xa08d1^0xa08d1]&(0x82242^0x82240)?_0x290450['return']:_0xa33ea5[0x0]?_0x290450['throw']||((_0x1499b3=_0x290450['return'])&&_0x1499b3['call'](_0x290450),0x3cdff^0x3cdff):_0x290450['next'])&&!(_0x1499b3=_0x1499b3['call'](_0x290450,_0xa33ea5[0x252ce^0x252cf]))['done'])return _0x1499b3;if(_0x290450=0x8c4c3^0x8c4c3,_0x1499b3)_0xa33ea5=[_0xa33ea5[0x0]&0x2,_0x1499b3['value']];switch(_0xa33ea5[0x0]){case 0xe3565^0xe3565:case 0x1:_0x1499b3=_0xa33ea5;break;case 0x4:_0x388720['label']++;return{'value':_0xa33ea5[0x1],'done':![]};case 0x5:_0x388720['label']++;_0x290450=_0xa33ea5[0x1];_0xa33ea5=[0x0];continue;case 0x4b0a0^0x4b0a7:_0xa33ea5=_0x388720['ops']['pop']();_0x388720['trys']['pop']();continue;default:if(!(_0x1499b3=_0x388720['trys'],_0x1499b3=_0x1499b3['length']>(0xd7018^0xd7018)&&_0x1499b3[_0x1499b3['length']-(0x8e236^0x8e237)])&&(_0xa33ea5[0x0]===0x6||_0xa33ea5[0x0]===0x2)){_0x388720=0xcafd2^0xcafd2;continue;}if(_0xa33ea5[0xa4466^0xa4466]===(0x9e2c8^0x9e2cb)&&(!_0x1499b3||_0xa33ea5[0x1]>_0x1499b3[0x0]&&_0xa33ea5[0x4e8c8^0x4e8c9]<_0x1499b3[0x3])){_0x388720['label']=_0xa33ea5[0x1];break;}if(_0xa33ea5[0xdbb4b^0xdbb4b]===(0xa4a8f^0xa4a89)&&_0x388720['label']<_0x1499b3[0x7903a^0x7903b]){_0x388720['label']=_0x1499b3[0x1];_0x1499b3=_0xa33ea5;break;}if(_0x1499b3&&_0x388720['label']<_0x1499b3[0xbcef7^0xbcef5]){_0x388720['label']=_0x1499b3[0x49862^0x49860];_0x388720['ops']['push'](_0xa33ea5);break;}if(_0x1499b3[0x2f3f3^0x2f3f1])_0x388720['ops']['pop']();_0x388720['trys']['pop']();continue;}_0xa33ea5=_0x514d91['call'](_0x40e447,_0x388720);}catch(_0x2f5c93){_0xa33ea5=[0x6,_0x2f5c93];_0x290450=0x0;}finally{_0x3c2c5f=_0x1499b3=0x0;}if(_0xa33ea5[0x0]&0x5)throw _0xa33ea5[0x1];return{'value':_0xa33ea5[0x8c1cd^0x8c1cd]?_0xa33ea5[0xc4649^0xc4648]:void(0x505f6^0x505f6),'done':!![]};}};exports['__esModule']=!![];var zwsdk=function(){function _0x1df74e(){this['VERSION']='1.3.1';var _0x420d99=arguments['length']>(0xcf9f7^0xcf9f7)&&void 0x0!==arguments[0x76d90^0x76d90]?arguments[0x0]:null;var _0x1890aa=wx['getEnterOptionsSync']()['query'];if(_0x420d99){_0x1df74e['default']['appId']=_0x420d99['app_id'];_0x1df74e['default']['gameId']=_0x420d99['game_id'];_0x1df74e['default']['os']=_0x1df74e['getSystemOS']();_0x1df74e['default']['baseUrl']=_0x420d99['dev']?'https://zs.zwwlkj03.top/api':'https://zyou.wozhangwan.com/api';_0x1df74e['default']['query']=_0x1890aa;_0x1df74e['default']['state']=_0x1df74e['getState'](_0x1890aa);var _0xa8b3a8=wx['getSystemInfoSync']()['SDKVersion'];console['log']('lib\x20version:'+_0xa8b3a8);if(_0x1df74e['selfCompareVersion'](_0xa8b3a8,'1.4.0')>=0x0){wx['setKeepScreenOn']({'keepScreenOn':!![]});console['log']('设置不息屏');}else{}}}_0x1df74e['selfCompareVersion']=function(_0x3c82b8,_0x25e2ef){_0x3c82b8=_0x3c82b8['split']('.');_0x25e2ef=_0x25e2ef['split']('.');var _0x4d5ac3=Math['max'](_0x3c82b8['length'],_0x25e2ef['length']);while(_0x3c82b8['length']<_0x4d5ac3){_0x3c82b8['push']('0');}while(_0x25e2ef['length']<_0x4d5ac3){_0x25e2ef['push']('0');}for(var _0x20455f=0x1e91a^0x1e91a;_0x20455f<_0x4d5ac3;_0x20455f++){var _0xaf286a=parseInt(_0x3c82b8[_0x20455f]);var _0x3d4671=parseInt(_0x25e2ef[_0x20455f]);if(_0xaf286a>_0x3d4671){return 0x1;}else if(_0xaf286a<_0x3d4671){return-0x1;}}return 0x1fd3b^0x1fd3b;};_0x1df74e['prototype']['getGameConf']=function(){return new Promise(function(_0x54ce56,_0x2c8387){_0x1df74e['ajax']('/mini_sdk/game/getConf',{'app_id':_0x1df74e['default']['appId'],'game_id':_0x1df74e['default']['gameId'],'app_version':'1.1'})['then'](function(_0x453531){_0x54ce56(_0x453531);});});};_0x1df74e['prototype']['login']=function(){var _0x743386=arguments['length']>0x0&&void 0x0!==arguments[0x0]?arguments[0x0]:{};return new Promise(function(_0x4dbd4c,_0x8ef443){wx['login']({'success':function(_0x2cf337){var _0xb9a320=_0x2cf337['code'];_0x1df74e['ajax']('/mini_sdk/auth/login',{'code':_0xb9a320,'state':_0x1df74e['default']['state'],'query':_0x1df74e['default']['query'],'app_id':_0x1df74e['default']['appId'],'game_id':_0x1df74e['default']['gameId'],'os':_0x1df74e['default']['os'],'device_number':_0x1df74e['default']['device_brand'],'device_brand':_0x1df74e['default']['device_brand']})['then'](function(_0x340c4f){var _0x4fe469=_0x340c4f;if(_0x340c4f['status_code']===0x1){_0x1df74e['default']['userToken']=_0x340c4f['data']['data']['user_token'];_0x1df74e['default']['memberId']=_0x340c4f['data']['data']['member_id'];_0x1df74e['initShare']();_0x1df74e['checkLoginStatus']();_0x4dbd4c(_0x4fe469);}else{wx['showModal']({'title':'异常','content':_0x340c4f['msg'],'confirmText':'我知道了','showCancel':![]});}});}});});};_0x1df74e['prototype']['updateUserInfo']=function(){var _0x55f071=arguments['length']>(0xb21bf^0xb21bf)&&void(0x302a1^0x302a1)!==arguments[0x0]?arguments[0xcd1c8^0xcd1c8]:{};return new Promise(function(_0x54607c,_0x286b3c){_0x1df74e['ajax']('/mini_sdk/member/updateInfo',{'app_id':_0x1df74e['default']['appId'],'game_id':_0x1df74e['default']['gameId'],'member_id':_0x1df74e['default']['memberId'],'raw_data':_0x55f071['raw_data']||'','signature':_0x55f071['signature']||'','encrypted_data':_0x55f071['encrypted_data']||'','iv':_0x55f071['iv']||'','user_info':_0x55f071['user_info']||''})['then'](function(_0x4161bf){_0x1df74e['default']['roleId']=_0x4161bf['data']['data']['role_id']||'';_0x54607c(_0x4161bf);});});};_0x1df74e['prototype']['createOrder']=function(){var _0x52023c=this;var _0x4c32e9=arguments['length']>(0xce3cf^0xce3cf)&&void(0x82d20^0x82d20)!==arguments[0x0]?arguments[0x0]:{};return new Promise(function(_0x3e7353,_0x26a5b7){return __awaiter(_0x52023c,void 0x0,void 0x0,function(){var _0x4c2690,_0x21afaa,_0x319738,_0x3574ea,_0x2aea00,_0x34d976,_0x5c02f,_0x1a43bf,_0x48eae7,_0x139f8f;var _0x1d63ed=this;return __generator(this,function(_0x36dede){switch(_0x36dede['label']){case 0x0:return[0x4,_0x1df74e['ajax']('/mini_sdk/order/create',{'app_id':_0x1df74e['default']['appId'],'game_id':_0x1df74e['default']['gameId'],'member_id':_0x1df74e['default']['memberId'],'os':_0x1df74e['default']['os'],'device_number':_0x1df74e['default']['device_number'],'device_brand':_0x1df74e['default']['device_brand'],'order':_0x4c32e9['order']||{},'role':_0x4c32e9['role']||{},'role_id':_0x1df74e['default']['roleId']})];case 0xf18aa^0xf18ab:_0x4c2690=_0x36dede['sent']();if(_0x4c2690['status_code']===0x1){_0x3e7353({'status_code':_0x4c2690['status_code'],'msg':_0x4c2690['msg'],'data':{'data':{'order_id':_0x4c2690['data']['data']['order_id']}}});_0x21afaa=_0x4c2690['data']['data']['pay_type'];if(_0x21afaa==='customer'){wx['showModal']({'title':'充值教程','content':'即将跳转官方【客服会话】充值,给客服回复“1”获取充值链接','confirmText':'客服充值','showCancel':![],'success':function(_0x147b62){if(_0x147b62['confirm']){console['log']('res');_0x1d63ed['customMessage']();}}});}if(_0x21afaa==='minipay'){wx['navigateToMiniProgram']({'appId':_0x4c2690['data']['data']['mini_pay']['app_id'],'path':_0x4c2690['data']['data']['mini_pay']['path']});}if(_0x21afaa==='mpay'){_0x319738=_0x4c2690['data']['data']['mpay'],_0x3574ea=_0x319738['mode'],_0x2aea00=_0x319738['env'],_0x34d976=_0x319738['offer_id'],_0x5c02f=_0x319738['currency_type'],_0x1a43bf=_0x319738['platform'],_0x48eae7=_0x319738['buy_quantity'],_0x139f8f=_0x319738['zone_id'];wx['requestMidasPayment']({'mode':_0x3574ea,'env':_0x2aea00,'offerId':_0x34d976,'currencyType':_0x5c02f,'buyQuantity':_0x48eae7,'platform':_0x1a43bf,'zoneId':_0x139f8f,'complete':function(_0x1af4e8){_0x1df74e['ajax']('/mini_sdk/mds_pay/callback',{'order_id':_0x4c2690['data']['data']['order_id']||'','status':_0x1af4e8['errCode']?![]:!![],'code':_0x1af4e8['errCode'],'msg':_0x1af4e8['errMsg']})['then'](function(_0x4fa3e5){console['log']('/mini_sdk/mds_pay/pay:',_0x4fa3e5);});}});}}else{_0x3e7353(_0x4c2690);}return[0x370ce^0x370cc];}});});});};_0x1df74e['prototype']['checkOrder']=function(){var _0x1a4c44=arguments['length']>0x0&&void 0x0!==arguments[0xd41da^0xd41da]?arguments[0x0]:{};return new Promise(function(_0x3cd661,_0x108519){_0x1df74e['ajax']('/mini_sdk/order/getPayStatus',{'order':_0x1a4c44['order']})['then'](function(_0x2e4aed){_0x3cd661(_0x2e4aed);});});};_0x1df74e['checkLoginStatus']=function(){_0x1df74e['default']['checkLoginStatusTimer']=setTimeout(function(){_0x1df74e['ajax']('/mini_sdk/member/checkLoginStatus',{})['then'](function(_0x36b799){if(_0x36b799['status_code']!==(0x63546^0x63547)){console['log'](_0x36b799);wx['showLoading']({'title':'请重新登录!','mask':!![],'complete':function(_0x4473fe){console['log']('showLoading,complete',_0x4473fe);}});wx['closeSocket']();wx['onSocketOpen'](function(_0x53cc5a){wx['closeSocket']();});clearInterval(_0x1df74e['default']['checkLoginStatusTimer']);}else{_0x1df74e['checkLoginStatus']();}});},0xea60);};_0x1df74e['initShare']=function(){_0x1df74e['ajax']('/mini_sdk/share/getShareInfo',{'game_id':_0x1df74e['default']['gameId'],'member_id':_0x1df74e['default']['memberId'],'app_id':_0x1df74e['default']['appId']})['then'](function(_0x4bb76b){wx['onShareAppMessage'](function(){_0x1df74e['log']('系统转发:onShareAppMessage',{'params':{'game_id':_0x1df74e['default']['gameId'],'member_id':_0x1df74e['default']['memberId'],'app_id':_0x1df74e['default']['appId']},'result':_0x4bb76b});_0x1df74e['reportShare']({'share_id':_0x4bb76b['data']['data']['share_id']});return{'title':_0x4bb76b['data']['data']['title'],'imageUrl':_0x4bb76b['data']['data']['share_img'],'query':'state='+_0x4bb76b['data']['data']['state']};});wx['showShareMenu']({'withShareTicket':!![],'menus':['shareAppMessage','shareTimeline']});});};_0x1df74e['prototype']['getShareInfo']=function(){var _0x5dd5d2=arguments['length']>0x0&&void 0x0!==arguments[0x0]?arguments[0xc68cb^0xc68cb]:{};_0x1df74e['ajax']('/mini_sdk/share/getShareInfo',{'game_id':_0x1df74e['default']['gameId'],'member_id':_0x1df74e['default']['memberId'],'app_id':_0x1df74e['default']['appId'],'path':_0x5dd5d2['path']||''})['then'](function(_0x1506e7){wx['onShareAppMessage'](function(){_0x1df74e['log']('系统转发:onShareAppMessage',{'params':{'game_id':_0x1df74e['default']['gameId'],'member_id':_0x1df74e['default']['memberId'],'app_id':_0x1df74e['default']['appId'],'path':_0x5dd5d2['path']||''},'result':_0x1506e7});_0x1df74e['reportShare']({'share_id':_0x1506e7['data']['data']['share_id']});return{'title':_0x1506e7['data']['data']['title'],'imageUrl':_0x1506e7['data']['data']['share_img'],'query':'state='+_0x1506e7['data']['data']['state']};});wx['showShareMenu']({'withShareTicket':!![],'menus':['shareAppMessage','shareTimeline']});if(_0x5dd5d2['shareAppMessage']||_0x5dd5d2['shareAppMessage']===undefined){wx['shareAppMessage']({'title':_0x1506e7['data']['data']['title'],'imageUrl':_0x1506e7['data']['data']['share_img'],'query':'state='+_0x1506e7['data']['data']['state']});_0x1df74e['reportShare']({'share_id':_0x1506e7['data']['data']['share_id']});_0x1df74e['log']('主动转发:shareAppMessage',{'share_id':_0x1506e7['data']['data']['share_id']});}});};_0x1df74e['reportShare']=function(){var _0x60a46a=arguments['length']>(0x64cea^0x64cea)&&void 0x0!==arguments[0xce5f5^0xce5f5]?arguments[0x0]:{};_0x1df74e['ajax']('/mini_sdk/share/report',{'game_id':_0x1df74e['default']['gameId'],'member_id':_0x1df74e['default']['memberId'],'app_id':_0x1df74e['default']['appId'],'share_id':_0x60a46a['share_id']||'','ext':_0x60a46a['ext']||''})['then'](function(_0xc8c8ce){console['log'](_0xc8c8ce);});};_0x1df74e['prototype']['updateRole']=function(){var _0x6f039e=arguments['length']>0x0&&void 0x0!==arguments[0x554f1^0x554f1]?arguments[0xd3fa3^0xd3fa3]:{};return new Promise(function(_0x465956,_0x5ebd0c){_0x1df74e['ajax']('/mini_sdk/role/report',{'app_id':_0x1df74e['default']['appId'],'game_id':_0x1df74e['default']['gameId'],'member_id':_0x1df74e['default']['memberId'],'os':_0x1df74e['default']['os'],'device_number':_0x1df74e['default']['device_number'],'device_brand':_0x1df74e['default']['device_brand'],'role':_0x6f039e['role']||{}})['then'](function(_0x49957d){_0x465956(_0x49957d);});});};_0x1df74e['prototype']['checkMsg']=function(){var _0x32f43a=arguments['length']>(0xe0fd2^0xe0fd2)&&void 0x0!==arguments[0x0]?arguments[0x0]:{};return new Promise(function(_0x326f0a,_0x4643ef){_0x1df74e['ajax']('/mini_sdk/check/message',{'game_id':_0x1df74e['default']['gameId'],'member_id':_0x1df74e['default']['memberId'],'app_id':_0x1df74e['default']['appId'],'content':_0x32f43a['content']||''})['then'](function(_0x2461ff){_0x326f0a(_0x2461ff);});});};_0x1df74e['prototype']['checkImg']=function(){var _0x37c2e8=arguments['length']>(0x7be6a^0x7be6a)&&void(0x8c070^0x8c070)!==arguments[0xba767^0xba767]?arguments[0x94003^0x94003]:{};return new Promise(function(_0x26294c,_0x1b6fd0){wx['uploadFile']({'url':_0x1df74e['default']['baseUrl']+'/mini_sdk/check/image','filePath':_0x37c2e8['filePath'],'name':'image','header':{'User-Token':_0x1df74e['default']['userToken']},'formData':{'game_id':_0x1df74e['default']['gameId'],'member_id':_0x1df74e['default']['memberId'],'app_id':_0x1df74e['default']['appId'],'user_token':_0x1df74e['default']['userToken']},'success':function(_0x35d38d){_0x26294c(_0x35d38d);}});});};_0x1df74e['prototype']['customMessage']=function(){_0x1df74e['ajax']('/mini_sdk/custom_message/config',{'game_id':_0x1df74e['default']['gameId']})['then'](function(_0x22a90f){if(_0x22a90f['status_code']===(0xdbefd^0xdbefc)){wx['openCustomerServiceConversation']({'sessionFrom':_0x22a90f['data']['data']['session_from'],'showMessageCard':_0x22a90f['data']['data']['show_message_card'],'sendMessageTitle':_0x22a90f['data']['data']['send_message_title'],'sendMessagePath':_0x22a90f['data']['data']['send_message_path'],'sendMessageImg':_0x22a90f['data']['data']['send_message_img'],'complete':function(_0x619183){_0x1df74e['log']('客服会话:openCustomerServiceConversation',_0x619183);}});}});};_0x1df74e['prototype']['sendCaptcha']=function(){var _0x5a0382=arguments['length']>(0x3f0cb^0x3f0cb)&&void(0x9835c^0x9835c)!==arguments[0x0]?arguments[0x0]:{};return new Promise(function(_0x4fdf06,_0x2a08cf){_0x1df74e['ajax']('/mini_sdk/captcha/send',{'mobile':_0x5a0382['mobile']||''})['then'](function(_0x412c3f){_0x4fdf06(_0x412c3f);});});};_0x1df74e['prototype']['bindMobile']=function(){var _0x534f8d=arguments['length']>(0x96081^0x96081)&&void 0x0!==arguments[0x0]?arguments[0x0]:{};return new Promise(function(_0x46aa8b,_0x4579ca){_0x1df74e['ajax']('/mini_sdk/member/bindMobile',{'member_id':_0x1df74e['default']['memberId'],'mobile':_0x534f8d['mobile']||'','code':_0x534f8d['code']||'','key':_0x534f8d['key']||''})['then'](function(_0x4aae57){_0x46aa8b(_0x4aae57);});});};_0x1df74e['ajax']=function(_0x2fcd45,_0x3c4d8f){var _0x1a55ea={'content-type':'application/json'};if(_0x1df74e['default']['userToken']){_0x1a55ea['User-Token']=_0x1df74e['default']['userToken'];}var _0x2181b4=_0x3c4d8f['showLoading'],_0x1cb37b=_0x3c4d8f['loadingParams'],_0x5bfeaa=_0x3c4d8f['showToast'],_0x313628=_0x3c4d8f['toastParams'];_0x2181b4&&wx['showLoading'](_0x1cb37b);return new Promise(function(_0x2ccfdd,_0x3c465b){wx['request']({'method':'POST','url':_0x1df74e['default']['baseUrl']+_0x2fcd45,'data':_0x3c4d8f,'header':_0x1a55ea,'success':function(_0x27552f){_0x2181b4&&wx['hideLoading']();if(_0x5bfeaa){_0x313628['title']=_0x27552f['data']['msg'];wx['showToast'](_0x313628);}_0x2ccfdd(_0x27552f['data']);},'fail':function(_0x24c001){_0x2181b4&&wx['hideLoading']();if(_0x5bfeaa){_0x313628['title']=_0x24c001['errMsg'];wx['showToast'](_0x313628);}_0x2ccfdd(_0x24c001);}});});};_0x1df74e['getSystemOS']=function(){var _0x449c17=wx['getSystemInfoSync']()['system'];if(_0x449c17['toLocaleLowerCase']()['indexOf']('android')>-0x1)return'android';if(_0x449c17['toLocaleLowerCase']()['indexOf']('ios')>-0x1)return'ios';if(_0x449c17['toLocaleLowerCase']()['indexOf']('windows')>-0x1)return'windows';if(_0x449c17['toLocaleLowerCase']()['indexOf']('macos')>-(0x41819^0x41818))return'macos';return'other';};_0x1df74e['getSystemBrand']=function(){var _0x21a9cf=wx['getSystemInfoSync']()['brand'];return _0x21a9cf;};_0x1df74e['getSystemNumber']=function(){var _0x473a15=wx['getSystemInfoSync']()['model'];return _0x473a15;};_0x1df74e['midasPay']=function(_0x56cdc0){return wx['requestMidasPayment'](_0x56cdc0);};_0x1df74e['getQueryVariable']=function(_0x1bca54,_0xcb789f){var _0x4b70a4=_0x1bca54;var _0x54d3ae=_0x4b70a4['split']('&');for(var _0x3f550a=0x0;_0x3f550a<_0x54d3ae['length'];_0x3f550a++){var _0x2b8433=_0x54d3ae[_0x3f550a]['split']('=');if(_0x2b8433[0xca2af^0xca2af]===_0xcb789f){return _0x2b8433[0x1];}}return'';};_0x1df74e['getState']=function(_0x2f4174){if(_0x2f4174['state']){return _0x2f4174['state'];}if(_0x2f4174['scene']&&_0x2f4174['scene']['indexOf']('state')>-(0x1a8e8^0x1a8e9)){return _0x1df74e['getQueryVariable'](decodeURIComponent(_0x2f4174['scene']),'state');}return'';};_0x1df74e['log']=function(_0x2e33fe,_0x867cbe){_0x1df74e['ajax']('/mini_sdk/sdk_log/miniLog',{'name':_0x2e33fe,'value':_0x867cbe})['then'](function(_0x543ab2){console['log']('log:',_0x543ab2);});};_0x1df74e['default']={'checkLoginStatusTimer':null,'appId':'','gameId':'','os':_0x1df74e['getSystemOS'](),'device_number':_0x1df74e['getSystemNumber'](),'device_brand':_0x1df74e['getSystemBrand'](),'memberId':'','roleId':'','playerId':'','userToken':'','baseUrl':''};return _0x1df74e;}();exports['default']=zwsdk;
\ No newline at end of file
'use strict';var __awaiter=this&&this["\u005f\u005f\u0061\u0077\u0061\u0069\u0074\u0065\u0072"]||function(_0x455867,_0x4de7c3,_0x381494,_0x2e6381){function _0x5e2bd5(_0x1c42e3){return _0x1c42e3 instanceof _0x381494?_0x1c42e3:new _0x381494(function(_0x4fc4bc){_0x4fc4bc(_0x1c42e3);});}return new(_0x381494||(_0x381494=Promise))(function(_0x425e33,_0x8052db){function _0x255ac1(_0xf5f88c){try{_0x4fe3f4(_0x2e6381["\u006e\u0065\u0078\u0074"](_0xf5f88c));}catch(_0x3b52da){_0x8052db(_0x3b52da);}}function _0x5bca2d(_0x1c6139){try{_0x4fe3f4(_0x2e6381["\u0074\u0068\u0072\u006f\u0077"](_0x1c6139));}catch(_0x258a0a){_0x8052db(_0x258a0a);}}function _0x4fe3f4(_0x1537a8){_0x1537a8["\u0064\u006f\u006e\u0065"]?_0x425e33(_0x1537a8["\u0076\u0061\u006c\u0075\u0065"]):_0x5e2bd5(_0x1537a8["\u0076\u0061\u006c\u0075\u0065"])["\u0074\u0068\u0065\u006e"](_0x255ac1,_0x5bca2d);}_0x4fe3f4((_0x2e6381=_0x2e6381["\u0061\u0070\u0070\u006c\u0079"](_0x455867,_0x4de7c3||[]))["\u006e\u0065\u0078\u0074"]());});};var __generator=this&&this["\u005f\u005f\u0067\u0065\u006e\u0065\u0072\u0061\u0074\u006f\u0072"]||function(_0x5b7cf2,_0x42e947){var _0x220696={"\u006c\u0061\u0062\u0065\u006c":0x0,"\u0073\u0065\u006e\u0074":function(){if(_0x2385ec[0x6fd97^0x6fd97]&(0x84be7^0x84be6))throw _0x2385ec[0xc485b^0xc485a];return _0x2385ec[0x2c7dc^0x2c7dd];},"\u0074\u0072\u0079\u0073":[],'ops':[]},_0x1bfe13,_0x9b7667,_0x2385ec,_0x1a3242;return _0x1a3242={"\u006e\u0065\u0078\u0074":_0x3321d2(0x2bc6c^0x2bc6c),'throw':_0x3321d2(0xd72bf^0xd72be),"\u0072\u0065\u0074\u0075\u0072\u006e":_0x3321d2(0xc9ef7^0xc9ef5)},typeof Symbol==="noitcnuf".split("").reverse().join("")&&(_0x1a3242[Symbol['iterator']]=function(){return this;}),_0x1a3242;function _0x3321d2(_0x324fb6){return function(_0x583307){return _0x291ad3([_0x324fb6,_0x583307]);};}function _0x291ad3(_0x1769f8){if(_0x1bfe13)throw new TypeError(".gnitucexe ydaerla si rotareneG".split("").reverse().join(""));while(_0x220696)try{if(_0x1bfe13=0x6548f^0x6548e,_0x9b7667&&(_0x2385ec=_0x1769f8[0x966a2^0x966a2]&(0x8cad1^0x8cad3)?_0x9b7667["\u0072\u0065\u0074\u0075\u0072\u006e"]:_0x1769f8[0x5f636^0x5f636]?_0x9b7667['throw']||((_0x2385ec=_0x9b7667['return'])&&_0x2385ec['call'](_0x9b7667),0xf2d84^0xf2d84):_0x9b7667['next'])&&!(_0x2385ec=_0x2385ec["\u0063\u0061\u006c\u006c"](_0x9b7667,_0x1769f8[0x1]))["\u0064\u006f\u006e\u0065"])return _0x2385ec;if(_0x9b7667=0xc73d6^0xc73d6,_0x2385ec)_0x1769f8=[_0x1769f8[0xd038a^0xd038a]&(0x946c3^0x946c1),_0x2385ec['value']];switch(_0x1769f8[0x0]){case 0x0:case 0x94e7e^0x94e7f:_0x2385ec=_0x1769f8;break;case 0xb9fa4^0xb9fa0:_0x220696["\u006c\u0061\u0062\u0065\u006c"]++;return{'value':_0x1769f8[0x9ee4f^0x9ee4e],'done':![]};case 0x5:_0x220696["\u006c\u0061\u0062\u0065\u006c"]++;_0x9b7667=_0x1769f8[0x1];_0x1769f8=[0x0];continue;case 0x7:_0x1769f8=_0x220696['ops']["\u0070\u006f\u0070"]();_0x220696["\u0074\u0072\u0079\u0073"]["\u0070\u006f\u0070"]();continue;default:if(!(_0x2385ec=_0x220696['trys'],_0x2385ec=_0x2385ec["\u006c\u0065\u006e\u0067\u0074\u0068"]>0x0&&_0x2385ec[_0x2385ec['length']-(0xed8be^0xed8bf)])&&(_0x1769f8[0x0]===(0xe1299^0xe129f)||_0x1769f8[0x0]===0x2)){_0x220696=0x0;continue;}if(_0x1769f8[0x0]===(0xdbe33^0xdbe30)&&(!_0x2385ec||_0x1769f8[0x1]>_0x2385ec[0x37585^0x37585]&&_0x1769f8[0x1]<_0x2385ec[0x7b1cc^0x7b1cf])){_0x220696["\u006c\u0061\u0062\u0065\u006c"]=_0x1769f8[0x1];break;}if(_0x1769f8[0x0]===(0xb1674^0xb1672)&&_0x220696["\u006c\u0061\u0062\u0065\u006c"]<_0x2385ec[0x1]){_0x220696['label']=_0x2385ec[0x7c3b0^0x7c3b1];_0x2385ec=_0x1769f8;break;}if(_0x2385ec&&_0x220696['label']<_0x2385ec[0x2]){_0x220696['label']=_0x2385ec[0x97247^0x97245];_0x220696["\u006f\u0070\u0073"]["\u0070\u0075\u0073\u0068"](_0x1769f8);break;}if(_0x2385ec[0x7bf4f^0x7bf4d])_0x220696['ops']["\u0070\u006f\u0070"]();_0x220696["\u0074\u0072\u0079\u0073"]["\u0070\u006f\u0070"]();continue;}_0x1769f8=_0x42e947['call'](_0x5b7cf2,_0x220696);}catch(_0x3919e1){_0x1769f8=[0x6,_0x3919e1];_0x9b7667=0x0;}finally{_0x1bfe13=_0x2385ec=0xdd7e6^0xdd7e6;}if(_0x1769f8[0x0]&0x5)throw _0x1769f8[0x1];return{'value':_0x1769f8[0x0]?_0x1769f8[0x1]:void 0x0,"\u0064\u006f\u006e\u0065":!![]};}};exports['__esModule']=!![];var zwsdk=function(){function _0xfcdd9a(){this['VERSION']=_0xfcdd9a['SDKVersion'];var _0x2eeb9e=arguments['length']>(0xcba75^0xcba75)&&void(0x9e2d6^0x9e2d6)!==arguments[0x0]?arguments[0x5c802^0x5c802]:null;_0xfcdd9a["\u0056\u0045\u0052\u0053\u0049\u004f\u004e"]=this['VERSION'];var _0x30d73e=wx["\u0067\u0065\u0074\u0045\u006e\u0074\u0065\u0072\u004f\u0070\u0074\u0069\u006f\u006e\u0073\u0053\u0079\u006e\u0063"]()['query'];if(_0x2eeb9e){_0xfcdd9a['default']["\u0061\u0070\u0070\u0049\u0064"]=_0x2eeb9e['app_id'];_0xfcdd9a["\u0064\u0065\u0066\u0061\u0075\u006c\u0074"]["\u0067\u0061\u006d\u0065\u0049\u0064"]=_0x2eeb9e['game_id'];_0xfcdd9a["\u0064\u0065\u0066\u0061\u0075\u006c\u0074"]["\u006f\u0073"]=_0xfcdd9a["\u0067\u0065\u0074\u0053\u0079\u0073\u0074\u0065\u006d\u004f\u0053"]();_0xfcdd9a['default']['baseUrl']=_0x2eeb9e['dev']?"ipa/pot.30jklwwz.sz//:sptth".split("").reverse().join(""):'https://zyou.wozhangwan.com/api';_0xfcdd9a["\u0064\u0065\u0066\u0061\u0075\u006c\u0074"]["\u0071\u0075\u0065\u0072\u0079"]=_0x30d73e;_0xfcdd9a['default']["\u0073\u0074\u0061\u0074\u0065"]=_0xfcdd9a['getState'](_0x30d73e);var _0x412b48=wx["\u0067\u0065\u0074\u0053\u0079\u0073\u0074\u0065\u006d\u0049\u006e\u0066\u006f\u0053\u0079\u006e\u0063"]()["\u0053\u0044\u004b\u0056\u0065\u0072\u0073\u0069\u006f\u006e"];console["\u006c\u006f\u0067"](":noisrev bil".split("").reverse().join("")+_0x412b48);if(_0xfcdd9a['selfCompareVersion'](_0x412b48,"\u0031\u002e\u0034\u002e\u0030")>=0x0){wx["\u0073\u0065\u0074\u004b\u0065\u0065\u0070\u0053\u0063\u0072\u0065\u0065\u006e\u004f\u006e"]({'keepScreenOn':!![]});console["\u006c\u006f\u0067"]("\u5C4F\u606F\u4E0D\u7F6E\u8BBE".split("").reverse().join(""));}else{}}}_0xfcdd9a["\u0073\u0065\u006c\u0066\u0043\u006f\u006d\u0070\u0061\u0072\u0065\u0056\u0065\u0072\u0073\u0069\u006f\u006e"]=function(_0x2413c0,_0x2ce16d){_0x2413c0=_0x2413c0['split']("\u002e");_0x2ce16d=_0x2ce16d['split']('.');var _0x558380=Math["\u006d\u0061\u0078"](_0x2413c0["\u006c\u0065\u006e\u0067\u0074\u0068"],_0x2ce16d["\u006c\u0065\u006e\u0067\u0074\u0068"]);while(_0x2413c0["\u006c\u0065\u006e\u0067\u0074\u0068"]<_0x558380){_0x2413c0['push']("\u0030");}while(_0x2ce16d["\u006c\u0065\u006e\u0067\u0074\u0068"]<_0x558380){_0x2ce16d['push']("\u0030");}for(var _0x4e6086=0x0;_0x4e6086<_0x558380;_0x4e6086++){var _0x75804b=parseInt(_0x2413c0[_0x4e6086]);var _0x1672f3=parseInt(_0x2ce16d[_0x4e6086]);if(_0x75804b>_0x1672f3){return 0x1;}else if(_0x75804b<_0x1672f3){return-(0x5eeaa^0x5eeab);}}return 0x0;};_0xfcdd9a["\u0070\u0072\u006f\u0074\u006f\u0074\u0079\u0070\u0065"]['getGameConf']=function(){return new Promise(function(_0x35aefe,_0x1895ff){_0xfcdd9a["\u0061\u006a\u0061\u0078"]("\u002f\u006d\u0069\u006e\u0069\u005f\u0073\u0064\u006b\u002f\u0067\u0061\u006d\u0065\u002f\u0067\u0065\u0074\u0043\u006f\u006e\u0066",{'app_id':_0xfcdd9a['default']['appId'],'game_id':_0xfcdd9a["\u0064\u0065\u0066\u0061\u0075\u006c\u0074"]["\u0067\u0061\u006d\u0065\u0049\u0064"],'app_version':'1.1'})['then'](function(_0x5cc449){if(_0x5cc449["\u0073\u0074\u0061\u0074\u0075\u0073\u005f\u0063\u006f\u0064\u0065"]===0x1){_0xfcdd9a['default']['gameConfig']=_0x5cc449['data']['data'];_0xfcdd9a['default']['gameConfig']["\u0067\u0061\u006d\u0065\u005f\u0063\u006c\u0075\u0062"]&&_0xfcdd9a["\u0067\u0061\u006d\u0065\u0043\u006c\u0075\u0062\u0049\u006e\u0069\u0074"]();}_0x35aefe(_0x5cc449);});});};_0xfcdd9a['prototype']["\u006c\u006f\u0067\u0069\u006e"]=function(){var _0x4eae49=arguments['length']>0x0&&void(0xb56a2^0xb56a2)!==arguments[0x0]?arguments[0x0]:{};return new Promise(function(_0x58fd57,_0x5b1d57){wx["\u006c\u006f\u0067\u0069\u006e"]({'success':function(_0x1ca464){var _0x2788f2=_0x1ca464['code'];_0xfcdd9a['ajax']('/mini_sdk/auth/login',{'code':_0x2788f2,'state':_0xfcdd9a['default']['state'],"\u0071\u0075\u0065\u0072\u0079":_0xfcdd9a['default']['query'],'app_id':_0xfcdd9a['default']['appId'],"\u0067\u0061\u006d\u0065\u005f\u0069\u0064":_0xfcdd9a['default']['gameId'],'os':_0xfcdd9a['default']['os'],'device_number':_0xfcdd9a['default']['device_brand'],"\u0064\u0065\u0076\u0069\u0063\u0065\u005f\u0062\u0072\u0061\u006e\u0064":_0xfcdd9a["\u0064\u0065\u0066\u0061\u0075\u006c\u0074"]['device_brand']})["\u0074\u0068\u0065\u006e"](function(_0x5e7e58){var _0x4c9d9d=_0x5e7e58;if(_0x5e7e58['status_code']===0x1){_0xfcdd9a['default']['userToken']=_0x5e7e58['data']["\u0064\u0061\u0074\u0061"]['user_token'];_0xfcdd9a['default']['memberId']=_0x5e7e58['data']['data']['member_id'];_0xfcdd9a['initShare']();_0xfcdd9a['checkLoginStatus']();_0xfcdd9a['initSubscribeMessage']();_0xfcdd9a['subscribeMessageScheduled']();_0x58fd57(_0x4c9d9d);}else{wx['showModal']({'title':'异常','content':_0x5e7e58['msg'],'confirmText':'我知道了','showCancel':![]});}});}});});};_0xfcdd9a['prototype']['updateUserInfo']=function(){var _0x45fc8c=arguments['length']>0x0&&void 0x0!==arguments[0x792fd^0x792fd]?arguments[0x7b9e1^0x7b9e1]:{};return new Promise(function(_0x4c9a43,_0x20e8b2){_0xfcdd9a['ajax']("ofnIetadpu/rebmem/kds_inim/".split("").reverse().join(""),{'app_id':_0xfcdd9a['default']['appId'],'game_id':_0xfcdd9a['default']['gameId'],'member_id':_0xfcdd9a["\u0064\u0065\u0066\u0061\u0075\u006c\u0074"]['memberId'],"\u0072\u0061\u0077\u005f\u0064\u0061\u0074\u0061":_0x45fc8c['raw_data']||"",'signature':_0x45fc8c['signature']||'','encrypted_data':_0x45fc8c["\u0065\u006e\u0063\u0072\u0079\u0070\u0074\u0065\u0064\u005f\u0064\u0061\u0074\u0061"]||"".split("").reverse().join(""),"\u0069\u0076":_0x45fc8c['iv']||"".split("").reverse().join(""),'user_info':_0x45fc8c['user_info']||"".split("").reverse().join("")})['then'](function(_0xbc7d3f){_0xfcdd9a["\u0064\u0065\u0066\u0061\u0075\u006c\u0074"]['roleId']=_0xbc7d3f["\u0064\u0061\u0074\u0061"]['data']['role_id']||'';_0x4c9a43(_0xbc7d3f);});});};_0xfcdd9a['prototype']['createOrder']=function(){var _0x2f6bf4=this;var _0x55a7b8=arguments['length']>(0xe9f85^0xe9f85)&&void 0x0!==arguments[0x0]?arguments[0x0]:{};return new Promise(function(_0xc190cc,_0x1eed17){return __awaiter(_0x2f6bf4,void 0x0,void 0x0,function(){var _0x583f64,_0x4611bd,_0x548903,_0x452943,_0x35ca4d,_0x397899,_0x873132,_0x5adbec,_0x32875b,_0x505447;var _0x5a0692=this;return __generator(this,function(_0x105db9){switch(_0x105db9["\u006c\u0061\u0062\u0065\u006c"]){case 0x1af1d^0x1af1d:return[0x4,_0xfcdd9a['ajax']('/mini_sdk/order/create',{'app_id':_0xfcdd9a['default']['appId'],'game_id':_0xfcdd9a['default']["\u0067\u0061\u006d\u0065\u0049\u0064"],'member_id':_0xfcdd9a['default']['memberId'],'os':_0xfcdd9a['default']['os'],'device_number':_0xfcdd9a['default']["\u0064\u0065\u0076\u0069\u0063\u0065\u005f\u006e\u0075\u006d\u0062\u0065\u0072"],'device_brand':_0xfcdd9a['default']['device_brand'],'order':_0x55a7b8['order']||{},'role':_0x55a7b8['role']||{},"\u0072\u006f\u006c\u0065\u005f\u0069\u0064":_0xfcdd9a['default']['roleId']})];case 0x1:_0x583f64=_0x105db9['sent']();if(_0x583f64['status_code']===0x1){_0xc190cc({'status_code':_0x583f64['status_code'],'msg':_0x583f64['msg'],'data':{'data':{'order_id':_0x583f64['data']['data']['order_id']}}});_0x4611bd=_0x583f64['data']['data']['pay_type'];if(_0x4611bd==='customer'){wx["\u0073\u0068\u006f\u0077\u004d\u006f\u0064\u0061\u006c"]({'title':'充值教程','content':'即将跳转官方【客服会话】充值,给客服回复“1”获取充值链接','confirmText':'客服充值','showCancel':![],'success':function(_0x17a834){if(_0x17a834['confirm']){console['log']('res');_0x5a0692["\u0063\u0075\u0073\u0074\u006f\u006d\u004d\u0065\u0073\u0073\u0061\u0067\u0065"]();}}});}if(_0x4611bd==="yapinim".split("").reverse().join("")){wx['navigateToMiniProgram']({'appId':_0x583f64['data']['data']['mini_pay']['app_id'],"\u0070\u0061\u0074\u0068":_0x583f64['data']["\u0064\u0061\u0074\u0061"]["\u006d\u0069\u006e\u0069\u005f\u0070\u0061\u0079"]['path']});}if(_0x4611bd==="yapm".split("").reverse().join("")){_0x548903=_0x583f64['data']["\u0064\u0061\u0074\u0061"]['mpay'],_0x452943=_0x548903['mode'],_0x35ca4d=_0x548903['env'],_0x397899=_0x548903['offer_id'],_0x873132=_0x548903['currency_type'],_0x5adbec=_0x548903['platform'],_0x32875b=_0x548903['buy_quantity'],_0x505447=_0x548903['zone_id'];wx['requestMidasPayment']({'mode':_0x452943,"\u0065\u006e\u0076":_0x35ca4d,"\u006f\u0066\u0066\u0065\u0072\u0049\u0064":_0x397899,'currencyType':_0x873132,'buyQuantity':_0x32875b,"\u0070\u006c\u0061\u0074\u0066\u006f\u0072\u006d":_0x5adbec,'zoneId':_0x505447,"\u006f\u0075\u0074\u0054\u0072\u0061\u0064\u0065\u004e\u006f":_0x583f64["\u0064\u0061\u0074\u0061"]["\u0064\u0061\u0074\u0061"]['order_id'],'complete':function(_0x491f1e){_0xfcdd9a['ajax']('/mini_sdk/mds_pay/callback',{"\u006f\u0072\u0064\u0065\u0072\u005f\u0069\u0064":_0x583f64['data']['data']['order_id']||"".split("").reverse().join(""),'status':_0x491f1e["\u0065\u0072\u0072\u0043\u006f\u0064\u0065"]?![]:!![],'code':_0x491f1e['errCode'],'msg':_0x491f1e['errMsg']})['then'](function(_0x51ff98){console['log'](":yap/yap_sdm/kds_inim/".split("").reverse().join(""),_0x51ff98);});}});}}else{_0xc190cc(_0x583f64);}return[0x2];}});});});};_0xfcdd9a['prototype']['checkOrder']=function(){var _0x51b313=arguments['length']>(0xecf44^0xecf44)&&void(0x26dce^0x26dce)!==arguments[0x2fb77^0x2fb77]?arguments[0x0]:{};return new Promise(function(_0x12ec4a,_0x288ff5){_0xfcdd9a['ajax']('/mini_sdk/order/getPayStatus',{'order':_0x51b313['order']})['then'](function(_0x29d5e4){_0x12ec4a(_0x29d5e4);});});};_0xfcdd9a['checkLoginStatus']=function(){_0xfcdd9a["\u0064\u0065\u0066\u0061\u0075\u006c\u0074"]['checkLoginStatusTimer']=setTimeout(function(){_0xfcdd9a['ajax']('/mini_sdk/member/checkLoginStatus',{})['then'](function(_0x18eef6){if(_0x18eef6['status_code']&&_0x18eef6['status_code']===-0x1){wx['showLoading']({'title':"\u8bf7\u91cd\u65b0\u767b\u5f55\u0021",'mask':!![],"\u0063\u006f\u006d\u0070\u006c\u0065\u0074\u0065":function(_0x4e681f){console['log']('showLoading,complete',_0x4e681f);}});wx['closeSocket']();wx['onSocketOpen'](function(_0x227b24){wx['closeSocket']();});clearInterval(_0xfcdd9a['default']['checkLoginStatusTimer']);}else{_0xfcdd9a["\u0063\u0068\u0065\u0063\u006b\u004c\u006f\u0067\u0069\u006e\u0053\u0074\u0061\u0074\u0075\u0073"]();}})['catch'](function(_0x1f846e){_0xfcdd9a['checkLoginStatus']();});},0xea60);};_0xfcdd9a["\u0069\u006e\u0069\u0074\u0053\u0068\u0061\u0072\u0065"]=function(){_0xfcdd9a['ajax']('/mini_sdk/share/getShareInfo',{'game_id':_0xfcdd9a['default']['gameId'],"\u006d\u0065\u006d\u0062\u0065\u0072\u005f\u0069\u0064":_0xfcdd9a['default']['memberId'],'app_id':_0xfcdd9a['default']["\u0061\u0070\u0070\u0049\u0064"]})['then'](function(_0x2c96b9){if(_0x2c96b9['status_code']&&_0x2c96b9['status_code']===(0xafea9^0xafea8)){wx["\u006f\u006e\u0053\u0068\u0061\u0072\u0065\u0041\u0070\u0070\u004d\u0065\u0073\u0073\u0061\u0067\u0065"](function(){_0xfcdd9a["\u006c\u006f\u0067"]('系统转发:onShareAppMessage',{'params':{'game_id':_0xfcdd9a['default']['gameId'],'member_id':_0xfcdd9a['default']['memberId'],'app_id':_0xfcdd9a['default']['appId']},"\u0072\u0065\u0073\u0075\u006c\u0074":_0x2c96b9});_0xfcdd9a['reportShare']({'share_id':_0x2c96b9['data']['data']['share_id']});return{'title':_0x2c96b9['data']['data']['title'],'imageUrl':_0x2c96b9['data']['data']['share_img'],'query':'state='+_0x2c96b9['data']['data']['state']};});wx['showShareMenu']({'withShareTicket':!![],'menus':['shareAppMessage',"enilemiTerahs".split("").reverse().join("")]});}});};_0xfcdd9a['prototype']["\u0067\u0065\u0074\u0053\u0068\u0061\u0072\u0065\u0049\u006e\u0066\u006f"]=function(){var _0x569d0d=arguments['length']>(0x8bb52^0x8bb52)&&void(0x45891^0x45891)!==arguments[0x72f3d^0x72f3d]?arguments[0x6e36f^0x6e36f]:{};_0xfcdd9a['ajax']('/mini_sdk/share/getShareInfo',{'game_id':_0xfcdd9a['default']['gameId'],'member_id':_0xfcdd9a['default']['memberId'],'app_id':_0xfcdd9a['default']['appId'],'path':_0x569d0d['path']||"".split("").reverse().join("")})['then'](function(_0xcf72ed){if(_0xcf72ed['status_code']&&_0xcf72ed['status_code']===0x1){wx['onShareAppMessage'](function(){_0xfcdd9a['log']('系统转发:onShareAppMessage',{'params':{'game_id':_0xfcdd9a["\u0064\u0065\u0066\u0061\u0075\u006c\u0074"]['gameId'],'member_id':_0xfcdd9a['default']["\u006d\u0065\u006d\u0062\u0065\u0072\u0049\u0064"],"\u0061\u0070\u0070\u005f\u0069\u0064":_0xfcdd9a['default']['appId'],'path':_0x569d0d["\u0070\u0061\u0074\u0068"]||"".split("").reverse().join("")},'result':_0xcf72ed});_0xfcdd9a['reportShare']({'share_id':_0xcf72ed['data']["\u0064\u0061\u0074\u0061"]["\u0073\u0068\u0061\u0072\u0065\u005f\u0069\u0064"]});return{'title':_0xcf72ed['data']["\u0064\u0061\u0074\u0061"]["\u0074\u0069\u0074\u006c\u0065"],'imageUrl':_0xcf72ed['data']['data']['share_img'],'query':'state='+_0xcf72ed['data']['data']['state']};});wx['showShareMenu']({'withShareTicket':!![],'menus':['shareAppMessage',"enilemiTerahs".split("").reverse().join("")]});if(_0x569d0d["\u0073\u0068\u0061\u0072\u0065\u0041\u0070\u0070\u004d\u0065\u0073\u0073\u0061\u0067\u0065"]||_0x569d0d["\u0073\u0068\u0061\u0072\u0065\u0041\u0070\u0070\u004d\u0065\u0073\u0073\u0061\u0067\u0065"]===undefined){wx['shareAppMessage']({'title':_0xcf72ed['data']['data']['title'],'imageUrl':_0xcf72ed['data']['data']['share_img'],'query':"\u0073\u0074\u0061\u0074\u0065\u003d"+_0xcf72ed['data']['data']['state']});_0xfcdd9a['reportShare']({'share_id':_0xcf72ed["\u0064\u0061\u0074\u0061"]['data']['share_id']});_0xfcdd9a['log']("\u4e3b\u52a8\u8f6c\u53d1\u003a\u0073\u0068\u0061\u0072\u0065\u0041\u0070\u0070\u004d\u0065\u0073\u0073\u0061\u0067\u0065",{'share_id':_0xcf72ed['data']['data']['share_id']});}}});};_0xfcdd9a['reportShare']=function(){var _0xc2a945=arguments['length']>0x0&&void 0x0!==arguments[0x0]?arguments[0x7f8a1^0x7f8a1]:{};_0xfcdd9a['ajax']("troper/erahs/kds_inim/".split("").reverse().join(""),{'game_id':_0xfcdd9a["\u0064\u0065\u0066\u0061\u0075\u006c\u0074"]['gameId'],'member_id':_0xfcdd9a['default']['memberId'],'app_id':_0xfcdd9a["\u0064\u0065\u0066\u0061\u0075\u006c\u0074"]['appId'],'share_id':_0xc2a945['share_id']||'','ext':_0xc2a945['ext']||"".split("").reverse().join("")})['then'](function(_0x4cbe60){console['log'](_0x4cbe60);});};_0xfcdd9a["\u0070\u0072\u006f\u0074\u006f\u0074\u0079\u0070\u0065"]['updateRole']=function(){var _0x33f747=arguments['length']>0x0&&void(0xa16b5^0xa16b5)!==arguments[0x5438e^0x5438e]?arguments[0x0]:{};return new Promise(function(_0x4a2a04,_0x3c78b1){_0xfcdd9a['ajax']("troper/elor/kds_inim/".split("").reverse().join(""),{'app_id':_0xfcdd9a['default']['appId'],'game_id':_0xfcdd9a['default']['gameId'],'member_id':_0xfcdd9a['default']['memberId'],'os':_0xfcdd9a['default']['os'],"\u0064\u0065\u0076\u0069\u0063\u0065\u005f\u006e\u0075\u006d\u0062\u0065\u0072":_0xfcdd9a['default']['device_number'],'device_brand':_0xfcdd9a['default']['device_brand'],'role':_0x33f747['role']||{}})['then'](function(_0x30058a){_0x4a2a04(_0x30058a);});});};_0xfcdd9a['prototype']['checkMsg']=function(){var _0x2f5cf2=arguments['length']>(0xe448f^0xe448f)&&void 0x0!==arguments[0x0]?arguments[0x920e3^0x920e3]:{};return new Promise(function(_0xe97a1e,_0x57e6e7){_0xfcdd9a['ajax']("egassem/kcehc/kds_inim/".split("").reverse().join(""),{'game_id':_0xfcdd9a['default']['gameId'],'member_id':_0xfcdd9a['default']['memberId'],'app_id':_0xfcdd9a['default']['appId'],'content':_0x2f5cf2['content']||''})['then'](function(_0x5bf5e9){_0xe97a1e(_0x5bf5e9);});});};_0xfcdd9a['prototype']['checkImg']=function(){var _0x111e25=arguments['length']>0x0&&void 0x0!==arguments[0x0]?arguments[0x0]:{};return new Promise(function(_0x5ec231,_0x56ab32){wx['uploadFile']({'url':_0xfcdd9a['default']['baseUrl']+"egami/kcehc/kds_inim/".split("").reverse().join(""),'filePath':_0x111e25['filePath'],'name':'image','header':{'User-Token':_0xfcdd9a['default']['userToken']},'formData':{'game_id':_0xfcdd9a['default']['gameId'],'member_id':_0xfcdd9a['default']['memberId'],'app_id':_0xfcdd9a['default']['appId'],'user_token':_0xfcdd9a['default']['userToken']},'success':function(_0x5723d4){_0x5ec231(_0x5723d4);}});});};_0xfcdd9a['prototype']['customMessage']=function(){_0xfcdd9a['ajax']('/mini_sdk/custom_message/config',{'game_id':_0xfcdd9a['default']['gameId']})['then'](function(_0x3fa3a7){if(_0x3fa3a7['status_code']===(0x8aa79^0x8aa78)){wx['openCustomerServiceConversation']({'sessionFrom':_0x3fa3a7['data']['data']["\u0073\u0065\u0073\u0073\u0069\u006f\u006e\u005f\u0066\u0072\u006f\u006d"],'showMessageCard':_0x3fa3a7['data']['data']['show_message_card'],'sendMessageTitle':_0x3fa3a7['data']['data']['send_message_title'],'sendMessagePath':_0x3fa3a7['data']['data']['send_message_path'],'sendMessageImg':_0x3fa3a7['data']['data']['send_message_img'],'complete':function(_0x28b93d){_0xfcdd9a['log']('客服会话:openCustomerServiceConversation',_0x28b93d);}});}});};_0xfcdd9a['prototype']['sendCaptcha']=function(){var _0x519c73=arguments['length']>0x0&&void 0x0!==arguments[0x0]?arguments[0x481aa^0x481aa]:{};return new Promise(function(_0x1b419e,_0x3e70b1){_0xfcdd9a['ajax']('/mini_sdk/captcha/send',{'mobile':_0x519c73['mobile']||''})['then'](function(_0x39bd34){_0x1b419e(_0x39bd34);});});};_0xfcdd9a['prototype']['bindMobile']=function(){var _0x49d6f4=arguments['length']>0x0&&void(0xe141b^0xe141b)!==arguments[0x0]?arguments[0x0]:{};return new Promise(function(_0x331b3c,_0x24c551){_0xfcdd9a['ajax']('/mini_sdk/member/bindMobile',{'member_id':_0xfcdd9a['default']['memberId'],'mobile':_0x49d6f4['mobile']||"".split("").reverse().join(""),'code':_0x49d6f4['code']||'','key':_0x49d6f4['key']||''})['then'](function(_0x2ffd62){_0x331b3c(_0x2ffd62);});});};_0xfcdd9a['prototype']['subscribeMessage']=function(){return __awaiter(this,void 0x0,void 0x0,function(){return __generator(this,function(_0x1c0911){wx['requestSubscribeMessage']({'tmplIds':_0xfcdd9a['default']['subscribeMessageList']||[],'fail':function(_0x3d75f6){console['log']('requestSubscribeMessage\x20fail:',_0x3d75f6);},'success':function(_0x276d31){console['log']('requestSubscribeMessage\x20success:',_0x276d31);}});return[0x2];});});};_0xfcdd9a['initSubscribeMessage']=function(){_0xfcdd9a['ajax']('/mini_sdk/mini_task/taskTemplateList',{'game_id':_0xfcdd9a['default']['gameId']})['then'](function(_0x1a9cab){if(_0x1a9cab['status_code']===0x1){_0xfcdd9a['default']['subscribeMessageList']=_0x1a9cab['data']['data']||[];if(_0xfcdd9a['default']['subscribeMessageTimer']){clearInterval(_0xfcdd9a['default']['subscribeMessageTimer']);_0xfcdd9a['subscribeMessageScheduled']();}}});};_0xfcdd9a['subscribeMessageScheduled']=function(){_0xfcdd9a['default']['subscribeMessageTimer']=setTimeout(function(){_0xfcdd9a['initSubscribeMessage']();},0x36ee80);};_0xfcdd9a['ajax']=function(_0x1567ed,_0x5cf124){var _0x47f81c={'content-type':'application/json'};if(_0xfcdd9a['default']['userToken']){_0x47f81c['User-Token']=_0xfcdd9a['default']['userToken'];}_0x47f81c['Sdk-Version']=_0xfcdd9a['SDKVersion'];var _0x19eb8f=_0x5cf124['showLoading'],_0x5dd138=_0x5cf124['loadingParams'],_0x40711f=_0x5cf124['showToast'],_0x28bf48=_0x5cf124['toastParams'];_0x19eb8f&&wx['showLoading'](_0x5dd138);return new Promise(function(_0x448ae2,_0x3111a4){wx['request']({'method':"\u0050\u004f\u0053\u0054",'url':_0xfcdd9a['default']['baseUrl']+_0x1567ed,'data':_0x5cf124,'header':_0x47f81c,'success':function(_0x57f2c7){if(_0x57f2c7['data']['status_code']===-(0xa9427^0xa9426)){wx['showLoading']({'title':'请重新登录!','mask':!![],'complete':function(_0x4d452e){console['log']('showLoading,complete',_0x4d452e);}});wx['closeSocket']({'complete':function(_0x37c752){console['log']('closeSocket,complete',_0x37c752);}});wx['onSocketOpen'](function(_0x45fd64){wx['closeSocket']();});console['log'](")(daoler.noitacol".split("").reverse().join(""));location['reload']();}_0x19eb8f&&wx['hideLoading']();if(_0x40711f){_0x28bf48['title']=_0x57f2c7['data']['msg'];wx['showToast'](_0x28bf48);}_0x448ae2(_0x57f2c7['data']);},'fail':function(_0x1a474e){_0x19eb8f&&wx['hideLoading']();if(_0x40711f){_0x28bf48['title']=_0x1a474e['errMsg'];wx['showToast'](_0x28bf48);}_0x448ae2(_0x1a474e);}});});};_0xfcdd9a['getSystemOS']=function(){var _0x4b9742=wx['getSystemInfoSync']()['system'];if(_0x4b9742['toLocaleLowerCase']()['indexOf']('android')>-(0xabf40^0xabf41))return'android';if(_0x4b9742['toLocaleLowerCase']()['indexOf']("soi".split("").reverse().join(""))>-(0x302c6^0x302c7))return'ios';if(_0x4b9742['toLocaleLowerCase']()['indexOf']('windows')>-0x1)return"swodniw".split("").reverse().join("");if(_0x4b9742['toLocaleLowerCase']()['indexOf']("socam".split("").reverse().join(""))>-0x1)return"socam".split("").reverse().join("");return"rehto".split("").reverse().join("");};_0xfcdd9a['getSystemBrand']=function(){var _0x4f2757=wx['getSystemInfoSync']()['brand'];return _0x4f2757;};_0xfcdd9a['getSystemNumber']=function(){var _0x4e0806=wx['getSystemInfoSync']()['model'];return _0x4e0806;};_0xfcdd9a['midasPay']=function(_0x3449fe){return wx['requestMidasPayment'](_0x3449fe);};_0xfcdd9a['getQueryVariable']=function(_0x5dcaaf,_0x55316e){var _0x441619=_0x5dcaaf;var _0x3e08e3=_0x441619['split']('&');for(var _0x253f32=0x40c16^0x40c16;_0x253f32<_0x3e08e3['length'];_0x253f32++){var _0x5239e6=_0x3e08e3[_0x253f32]['split']('=');if(_0x5239e6[0x93053^0x93053]===_0x55316e){return _0x5239e6[0x1];}}return'';};_0xfcdd9a['getState']=function(_0x75cf79){if(_0x75cf79['state']){return _0x75cf79['state'];}if(_0x75cf79['scene']&&_0x75cf79['scene']['indexOf']('state')>-(0x9b542^0x9b543)){return _0xfcdd9a['getQueryVariable'](decodeURIComponent(_0x75cf79['scene']),'state');}return'';};_0xfcdd9a['log']=function(_0xeec396,_0x22369b){_0xfcdd9a['ajax']('/mini_sdk/sdk_log/miniLog',{'name':_0xeec396,'value':_0x22369b})['then'](function(_0x27634b){console['log']('log:',_0x27634b);});};_0xfcdd9a['gameClubInit']=function(){_0xfcdd9a['default']['gameClubButton']=wx['createGameClubButton']({'style':{'left':0x0,'top':0x0,'width':0x0,'height':0x0}});};_0xfcdd9a['prototype']['gameClubShow']=function(){_0xfcdd9a['default']['gameClubButton']&&_0xfcdd9a['default']['gameClubButton']['show']();};_0xfcdd9a['prototype']['gameClubHide']=function(){_0xfcdd9a['default']['gameClubButton']&&_0xfcdd9a['default']['gameClubButton']['hide']();};_0xfcdd9a['prototype']['gameClubSetStyle']=function(_0x28a17a){if(!_0xfcdd9a['default']['gameClubButton'])return;_0xfcdd9a['default']['gameClubButton']['style']=Object['assign'](_0xfcdd9a['default']['gameClubButton']['style'],_0x28a17a);};_0xfcdd9a['SDKVersion']='1.7.1';_0xfcdd9a['default']={'checkLoginStatusTimer':null,'gameConfig':{},'appId':'','gameId':'','os':_0xfcdd9a['getSystemOS'](),'device_number':_0xfcdd9a['getSystemNumber'](),'device_brand':_0xfcdd9a['getSystemBrand'](),'memberId':'','roleId':'','playerId':'','userToken':'','baseUrl':'','subscribeMessageList':[],'subscribeMessageTimer':null,'gameClubButton':null};return _0xfcdd9a;}();exports['default']=zwsdk;
\ No newline at end of file
## 1. 接入说明
## 1. 接入说明
### 1.1 术语表
> | 名称 | 说明 |
> | ------------ | ----------------------------- |
> | 游戏ID | 游戏包对应的唯一值 |
> | Sign | 唯一请求签名串 |
> | secret | 每个账号唯一个的签名秘钥 |
> | Account-Code | 平台账号唯一编码 【平台提供】 |
### 1.2 请求方式 和签名
​ POST 数据结构 JSON
​ Header数据需要加验证参数 Sign, Account-Code
a. 按照key ascll 码小到大排序,
b.拼接参数 string = "key1=value1&key2=value2" string = string + "secret=weqqeew";
c. 将string 转为32 位的md5数据, stringMd5 = string.md5();
d. 截取stringMd5 第三位到第18位, 一共 16位字符串, 之后转为大写, 为Sign
注意 如果参数中传有key 是 sign secret 的数据, 则需要先过滤该数据: 比如传参数为 {"sign":"231", "time":"2032-01-01"}
参与签名的数据为 {"time":"2032-01-01"}
### 1.3 注意事项
​ a. 请求接口频次限制 一个接口相同参数一分钟只能请求一次
​ b. 总接口限制 全部接口一分钟最多请求 120 次
​ c. 请求量限制 每页数量最多只能1000 条数据
## 2. 服务端接入
### 2.1 接口
##### 请求域名
> 【HTTPS】https://zmiao.zwnet.cn/api
###### 1.角色列表接口地址 /distributor/role/roleList
请求数据
| 参数名 | 是否必传 | 类型 | 备注 |
| -------------- | -------- | ------ | ---------------------------- |
| start_time | 是 | Date | 注册开始时间 |
| end_time | 是 | Date | 注册结束时间 |
| game_id | 否 | string | 创角游戏ID逗号隔开 "23,45" |
| seq_start_time | 否 | date | 染色开始时间 |
| seq_end_time | 否 | Date | 染色结束时间 |
返回数据
| 参数名 | 是否必传 | 类型 | 备注 |
| -------------- | -------- | ------ | --------------- |
| status_code | 是 | int | 错误码 200 成功 |
| msg | 是 | string | 返回文案 |
| data | 否 | object | 返回数据 |
| data.data | 否 | List | 列表数据 |
| Data.page_info | 否 | Object | 分页信息 |
​ Data.data 列表数据
| 参数名 | 是否必传 | 类型 | 备注 |
| ----------------- | -------- | -------- | --------------- |
| cp_role_id | 是 | string | cp角色ID |
| username | 是 | string | 账号 |
| channel_key | 是 | string | 渠道ID |
| distributor_id | 是 | int | 分销方ID |
| seq_time | 是 | datetime | 染色时间 |
| server_name | 是 | string | 原始区服 |
| role_name | 是 | string | 角色名称 |
| recharge_total | 是 | string | 充值金额 单位元 |
| combat_num | 是 | string | 战力 |
| role_level | 是 | string | 等级 |
| os | 是 | string | 操作系统 |
| create_time | 是 | Datetime | 创角时间 |
| last_login_time | 是 | Datetime | 最后活跃时间 |
| game_id | 是 | int | 创角游戏ID |
| main_game_id | 是 | string | 创角主游戏ID |
| channel_name | 是 | string | 渠道名称 |
| merge_server_name | 是 | string | 合服区服名 |
| distributor_name | 是 | string | 分销方名 |
| game_name | 是 | string | 创角游戏名 |
| main_game_name | 是 | string | 创角主游戏名 |
Data.page_info 分页数据
| 参数名 | 是否必传 | 类型 | 备注 |
| --------- | -------- | ---- | -------- |
| total | 是 | int | 总数 |
| page | 是 | int | 页码 |
| page_size | 是 | int | 每页数量 |
###### 2.账号列表接口地址 /distributor/member/memberList
请求数据
| 参数名 | 是否必传 | 类型 | 备注 |
| -------------- | -------- | ------ | ---------------------------- |
| start_time | 是 | Date | 注册开始时间 |
| end_time | 是 | Date | 注册结束时间 |
| game_id | 否 | string | 注册游戏ID逗号隔开 "23,45" |
| seq_start_time | 否 | date | 染色开始时间 |
| seq_end_time | 否 | Date | 染色结束时间 |
返回数据
| 参数名 | 是否必传 | 类型 | 备注 |
| -------------- | -------- | ------ | --------------- |
| status_code | 是 | int | 错误码 200 成功 |
| msg | 是 | string | 返回文案 |
| data | 否 | object | 返回数据 |
| data.data | 否 | List | 列表数据 |
| Data.page_info | 否 | Object | 分页信息 |
​ Data.data 列表数据
| 参数名 | 是否必传 | 类型 | 备注 |
| ---------------- | -------- | -------- | --------------- |
| username | 是 | string | 账号 |
| channel_key | 是 | string | 渠道ID |
| distributor_id | 是 | int | 分销方ID |
| seq_time | 是 | datetime | 染色时间 |
| reg_time | 是 | datetime | 注册时间 |
| recharge_total | 是 | string | 充值金额 单位元 |
| last_login_os | 是 | string | 登录系统 |
| game_id | 是 | int | 注册游戏ID |
| main_game_id | 是 | int | 注册主游戏ID |
| channel_name | 是 | string | 渠道名称 |
| distributor_name | 是 | string | 分销方名 |
| game_name | 是 | string | 注册游戏名 |
| main_game_name | 是 | string | 注册主游戏名 |
Data.page_info 分页数据
| 参数名 | 是否必传 | 类型 | 备注 |
| --------- | -------- | ---- | -------- |
| total | 是 | int | 总数 |
| page | 是 | int | 页码 |
| page_size | 是 | int | 每页数量 |
###### 3.订单列表接口地址 /distributor/order/orderList
请求数据
| 参数名 | 是否必传 | 类型 | 备注 |
| -------------- | -------- | ------ | ---------------------------- |
| start_time | 是 | Date | 注册开始时间 |
| end_time | 是 | Date | 注册结束时间 |
| game_id | 否 | string | 充值游戏ID逗号隔开 "23,45" |
| seq_start_time | 否 | date | 染色开始时间 |
| seq_end_time | 否 | Date | 染色结束时间 |
返回数据
| 参数名 | 是否必传 | 类型 | 备注 |
| -------------- | -------- | ------ | --------------- |
| status_code | 是 | int | 错误码 200 成功 |
| msg | 是 | string | 返回文案 |
| data | 否 | object | 返回数据 |
| data.data | 否 | List | 列表数据 |
| Data.page_info | 否 | Object | 分页信息 |
​ Data.data 列表数据
| 参数名 | 是否必传 | 类型 | 备注 |
| ---------------- | -------- | -------- | ----------------------- |
| username | 是 | string | 账号 |
| channel_key | 是 | string | 渠道ID |
| distributor_id | 是 | int | 分销方ID |
| seq_time | 是 | datetime | 染色时间 |
| order_time | 是 | datetime | 下单时间 |
| pay_time | 是 | datetime | 支付完成时间 |
| amount | 是 | string | 订单金额 单位元 |
| game_id | 是 | int | 充值游戏ID |
| main_game_id | 是 | int | 充值主游戏ID |
| channel_name | 是 | string | 渠道名称 |
| distributor_name | 是 | string | 分销方名 |
| game_name | 是 | string | 充值游戏名 (充值马甲包) |
| main_game_name | 是 | string | 充值主游戏名 |
| status | 是 | string | 支付状态 |
| pay_type | 是 | string | 充值方式 |
| order_id | 是 | string | 订单号 |
| server_name | 是 | string | 区服名 |
| server_id | 是 | string | 区服ID |
| cp_role_id | 是 | string | cp角色ID |
| role_name | 是 | string | 角色名称 |
Data.page_info 分页数据
| 参数名 | 是否必传 | 类型 | 备注 |
| --------- | -------- | ---- | -------- |
| total | 是 | int | 总数 |
| page | 是 | int | 页码 |
| page_size | 是 | int | 每页数量 |
###### 4.订单列表接口地址 /distributor/game/gameList
请求数据
| 参数名 | 是否必传 | 类型 | 备注 |
| ------ | -------- | ---- | ---- |
| | | | |
返回数据
| 参数名 | 是否必传 | 类型 | 备注 |
| ------------------- | -------- | ------ | --------------- |
| status_code | 是 | int | 错误码 200 成功 |
| msg | 是 | string | 返回文案 |
| data | 否 | List | 列表数据 |
​ Data 列表数据
| 参数名 | 是否必传 | 类型 | 备注 |
| ------ | -------- | ------ | ------ |
| name | 是 | string | 游戏ID |
| id | 是 | int | 游戏名 |
### 2.2 请求示例
```shell
请求示例
curl --location --request POST 'onezhangmiao.com:8081/distributor/role/roleList' \
--header 'Account-Code: hfc1Z_OACy4=' \
--header 'Sign: 30696201debadda2c687675cace397bd' \
--header 'Content-Type: application/json' \
--data-raw '{
"start_time":"2023-06-14",
"end_time":"2023-06-14",
"game_id":"288,360",
"seq_start_time":"",
"page_size":1
}'
json :
{
"start_time":"2023-06-14",
"end_time":"2023-06-14",
"game_id":"288,360",
"seq_start_time":"",
"page_size":1
}
返回示例:
{
"status_code": 200,
"msg": "查询成功",
"data": {
"data": [
{
"role_id": "40037967",
"cp_role_id": "73679790576496644",
"member_id": "77242308",
"channel_key": "zyou69933",
"distributor_id": 10,
"seq_time": "2023-06-14 19:22:39",
"server_name": "天命375区",
"zyou_server_id": "35_41_1r_1475",
"role_name": "商朝凉心",
"recharge_total": "0.00",
"combat_num": "110",
"role_level": 78,
"os": "android",
"create_time": "2023-06-14 23:59:58",
"last_login_time": "2023-06-15 00:04:02",
"game_id": 288,
"main_game_id": 35,
"channel_name": "爆靓-传奇龙神-安卓",
"merge_server_name": "",
"distributor_name": "爆靓",
"game_name": "领主-官包",
"main_game_name": "古惑仔"
}
],
"page_info": {
"total": 751,
"page": 1,
"page_size": 1
}
},
"extra": {}
}
```
### 2.3 签名规则示例
> **签名秘钥**
>
> 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>
##### 签名示例
```php
<php?
$gameSecret = "game_secret";
$params = ["player_id" => 1245, "game_id" => 14];
$signStr = '';
ksort($params, SORT_REGULAR);
foreach ($params as $key => $val) {
$signStr .= $key . '=' . $val . '&';
}
$signStr .= 'secret=' . $gameSecret;
return strtoupper(substr(md5($signStr), 2, 16));
```
# 服务端接口说明-v1.0.1
# 服务端接口说明-v1.0.2
# 服务端接口说明-v1.0.1
# 服务端接口说明-v1.0.2
### 目录
......@@ -178,22 +178,21 @@
> | type | true | Int | 1 | 游戏角色操作环境,1:H5网页端,2:小游戏端,3:Android游戏 4:ios |
> | os | false | String | - | 操作系统 |
> | role | true | Object | - | 角色信息 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | String | 0 | 角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;online_time | false | String | 0 | 本次在线时长 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | String | - | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | String | 0 | 角色VIP等级 |
> | &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;attack | false | Int | 0 | 攻击力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;profession | false | String | - | 职业 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trans_level | false | Int | 0 | 转生等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sponsor_level | false | Int | 0 | 赞助等级/会员等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reiki_num | false | Int | 0 | 角色灵符值 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equipment_no | false | Int | "" | 登录设备唯一值 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event | true | String | - | 事件类型 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_id | true | String | - | 区服ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name | true | String | - | 区服名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_role_id | true | String | - | 游戏方角色ID |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_name | true | String | - | 游戏角色名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_level | true | Int | - | 角色等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp_account | false | String | - | cp账号 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role_vip | false | Int | 0 | 角色VIP等级 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combat_num | false | Int | 0 | 角色战力 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;profession | false | String | - | 职业 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gang_name | false | String | - | 帮会(行会)名称 |
> | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trans_level | false | Int | 0 | 转生等级 |
> | sign | true | String | - | 签名 |
##### 返回参数
......@@ -320,6 +319,97 @@
> | &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:不允许创角 |
``
### 3.1 聊天记录
##### 接口说明
server/chat/report
>
##### 请求参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ---- |
> | Content-Type | true | application/json | |
> **Body:**
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :----------------------------------------------------------- | :---- | :----- | :----- | :--------------------------------------------------------- |
> | 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 | - | 操作系统 |
> | chat_type | true | String | - | 聊天类型1 当前 2 队伍 3 帮派/工会 4 . 世界 5. 谣言 6 . 系统 7. 好友 8.其他 9 .私聊|
> | role_name | true | String | - | 角色名称 |
> | content | true | String | - | 聊天内容 |
> | action_time | true | dateTime | - | 发言时间 2023-05-01 12:23:44 |
> | server_name | true | String | - | 区服名称 |
> | server_id | true | string | - | 区服ID |
> | cp_role_id | true | string | - | 角色ID |
> | cp_account | rue | string | - | cp 账号信息 |
> | target_cp_account | False | String | | 对方账号 |
> | target_cp_role_id | False | String | | 对方角色IP |
> | target_player_id | False | Int | | 对方返回player_id |
> | target_role_name | False | String | | 对方角色名 |
> | last_ip | False | String | | 历史IP |
> | current_ip | False | String | | 当前IP |
> | sign | true | String | - | 签名 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | | | | |
### 3.2. 地图记录
##### 接口说明
server/map/report
>
##### 请求参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ---- |
> | Content-Type | true | application/json | |
> **Body:**
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :-------------- | :---- | :------- | :----- | :----------------------------------------------------------- |
> | 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 | - | 操作系统 |
> | role_name | true | String | - | 角色名称 |
> | last_map_name | true | String | - | 原地图 |
> | target_map_name | True | String | - | 新地图 |
> | action_time | true | dateTime | - | 切换时间 2023-05-01 12:23:44 |
> | server_name | true | String | - | 区服名称 |
> | server_id | true | string | - | 区服ID |
> | cp_role_id | true | string | - | 角色ID |
> | cp_account | rue | string | - | cp 账号信息 |
> | sign | true | String | - | 签名 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | | | | |
##### 请求示例
```php
......
v1.0
v1.0
## 封禁玩家模块接口
打通掌游和游戏之间,账号违规管理: 封账号 封角色 禁言
### 请求方式
1. POST 数据结构 JSON
2. Header数据需要加验证参数 Authorization
3. Authorization 将请求数据,
a. 按照key ascll 码小到大排序,
b.拼接参数 string = "key1=value1&key2=value2"
c. 将string 转为32 位的md5数据, stringMd5 = string.md5();
d. 截取stringMd5 第二位到第17位, 一共 16位字符串, 之后转为大写, 为Authorization
#### 1. 禁言角色接口
请求数据
| 字段 | 是否必传 | 字段类型 | | |
| ---------------- | -------- | -------- | ----------------------------------------- | ---- |
| banned_type | 是 | int | 封禁方式 : 1 禁言角色 3 静默禁言 | |
| banned_time_type | 是 | Int | 封禁时间类型 : 1 小时 2 天 3 永久封禁 | |
| banned_time | 是 | Int | 封禁时间值: 例如 1 0 | |
| cp_role_id | 是 | String | 角色ID | |
| server_id | 是 | String | 角色注册区服ID | |
| game_id | 否 | int | 创角游戏ID | |
| zw_number | 是 | int | 1 2 3 4 例如掌玩1 | |
| player_id | 是 | string | 登录账号返回信息 唯一信息 确定账号 | |
返回数据
| | 是否必要 | 字段类型 | |
| ---- | -------- | -------- | --------------------- |
| code | 是 | int | 1 成功 2 失败 |
| msg | 是 | string | 返回信息 : 封禁成功 |
#### 2.解封角色禁言接口
​ 请求数据
| 字段 | 是否必传 | 字段类型 | | |
| ----------- | -------- | -------- | ----------------------------------------- | ---- |
| cp_role_id | 是 | String | 角色ID | |
| game_id | 否 | int | 创角游戏ID | |
| zw_number | 是 | int | 1 2 3 4 例如掌玩1 | |
| banned_type | 是 | int | 封禁方式 : 1 禁言角色 3 静默禁言 | |
| server_id | 是 | String | 角色注册区服ID | |
| player_id | 是 | string | 登录账号返回信息 唯一信息 确定账号 | |
返回数据
| | 是否必要 | 字段类型 | |
| ---- | -------- | -------- | ----------------------------- |
| code | 是 | int | 1 成功 2 失败 |
| msg | 是 | string | 返回信息 : 解封角色禁言成功 |
#### 3.封角色、 账号 接口
请求数据
| 字段 | 是否必传 | 字段类型 | | |
| ----------- | -------- | -------- | ------------------------------------ | ---- |
| cp_role_id | 是 | String | 角色ID | |
| banned_type | 是 | int | 1 封角色 2 封账号 默认封角色 | |
| server_id | 是 | String | 角色注册区服ID | |
| game_id | 否 | int | 创角游戏ID | |
| zw_number | 是 | int | 1 2 3 4 例如掌玩1 | |
| player_id | 是 | string | 登录账号返回信息 唯一信息 确定账号 | |
返回数据
| | 是否必要 | 字段类型 | |
| ---- | -------- | -------- | ------------------------- |
| code | 是 | int | 1 成功 2 失败 |
| msg | 是 | string | 返回信息 : 封禁角色成功 |
#### 4.解封角色、 账号 接口
​ 请求数据
| 字段 | 是否必传 | 字段类型 | | |
| ----------- | -------- | -------- | ------------------------------------ | ---- |
| cp_role_id | 是 | String | 角色ID | |
| banned_type | 是 | int | 1 封角色 2 封账号 默认封角色 | |
| game_id | 否 | int | 创角游戏ID | |
| zw_number | 是 | int | 1 2 3 4 例如掌玩1 | |
| server_id | 是 | String | 角色注册区服ID | |
| player_id | 是 | string | 登录账号返回信息 唯一信息 确定账号 | |
返回数据
| | 是否必要 | 字段类型 | |
| ---- | -------- | -------- | ------------------------- |
| code | 是 | int | 1 成功 2 失败 |
| msg | 是 | string | 返回信息 : 解封角色成功 |
\ No newline at end of file
v1.0
v1.0
## 聊天记录风控接口
接受风控数据
### 请求方式
1. POST 数据结构 JSON
2. Header数据需要加验证参数 Authorization
3. Authorization 将请求数据,
a. 按照key ascll 码小到大排序,
b.拼接参数 string = "key1=value1&key2=value2" + secert;
c. 将string 转为32 位的md5数据, stringMd5 = string.md5();
d. 截取stringMd5 第二位到第17位, 一共 16位字符串, 之后转为大写, 为Authorization
#### 1. 聊天记录风控接口
/api/server/chat/rickReport
请求数据
| 字段 | 是否必传 | 字段类型 | | |
| ---------------- | -------- | -------- | ----------------------------------------- | ---- |
| main_game_name | 是 | String | 主游戏名称 | |
| cp_role_id | 是 | String | 角色ID | |
| server_id | 是 | String | 区服ID | |
| cp_account | 是 | String | 用户ID | |
| action_time | 是 | dateTime | 发送时间 | |
| content | 是 | String | 聊天内容 | |
| context | 否 | String | 上下文检索 | |
| risk_text | 否 | String | 风控类型 | |
| handle_text | 否 | String | 处理结果 | |
返回数据
| | 是否必要 | 字段类型 | |
| ---- | -------- | -------- | --------------------- |
| code | 是 | int | 1 成功 2 失败 |
| msg | 是 | string | 返回信息 : 处理成功 |
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论