提交 4da571ca 作者: 闫永超

合并分支 'release' 到 'master'

海外接口文档

查看合并请求 zwwl/zw_game_sdk!123
No preview for this file type
# Android SDK 对接文档-v1.0
# Android SDK 对接文档-v1.0
### 目录
1.[接入说明](#sec1)
    1.1 [术语表](#sec1.1)
    1.2 [数据字典](#sec1.2)
    1.3 [SDK登录](#sec1.3)
    1.4[下单逻辑](#sec1.4)
2.[Android SDK 接入](#sec2)
    2.1 [配置导入 Android SDK](#sec2.1)
        说明
        SDK 地址
        必要参数
        导入示例
    2.2 [Android SDK 初始化](#sec2.2)
        配置游戏game_id
    2.3 [登录](#sec2.3)
        说明
        登录
        退出登录
        示例
    2.4 [SDK 游戏下单支付](#sec2.4)
        说明
        调用方式
        请求参数
        返回参数
        示例
    2.5 [SDK 角色上报](#sec2.5)
        接口说明
        调用方式
        请求参数
        返回参数
        示例
## 1. 接入说明<a name="sec1"></a>
### 1.1 术语表<a name="sec1.1"></a>
> | 名称 | 说明 |
> | ----------- | --------------------------------------------------------------------------------------------------- |
> | CP | 游戏研发商。 |
> | Android_SDK | 由平台方提供给游戏研发商,用于游戏客户端接入平台登录,支付。 |
> | SDK 服务 | 由平台方开发,用于完成 SDK 的登录,支付流程,承接游戏服务端的数据。 |
> | 游戏服务 | 游戏研发商开发,为游戏提供服务。 |
> | 游戏客户端 | 游戏研发方商开发的网页版游戏。 |
> | 支付服务 | 由平台方调用支付服务,Google等 |
### 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>
##### 说明
> 游戏客户端通过引入外部 Maven方式或者aar包
##### SDK 依赖地址
> implementation 'com.zwwl.legend.sdk:legend:1.0.0'
##### 必要参数
> | 参数 | 说明 |
> | ----------- | ---------------------------------- |
> | game_id | 游戏唯一标识,由平台方提供 |
> | main_game_id | 主游戏唯一标识,由平台方提供 |
##### 导入示例
1.1、在主工程目录下build.gradle中的 (如遇到拉取不到仓库可使用阿里云代理):
```
maven { url 'https://maven.aliyun.com/repository/jcenter' }
```
> ```
allprojects{
repositories{
maven { url 'http://nexus.zwwlkj01.top/repository/Android/' }
}
}
> ```
1.2、在APP子工程中build.gradle中添加依赖地址
```
implementation 'com.zwwl.legend.sdk:legend:1.0.0'
```
### 2.2 Android SDK 初始化<a name="sec2.2"></a>
在主工程MainActivity中初始化init方法
```
/***
init方法参数1、当前工程上下文、2游戏game_id(可为空,但是在AndroidManifest.xml中必须设置)3、statue渠道号(可为空、作为拓展参数使用)
*/
GameService.getInstance().init(this,"1","")
```
### 配置游戏game_id
在主工程AndroidManifest.xml清单文件中配置Meta参数,name值:game_id、value值:即平台游戏ID
```
<meta-data
android:name="game_id"
android:value="必须"/>
<meta-data
android:name="main_game_id"
android:value="必须"/>
```
### 2.3 登录<a name="sec2.3"></a>
```
GameService.getInstance().showLogin(object : OnLoginListener<Any?> {
override fun loginSuccess(data: Any?) {
}
override fun loginError(data: Any?) {}
})
```
### 退出
```
GameService.getInstance().loginOut(object:InitZyCallback{
override fun onSuccess(status: String?) {
}
override fun onFailed(o: String?) {
}
})
```
### 2.4下单方法<a name="sec2.4"></a>
```
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?) {
}
override fun onFailure(msg: String?) {
}
})
}
```
调用支付方法时请在Activity中的生命周期onDestroy方法中调用GameService.getInstance().onDestroy()
```
override fun onDestroy() {
super.onDestroy()
GameService.getInstance().onDestroy()
}
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :------------------------------------------------------------ | :---- | :----- | :------- | :--------------------------------------------------------------------------------------------------- |
> | 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,可用于订单状态查询 |
### 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()
}
override fun onFailure(msg: String?) {
}
})
}
```
##### 请求参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :---------------------------------------------------------- | :---- | :----- | :----- | :---------------------- |
> | 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 | 转生等级 |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
##### EVENT 枚举
> | EVENT | 说明 |
> | -------- | -------- |
> | create | 创建角色 |
> | online | 角色上线 |
> | offline | 角色下线 |
> | level_up | 角色升级 |
> | delete | 删除角色 |
> | recharge | 角色充值 |
> | other | 其他 |
#### 服务端登录验证接口<a name="sec10"></a>
## 服务端接口 调用方直接使用http 调用接口:
### 接口地址
> 【POST】 /ios_sdk/auth/checkLogin
##### 请求参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ----------------------------------- |
> | Content-Type | true | application/json | |
> | User-Token | true | | 登录后由 SDK 返回的user_token |
> **Body**:
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | --------- | ---- | ------ | ------ | ---------------------------------- |
> | game_id | true | Int | - | 从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-overseas.hznets.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, $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 , 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;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 [角色上报](#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;8 [退出登录](#sec9)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[调用示例](#sec9.1)
&nbsp;&nbsp;&nbsp;&nbsp;9 [服务端登录验证接口](#sec10)
#### 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 | 游戏唯一标识,由平台方提供 |
| main_game_id | 主游戏id,由平台方提供 |
| GIDClientID | 谷歌客户端id,由平台方提供 |
| googleScheme | 谷歌iOS 网址架构,由平台方提供 |
|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; 3.2.1 将ZYouSDKFramework-iOS文件夹直接添加进工程,ZYouSDKFramework-iOS 文件夹中包含ZYouSDK,ZYSDKConfig,ZYouBundle,zyLocalizable.strings,ZYouTool.h ZYouTool.m
&nbsp;&nbsp;&nbsp;&nbsp; 3.2.2 此sdk依赖GoogleSignIn、Facebook、APPsFlyerLib,通过 project - package dependencies 添加
&nbsp;&nbsp;&nbsp;&nbsp; 3.2.3 添加 GoogleSignIn 搜索 https://github.com/google/GoogleSignIn-iOS 进行添加
![ios_overseas1.png](https://zyapk.zwnet.cn/ios_overseas/ios_overseas1.png)
&nbsp;&nbsp;&nbsp;&nbsp; 3.2.4 添加 Facebook 搜索 https://github.com/facebook/facebook-ios-sdk 进行添加
![ios_overseas2.png](https://zyapk.zwnet.cn/ios_overseas/ios_overseas2.png)
&nbsp;&nbsp;&nbsp;&nbsp; 3.2.5 添加 APPsFlyerLib 搜索 https://github.com/AppsFlyerSDK/AppsFlyerFramework 进行添加
![ios_overseas3.png](https://zyapk.zwnet.cn/ios_overseas/ios_overseas3.png)
&nbsp;&nbsp; 3.3、添加依赖 TARGETS -> Build Phases -> Link Binary With Libraries 下添加 libsqlite3.tbd
&nbsp;&nbsp; 3.4 TARGETS点击项目名称,点击 Info 选项卡,添加NSUserTrackingUsageDescription权限 配置文案如(是否允许xx使用您的IDFA信息,以此来优化您的使用体验)
&nbsp;&nbsp; 3.5、添加IAP 和 苹果登录
&nbsp;&nbsp; 在TARGETS - Signing & Capabilities 下添加In-App Purchase 和 Sign in with Apple
&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下添加以下白名单
```
fbapi
fb-messenger-share-api
```
![ios_overseas4.png](https://zyapk.zwnet.cn/ios_overseas/ios_overseas4.png)
&nbsp;&nbsp; 3.8、在Build Settings - Other Linker Flags里面加入-ObjC参数
![example3.png](https://zhangsheng-1300623068.cos.ap-guangzhou.myqcloud.com/example3.png)
&nbsp;&nbsp; 3.9、根据提供的参数在 info.plist 配置 URL types 和 GIDClientID 如图,URL types配置URL Schemes 为googleScheme
![ios_overseas5.png](https://zyapk.zwnet.cn/ios_overseas/ios_overseas5.png)
![ios_overseas6.png](https://zyapk.zwnet.cn/ios_overseas/ios_overseas6.png)
### 4、初始化SDK<a name="sec4"></a>
app启动时调用注册sdk 在AppDelegate文件中#import "ZYouTool.h"
```
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//此注册方法需要在游戏初始化之前调用
[ZYouTool registerGameWithApplication:application options:launchOptions];
return YES;
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
return [ZYouTool application:app openURL:url options:options];
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[ZYouTool applicationDidBecomeActive:application];
}
```
### 5、登录<a name="sec5"></a>
登录方法<a name="sec6.1"></a>
```
- (void)zy_loginViewSuccessBlock:(void(^)(id responseObject))successBlock failureBlock:(void(^)(NSString *error))failureBlock;
```
- 说明:调出登录页面登录成功返回token
- 需游戏服务端调用登录验证之后,才能进入游戏
> **登录成功返回参数**:
| 参数 | 类型 | 说明 |
| :-------- | -------------: | -------------: |
| 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>
引入 #import "ZYGoogleLogin.h" 文件
```
//调用登录方法
[[ZYouManager shareInstance]zy_loginViewSuccessBlock:^(id _Nonnull responseObject) {
//登录成功返回信息
//此处可以调用服务端登录验证
} failureBlock:^(NSString * _Nonnull error) {
}];
```
### 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="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等级
@"cp_account":@"7", //cp账号
@"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>
| 参数 | 必选 | 类型 | 默认值 | 说明 |
| :----------------------------------------------------------- | :---- | :----- | :----- | :---------------- |
| 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 | 其他 |
### 8、退出登录<a name="sec9"></a>
```
//退出登录
//带有二次确定退出
- (void)zy_loginoutAlertSuccessBlock:(void(^)(void))successBlock failureBlock:(void(^)(NSString *error))failureBlock
```
#### 调用示例<a name="sec9.1"></a>
```
[[ZYouManager shareInstance]zy_loginoutAlertSuccessBlock:^(id _Nonnull responseObject) {
} failureBlock:^(NSString * _Nonnull error) {
}];
```
- 说明:退出游戏时需要cp端主动调用退出页面
#### 服务端登录验证接口<a name="sec10"></a>
## 服务端接口 调用方直接使用http 调用接口:
### 接口地址
> 【POST】 /ios_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-overseas.hznets.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);
}
```
# 服务端接口说明-v1.0.0
# 服务端接口说明-v1.0.0
### 目录
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 的登录,支付流程,承接游戏服务端的数据。 |
> | 游戏服务 | 游戏研发商开发,为游戏提供服务。 |
> | 安卓游戏 | 游戏研发方商开发的安卓游戏。 |
> | iOS游戏 | 游戏研发商开发的iOS游戏一般情况系与安卓同游同服 |
> | 支付服务 | 由平台方调用支付服务,包括google apple 支付等 |
### 1.2 数据字典<a name="sec1.2"></a>
> | 名称 | 说明 |
> | ----------- | ------------------------------------------------- |
> | player_id | 用户在平台的一个游戏中的唯一标识。 |
> | user_token | 用户在平台登录的会话标识。 |
> | main_game_id| 游戏在平台的父级唯一标识。 |
> | 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】https://zyou-overseas.hznets.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/report
##### 请求参数
> **Headers**:
>
> | 参数 | 必选 | 参数值 | 说明 |
> | ------------ | ---- | ---------------- | ---- |
> | Content-Type | true | application/json | |
> **Body:**
>
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | :----------------------------------------------------------- | :---- | :----- | :----- | :--------------------------------------------------------- |
> | main_game_id | true | Int | - | 掌游提供的父级唯一标识 |
> | player_id | true | Int | - | 游戏登录后由 SDK 返回的player_id |
> | os | false | String | - | 操作系统 |
> | sign | true | String | - | 签名 |
> | 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;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 | 转生等级 |
> | device_brand | false | String | - | 设备品牌 |
> | device_number | false | String | - | 设备型号 |
> | deviceId | false | String | - | 设备id |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | | | | |
##### EVENT枚举
> | EVENT | 说明 |
> | -------- | -------- |
> | create | 创建角色 |
> | online | 角色上线 |
> | offline | 角色下线 |
> | level_up | 角色升级 |
> | delete | 删除角色 |
> | recharge | 角色充值 |
> | other | 其他 |
##### 请求示例
```php
<php?
public function report(){
$host = 'https://zyou.wozhangwan.com/api';
$checkLoginUrl = '/mini_sdk/role/severReport';
$url = $host.$checkLoginUrl;
$gameSecret = "game_secret";
$body = ["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" => "角色名称",//游戏角色名称
"role_level" => "11",//角色等级
"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>
##### 接口说明
> 需要游戏服务端完成该接口,接收平台充值成功的信息。
##### 接口地址
> 【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 | - | 游戏接入登录返回的用户唯一标识 |
> | sign | true | String | - | 签名(签名规则参照 2.1 签名规则,签名的 key 由 SDK 提供) |
##### 返回参数
> | 参数 | 必选 | 类型 | 默认值 | 说明 |
> | ----------- | ---- | ------ | ------ | -------- |
> | status_code | true | Int | - | 状态码 |
> | msg | true | STRING | - | 返回信息 |
> | data | | | | |
##### 注意
> 通知使用的参数格式均为字符串(String) 返回status_code = 1 为成功, 否则会重复通知三次
##### 请求示例
```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();
```
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论