Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
zw_game_sdk
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
CI / CD
CI / CD
流水线
日程表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
提交
问题看板
Open sidebar
zwwl
zw_game_sdk
Commits
54958e44
提交
54958e44
authored
4月 11, 2024
作者:
刘添
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
应用宝游戏联运Android文档更新
上级
8156344a
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
713 行增加
和
0 行删除
+713
-0
ApiGameSdk.zip
Android游戏SDK示例/ApiGameSdk.zip
+0
-0
应用宝Android技术对接文档.md
应用宝Android技术对接文档.md
+713
-0
没有找到文件。
Android游戏SDK示例/ApiGameSdk.zip
0 → 100644
浏览文件 @
54958e44
File added
应用宝Android技术对接文档.md
0 → 100644
浏览文件 @
54958e44
## GameSDKV1.0文档接入使用
## GameSDKV1.0文档接入使用
[
目录
](
#sec1
)
1
[
对接说明
](
#sec1
)
2
[
获取对接SDK
](
#sec2
)
[
说明
](
#sec2.1
)
3
[
导入配置SDK资源AndroidStudio
](
#sec3
)
[
添加依赖
](
#sec3.1
)
[
maven配置
](
#sec3.2
)
[
示例
](
#sec3.2
)
4
[
配置清单文件
](
#sec4
)
[
清单配置说明
](
#sec4.1
)
5
[
初始化 SDK
](
#sec5
)
[
SDK调用说明
](
#sec5.1
)
[
application
](
#sec5.2
)
[
调用示例
](
#sec5.3
)
6
[
登录
](
#sec6
)
[
接口说明
](
#sec6.1
)
[
参数说明
](
#sec6.2
)
[
调用示例
](
#sec6.3
)
7
[
调起支付页面
](
#sec7
)
[
调用说明
](
#sec7.1
)
[
接口参数
](
#sec7.2
)
[
调用示例
](
#sec7.3
)
[
下单支付字段说明
](
#sec7.4
)
8
[
支付回调结果
](
#sec8
)
[
支付文档说明
](
#sec8.1
)
9
[
角色上报
](
#sec9
)
[
调用示例
](
#sec9.1
)
[
参数字段说明
](
#sec9.2
)
10
[
退出登录
](
#sec10
)
[
接口回调说明
](
#sec10.1
)
[
退出成功
](
#sec10.3
)
[
退出失败
](
#sec10.4
)
[
调用示例
](
#sec10.5
)
11
[
退出应用
](
#sec11
)
[
调用方法
](
#sec11.1
)
[
调用示例
](
#sec11.1
)
12
[
gradle依赖
](
#sec12
)
13
[
apk打包
](
#sec13
)
[
混淆说明
](
#sec13.1
)
[
打包说明
](
#sec13.2
)
14
[
服务端接口说明
](
#sec14
)
#### 一、对接说明 <a name="sec1"></a>
1、对接掌玩游戏SDK(应用宝)联运游戏使用技术文档说明
2、对接群中获取对应游戏参数、如:game_id、key、游戏名称、icon、SDK版本等
3、开发者工具要求、开发工具:要求使用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
4、SDK语言(Java、kotlin)混合开发、游戏版号、对应掌玩游戏指定包名、
无unity对接
### 二、对接SDK<a name="sec2"></a>
从平台处获取对接SDK,android studio版本,选择技术人员给的指定的版本接入。
<a
name=
"sec2.1"
></a>
### 3、导入配置SDK资源Androidstudio项目<a name="sec3"></a>
#### 3.1、在app工程目录build.gradle中添加依赖<a name="sec3.1"></a>
```
implementation("com.zw.game.sdk:gameSDk:1.0.1")
//穿山甲广告在主工程中添加
ndk {
abiFilters 'armeabi', 'arm64-v8a', 'armeabi-v7a'
}
```
#### 3.2、在主工程中添加maven<a name="sec3.2"></a>
```
maven {
url 'https://jitpack.io'
}
mavenCentral()
jcenter()
//掌玩SDK
maven { url 'http://nexus.zwwlkj01.top/repository/ZW-YingYongBao/' }
```
#### 3.3本地ARR在gradle依赖
```
无
```
#### 示例<a name="sec3.3"></a>


### 四、配置清单文件(具体请参考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" />
```
### 五、初始化SDK<a name="sec5"></a>
1、sdk初始化操作方法,最先调用,需要在主线程调用,最好游戏主界面activity中调用。此方法的可多次调用用于获得sdk全局管理器。
<a
name=
"sec5.1"
></a>
2、调用示例:在游戏主界面activity的onCreate方法中调用
```
> **初始化示例**:<a name="sec5.3"></a>
```
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ApiSdkService.getInstance().init(this);
}
}
```
### 六、SDK登录<a name="sec6"></a>
1、添加登录回调监听<a name="sec6.1"></a>
```
public void OnLoginTencent(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 | 返回数据 |
| data | object | 用户数据 |
| player_id | String | 玩家ID |
| avatar | String | 用户头像 |
| has_identify | boolean | 是否实名 |
| user_token | strng | token |
> **登录失败**:
```
void loginError(Object data);
```
> **登录失败返回参数**:
| 参数 | 类型 | 说明 |
| :-------- | -------------: | -------------: |
| status_code | int| 状态码 |
| data| object | 返回数据 |
| msg| String| 描述信息 |
| data| object | 返回数据 |
#### 调用示例<a name="sec6.3"></a>
```
ApiSdkService.getInstance().showLogin(new OnLoginListener() {
@Override
public void loginSuccess(Object data) {
}
@Override
public void loginError(Object data) {
}
});
```
#### 退出登录方法
```
GameService.getInstance().logout(new OnLogoutListener() {
@Override
public void logoutSuccess(String s) {
}
@Override
public void logoutError(String s) {
}
});
```
### 七、调起支付页面<a name="sec7"></a>
1、调起支付页面方法<a name="sec7.1"></a>
```
public void PayTencent(CustomPayParam payParam, PlayTencentListener 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);
ApiSdkService.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 |
| 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 |
### 8、支付回调通知<a name="sec8"></a>
##### 接口说明
> 需要游戏服务端完成该接口,接收平台充值成功的信息。
##### 接口地址
> 【POST】充值结果通知地址,由 CP 方提供
##### 通知参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ---- |
> | Content-Type | true | application/json | |
> | User-Token | | | |
> **Body:**
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :------------------------------------------------------------ | :--- | :----- | :----- | :------------------------------------------------------------------------------------------------------- |
> | order | true | Object | - | 订单相关 |
> | order_id | true | String | - | 平台订单 ID |
> | cp_order_id | true | String | - | 游戏传入的外部订单号,服务器会根据这个订单号生成对应的平台订单号,<br>请保证每笔订单传入的订单号的唯一性 |
> | product_price | true | String | - | 商品单价(分) |
> | amount | true | String | | 商品总价(分) |
> | product_id | true | String | - | 商品 ID |
> | product_cnt | true | String | - | 商品数量 |
> | pay_time | true | String | - | 支付时间(时间戳,到秒) |
> | 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 | 其他 |
### 11、退出应用弹框<a name="sec10"></a>
1、添加退出回调监听
#### 调用方法<a name="sec11.1"></a>
```
public void exitApp()
```
1、退出应用程序弹出提示框。
#### 调用示例<a name="sec11.2"></a>
```
@Override
public void onBackPressed() {
ApiSdkService.getInstance().exitApp();
}
```
- 说明:onBackPressed方法调用
### 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);
}
```
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论