提交 2e17de67 作者: 刘添

回退文档

上级 29cc3037
# Android SDK 对接文档-v1.0
## GameSDKV1.0文档接入使用
# Android SDK 对接文档-v1.0
## GameSDKV1.0文档接入使用
### 目录
[目录](#sec1)
1.[接入说明](#sec1)
    1 [对接说明](#sec1)
    1.1 [术语表](#sec1.1)
    1.2 [数据字典](#sec1.2)
    2 [获取对接SDK](#sec2)
    1.4 [主动登录](#sec1.4)
               [说明](#sec2.1)
    1.5[下单逻辑](#sec1.5)
    3 [导入配置SDK资源AndroidStudio](#sec3)
               [添加依赖](#sec3.1)
2.[Android SDK 接入](#sec2)
               [maven配置](#sec3.2)
    2.1 [配置导入 Android SDK](#sec2.1)
               [示例](#sec3.2)
        说明
    4 [配置清单文件](#sec4)
        SDK 地址
               [清单配置说明](#sec4.1)
        必要参数
    5 [初始化 SDK](#sec5)
        导入示例
               [SDK调用说明](#sec5.1)
    2.2 [Android SDK 初始化](#sec2.2)
               [application](#sec5.2)
        说明
               [调用示例](#sec5.3)
        调用方式
    6 [登录](#sec6)
        示例
               [接口说明](#sec6.1)
    2.3 [登录](#sec2.3)
               [参数说明](#sec6.2)
        说明
               [调用示例](#sec6.3)
        链接参数
    7 [调起支付页面](#sec7)
        示例
               [调用说明](#sec7.1)
               [接口参数](#sec7.2)
    2.4 [SDK 游戏下单支付](#sec2.4)
               [调用示例](#sec7.3)
        说明
               [下单支付字段说明](#sec7.4)
        调用方式
    8 [支付回调结果](#sec8)
        请求参数
               [支付文档说明](#sec8.1)
        返回参数
    9 [角色上报](#sec9)
        示例
               [调用示例](#sec9.1)
    2.5 [SDK 角色上报](#sec2.5)
               [参数字段说明](#sec9.2)
        接口说明
        调用方式
        请求参数
    10 [退出登录](#sec10)
        返回参数
               [接口回调说明](#sec10.1)
        示例
               [退出成功](#sec10.3)
               [退出失败](#sec10.4)
## 1. 接入说明<a name="sec1"></a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [调用示例](#sec10.5)
### 1.1 术语表<a name="sec1.1"></a>
&nbsp;&nbsp;&nbsp;&nbsp;11 [退出应用](#sec11)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [调用方法](#sec11.1)
> | 名称 | 说明 |
> | ----------- | --------------------------------------------------------------------------------------------------- |
> | CP | 游戏研发商。 |
> | Android_SDK | 由平台方提供给游戏研发商,用于游戏客户端接入平台登录,支付。 |
> | SDK 服务 | 由平台方开发,用于完成 SDK 的登录,支付流程,承接游戏服务端的数据。 |
> | 游戏服务 | 游戏研发商开发,为游戏提供服务。 |
> | 游戏客户端 | 游戏研发方商开发的网页版游戏。 |
> | 支付服务 | 由平台方调用支付服务,Google等 |
> | 游戏盒子 | 由平台方开发的游戏总入口,可以实现游戏登陆,支付,切换等;Android 游戏以 iframe 的形式在游戏盒子中运行。 |
> | Android 游戏入口 | 由 CP 方提供,进入 Android 游戏的入口链接。 |
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [调用示例](#sec11.1)
### 1.2 数据字典<a name="sec1.2"></a>
> | 名称 | 说明 |
> | ----------- | -------------------------------------------------- |
> | player_id | 用户在平台的一个游戏中的唯一标识。 |
> | user_token | 用户在平台登录的会话标识。 |
> | game_id | 主游戏下的平台的唯一标识。 |
> | main_game_id | 主游戏在平台的唯一标识。 |
> | game_secret | 平台方提供,游戏签名秘钥。 |
> | cp_order_id | 游戏研发商订单唯一标识 |
> | order_id | 平台方订单唯一标识,与 cp_order_id 一一对应 |
>
### 1.4 主动登录<a name="sec1.4"></a>
```mermaid
sequenceDiagram
游戏客户端->>Android_SDK:调用登录
Android_SDK->>玩家:重新登录
玩家-->Android_SDK:账号密码
Android_SDK->>SDK服务:账号密码&game_id
SDK服务-->Android_SDK:player_id,user_token,game_id
Android_SDK->>Android_SDK:三方登录(google,facebook)
```
### 1.5下单逻辑
```mermaid
sequenceDiagram
玩家->>游戏客户端: 充值
游戏客户端->>Android_SDK: 订单信息
Android_SDK->>玩家:询问支付方式
玩家-->>Android_SDK:支付方式
Android_SDK->>SDK服务器:订单信息&支付方式&os
SDK服务器-->>Android_SDK:订单号&支付渠道信息
Android_SDK-->>游戏客户端:订单状态(待支付)
Android_SDK->>玩家:等待支付
玩家-->>Android_SDK:支付
Android_SDK->>支付服务:调用支付
支付服务->>SDK服务:支付结果
SDK服务->>游戏服务:支付结果
游戏服务-->>SDK服务:success/fail
游戏服务->>游戏客户端:发货通知
游戏客户端-->>玩家:发货
```
## 2. AndroidSDK 接入<a name="sec3"></a>
### 2.1 配置导入 Android SDK<a name="sec3.1"></a>
&nbsp;&nbsp;&nbsp;&nbsp;12 [gradle依赖](#sec12)
##### 说明
&nbsp;&nbsp;&nbsp;&nbsp;13 [apk打包](#sec13)
> 游戏客户端通过引入外部 Maven方式或者aar包
##### SDK 依赖地址
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[混淆说明](#sec13.1)
> implementation 'com.zwwl.legend.sdk:legend:1.0.0'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[打包说明](#sec13.2)
##### 必要参数
&nbsp;&nbsp;&nbsp;&nbsp;14 [服务端接口说明](#sec14)
> | 参数 | 说明 |
> | ----------- | ---------------------------------- |
> | game_id | 游戏唯一标识,由平台方提供 |
> | main_game_id | 主游戏唯一标识,由平台方提供 |
##### 导入示例
1.1、在主工程目录下build.gradle中的 (如遇到拉取不到仓库可使用阿里云代理):
```
maven { url 'https://maven.aliyun.com/repository/jcenter' }
```
> ```
allprojects{
#### 1、对接说明 <a name="sec1"></a>
&nbsp;&nbsp; 1.1、此对接文档只适合与sdkv1.0.52.22版本。
repositories{
maven { url 'http://nexus.zwwlkj01.top/repository/Android/' }
&nbsp;&nbsp; 1.2、所有SDK功能在GameSDK类中,可通过初始化获取改类对象,后续所有更新功能都调用这个类中方法完成
}
}
&nbsp;&nbsp; 1.3、文档中所有GameSDK指S从平台获取arr文件或者远程依赖implementation("com.zw.game.sdk:gameSDk:1.0.52.23")
> ```
1.2、在APP子工程中build.gradle中添加依赖地址
&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.25.23的版本接入。<a name="sec2.1"></a>
### 3、导入配置SDK资源Androidstudio项目<a name="sec3"></a>
#### 3.1、在app工程目录build.gradle中添加依赖<a name="sec3.1"></a>
```
implementation 'com.zwwl.legend.sdk:legend:1.0.0'
implementation("com.zw.game.sdk:gameSDk:1.0.52.23")
```
### 2.2 Android SDK 初始化<a name="sec2.2"></a>
#### 3.2、在主工程中添加maven<a name="sec3.2"></a>
在主工程MainActivity中初始化init方法
```
/***
init方法参数1、当前工程上下文、2游戏game_id(可为空,但是在AndroidManifest.xml中必须设置)3、statue渠道号(可为空、作为拓展参数使用)
*/
GameService.getInstance().init(this,"1","")
//抖音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/' }
```
### 配置游戏game_id
#### 3.3本地ARR在gradle依赖
在主工程AndroidManifest.xml清单文件中配置Meta参数,name值:game_id、value值:即平台游戏ID
```
<meta-data
```
#### 示例<a name="sec3.3"></a>
![示例1](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/android_game_png1.png)
![示例2](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/android_ganmepng2.png)
### 4、配置清单文件(具体请参考demo)<a name="sec4"></a>
1、参考demo中的清单文件配置,主要分为权限配置、sdk所需的组件配置,meta信息配置。(权限部分SDK已经适配,访问文件权限,Android10网络访问权限,安装适配等均已适配,但不包含所有设备)<a name="sec4.1"></a>
> **参数说明**:
| 参数名 | 说明 |
|:--------| -------------:|
| game_id | 游戏唯一标识,由平台方提供 |
|game_secret|服务端对接时会用到,由平台方提供|
```
<!--掌玩SDK游戏ID-->
<meta-data
android:name="game_id"
android:value="149" />
<!-- 巨量、快手、腾讯开放平台申请应用,用于转端包选择0 -->
<meta-data
android:name="app_id"
android:value="517181" />
<!--腾讯广告必填-->
<meta-data
android:name="secret"
android:value="e15a3e99760a598a55f29e99ccb5ea7b" />
android:value="1"/>
<!--快手平台申请应用名称,不是快手投放包可以选择不填写-->
<meta-data
android:name="app_name"
android:value="tlcq" />
//主游戏ID
<meta-data
android:name="main_game_id"
<!--0默认SDK,1表示巨量AD,2表示快手,3表示腾讯-->
<meta-data
android:name="app_status"
android:value="1" />
android:value="1"/>
```
### 2.3 调用登录方法<a name="sec2.3"></a>
### 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>
```
GameService.getInstance().showLogin(object : OnLoginListener<Any?> {
override fun loginSuccess(data: Any?) {
}
override fun loginError(data: Any?) {}
})
public class App extends GameSdkApplication {
@Override
public void onCreate() {
super.onCreate();
}
}
```
### 退出登录方法
> **初始化示例**:<a name="sec5.3"></a>
```
GameService.getInstance().loginOut(object:InitZyCallback{
override fun onSuccess(status: String?) {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
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 fun onFailed(o: String?) {
@Override
public void onFailed(Object o) {
showToast(o.toString());
}
});
//配置横竖屏,等一些可配置信息
ConfigInfo.allowPORTRAIT = false;
}
```
### 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需要实现两个方法:
> **登录成功**:
})
```
### 2.4下单方法<a name="sec2.4"></a>
void loginSuccess(Object data);
```
private fun googlePlay(){
val data = CustomPayParam()
val role = CustomPayParam.RoleBean()
val orderInfo = CustomPayParam.OrderBean()
role.event = "other"
role.server_id = "100001"
role.role_name = "主宰传奇"
role.cp_role_id = System.currentTimeMillis().toString() + ""
role.server_name = "主宰服"
role.role_level = "83"
role.role_vip = "0"
orderInfo.cp_order_id = System.currentTimeMillis().toString() + ""
orderInfo.amount = "100"
orderInfo.product_price = "100"
orderInfo.product_id = "1505dian" //Google后台配置商品ID
orderInfo.product_cnt = "1"
orderInfo.product_name = "1元档充值"
orderInfo.product_desc = "商品"
orderInfo.ext = "测试数据"
data.role = role
data.order = orderInfo
GameService.getInstance().googlePlay(data,object :OnPlayListener<Any>{
override fun onSuccess(t: Any?) {
> **登录成功返回参数**:
| 参数 | 类型 | 说明 |
| :-------- | -------------: | -------------: |
| 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>
```
GameService.getInstance().showLogin(new OnLoginListener() {
@Override
public void loginSuccess(Object data,String token) {
Log.e("loginSuccess",data+"");
//显示悬浮球(根据游戏需求显示,可以在初始化显示,可以登录成功之后显示)
GameService.getInstance().showBall(SdkDemoActivity.this);
}
override fun onFailure(msg: String?) {
@Override
public void loginError(Object data) {
}
})
}
});
```
#### 抖音退出登录(不上架抖音游戏可忽略此方法)
```
GameService.getInstance().outLoginDy(new OnLogoutListener() {
@Override
public void logoutSuccess(String s) {
}
@Override
public void logoutError(String s) {
}
});
```
#### 游戏中有切换登录按钮可对接switchLogin方法(上架抖音平台)
```
调用支付方法时请在Activity中的生命周期onDestroy方法中调用GameService.getInstance().onDestroy()
//处理方式可参考登录方法
GameService.getInstance().switchLogin(new OnLoginListener() {
@Override
public void loginSuccess(Object data) {
}
@Override
public void loginError(Object data) {
}
});
```
#### 悬浮球生命周期中调佣(对接抖音不需要)
```
override fun onDestroy() {
super.onDestroy()
GameService.getInstance().onDestroy()
@Override
protected void onDestroy() {
super.onDestroy();
GameService.getInstance().onDestroy(this);
}
```
### 2.5角色上报(角色上报参数字段请参考文档字段说明)<a name="sec2.5"></a>
```
private fun setRoleReporting(type:String){
val map=HashMap<String,String>()
map["attack"] = "0"
map["chapter_index"] = "0"
map["combat_num"] = "0"
map["cp_role_id"] = "0"
map["event"] = type
map["gang_name"] = "unknown"
map["main_city_level"] = "0"
map["online_time"] = "0"
map["power"] = "0"
map["profession"] = "unknown"
map["reiki_num"] = "0"
map["role_level"] = "23"
map["cp_role_id"] = "0"
map["role_name"] = "啊啊啊"
map["role_vip"] = "0"
map["server_id"] = "4433175"
map["server_name"] = "4433175"
map["sponsor_level"] = "0"
map["trans_level"] = "0"
GameService.getInstance().setRoleReporting(GsonUtils.toJson(map),"",mPayerId,object :RoleInfoCallBack<Any>{
override fun onSuccess(t: Any?) {
mTvRoleInfo.text=t.toString()
### 7、调起支付页面<a name="sec7"></a>
}
1、调起支付页面方法<a name="sec7.1"></a>
override fun onFailure(msg: String?) {
```
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_level("83");
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);
GameService.getInstance().showPay(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 |
......@@ -330,4 +482,383 @@ private fun googlePlay(){
| role_id | string | 必须 |0| 角色ID |
### 8、支付回调通知<a name="sec8"></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>
#### 调用示例<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.setRole_level("15"); //角色等级
roleInfo.setRole_vip("23");//角色VIP等级
roleInfo.setCp_account("23");//cp账号
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>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :----------- |
> | 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 | 其他 |
### 10、退出登录<a name="sec9"></a>
#### 添加登出回调监听<a name="sec10.1"></a>
```
public void outLoginDy(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>
```
GameService.getInstance().outLoginDy(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()
```
1、退出应用程序弹出提示框。
#### 调用示例<a name="sec11.2"></a>
```
@Override
public void onBackPressed() {
GameService.getInstance().exitApp();
}
```
- 说明: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 调用接口:<a name="sec14">
### 接口地址
> 【POST】 /android_sdk/auth/checkLogin
##### 请求参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ----------------------------------- |
> | Content-Type | true | application/json | |
> | User-Token | true | | 登录后由 SDK 返回的user_token |
> **Body**:
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | --------- | ---- | ------ | ------ | ---------------------------------- |
> | game_id | true | Int | - | 游戏接入时分配的游戏ID(建议从user_token中取,#后面的数字即为game_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
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论