海外游戏服务端对接指南
此文档为服务端相关对接文档。
1. 服务端集成指南
【1. 服务端集成指南】此模块为对接了客户端SDK(安卓和iOS)的游戏需要对接的服务端接口。
1.1 登录认证
客户端登录成功之后,U8Server返回userID和token等数据,客户端需要将该参数告诉游戏服务器,游戏服务器拿着这些参数,去U8Server进行一次登录认证。
登录认证地址:https://apihk.sy.faxing.ledu.com/user/verifyAccount
请求方式:POST或者GET
参数:
userID:上面登录认证成功之后,U8Server返回的userID
token:上面登录认证成功之后,U8Server返回的token
sign:md5("userID="+userID+"token="+token+appSecret);这里游戏服务器按照格式生成一个md5串(32位小写),appSecret是U8Server创建游戏时,生成的AppSecret
返回(JSON格式):
{
state: 1 , //(登录认证成功);其他失败
data: //认证成功才有数据,否则为空
{
userID:1234 , //U8Server生成的唯一用户ID
username:"12345", //U8Server生成的统一格式的用户名
sdkUserID:"123456" , //渠道的唯一标识
sdkUserName:"1234567", //渠道的用户名,可能为空
channelID:2011 //渠道号
}
}
1.2 支付回调
当U8Server收到渠道SDK支付回调,并处理成功时,我们会调用游戏服的支付回调地址,通知游戏服给玩家发货。这个回调的地址,客户端在调用支付接口的时候, 通过payNotifyUrl字段传入。客户端不传的话,可以在U8Server后台配置。优先使用客户端传入。
请求地址:游戏服接收请求的http地址,客户端支付的时候,传入。
请求方式:POST
参数格式:application/json
请求参数(JSON格式):
{
state: 1, //状态,1:成功;其他失败
data:{
productID:商品ID
orderID: 订单号
userID: 用户ID
channelID: 渠道ID
gameID: 游戏ID
serverID:游戏服务器ID
money:充值金额,单位分
currency:货币类型,默认RMB
extension:获取订单号服务器传过来的自定义参数,原样返回
signType:签名类型,目前支持md5。 该字段不参与签名
sign:签名值。 该字段不参与签名
}
}
游戏服务器返回:
游戏服务器处理成功,直接返回一个"SUCCESS"字符串到U8Server即可。失败,返回一个"FAIL"字符串。
游戏服务器sign验证规则:
上面参数中,除了 signType和sign三个字段外, 其他所有的字段按照字母排列顺序进行组合,格式如下:
signStr = "channelID=5¤cy=RMB&.....&userID=4344"
组合字符串最后,加上u8server为该游戏分配的AppSecret。
signStr += "&" + AppSecret
这样得到的signStr,就是待校验的数据字符串了。验证方式,U8Server企业版,可以在jdbc.properties中通过u8server.pay_sign_method来控制,可以填MD5或者RSA。 U8Server开源版本可以在com.u8.server.web.pay.SendAgent.java中常量中设置。
signType=="md5",验证:
String localSign = md5(signStr)
if(localSign == sign) return true;
else return false;
将本地生成的md5和收到的sign进行比对。 一致,则验证通过。
1.3 游戏服务器订阅商品回调接口
当U8Server收到渠道SDK订阅型商品支付回调,并处理成功时,我们需要里面调用游戏服的订阅商品回调地址,通知游戏支付成功,让游戏服给玩家发游戏币。 验证方式同支付回调接口,添加了productType、originalOrderID、expireTime、isCancel、subType字段,具体字段说明如下。若为首次购买订阅商品时,步骤同消耗型商品,若为自动续费时,CP方可根据添加了productType类型、orderID判断商品是否已存在,如果不存在且为订阅型商品、且未过期时,需创建新的订单,并给玩家商品续期。 游戏通过透传参数、商品id、userID等来确定用户和订阅商品。 请求地址:游戏服提供,配置在UGame表中payCallbackSub字段中。 请求方式:POST 请求参数(JSON格式):
{
state:状态,1:成功;其他失败
data:{
productID:商品ID
orderID: 订单号
userID: 用户ID
channelID: 渠道ID
gameID: 游戏ID
serverID:游戏服务器ID
money:充值金额,单位分
currency:货币类型,默认RMB
extension:获取订单号服务器传过来的自定义参数,原样返回
originalOrderID: //原始交易id,订阅型商品才有
expireTime: //商品过期时间,时间戳,订阅型商品才有
isCancel: //是否取消,0:未取消,1:取消,订阅型商品才有
productType: //商品类型,1:消耗型商品,2:非消耗型商品,3:自动订阅商品
subType: //订阅类型,1.首次购买 2.自动续费 3.恢复订阅
signType:签名类型,目前支持md5和rsa,可以自己设定。 该字段不参与签名
sign:签名值。 该字段不参与签名
}
}
返回: 游戏服处理成功,直接返回一个"SUCCESS"字符串到U8Server即可。失败,返回一个"FAIL"字符串。 游戏服务器sign验证规则: 首先对收到的data中的数据进行解析, 解析出来之后,除了signType和sign两个字段外, 其他所有的字段按照字母排列顺序进行组合,格式如下:
signStr = "channelID=5¤cy=RMB&.....&userID=4344"
组合字符串最后,加上u8server为该游戏分配的SecretKey。
signStr += "&" + SecretKey
这样得到的signStr,就是待校验的数据字符串了。 如果signType=="md5",那么就直接这样验证:'
String localSign = md5(signStr) if(localSign == sign) return true; else return false;
将本地生成的md5和收到的sign进行比对。 一致,则验证通过。 这里md5字符串为 32位小写 如果signType=="rsa",则验证方法如下:
RSAUtils.verify(signStr, publicKey, "UTF-8");
RSAUtils类可以从U8Server代码中获取, publicKey是u8server为该游戏分配的支付公钥。
1.4 奖励发放——游戏服务器回调接口
当渠道判断用户可以下发奖励时,我们会调用游戏服的奖励发放回调地址,通知游戏下发奖励,让游戏给玩家发奖励。
!> 注意,预注册奖励发放不提供roleID和serverID,游戏需要根据sdkUserID查找用户进行奖励发放
请求地址:游戏方提供 请求方式:POST 请求参数
"sdkUserID":渠道SDK平台用户唯一ID
"giftID" :礼包ID
"gameID": 游戏ID
"serverID":游戏服务器ID
"roleID":角色ID
"extra":额外参数
"extra2":额外参数2,该字段返回内容为 [{"lang_code":"zh","title":"\u54c8\u54c8","content":"\u563b\u563b"},{"lang_code":"en","title":"haha","content":"xixi"},{"lang_code":"ft","title":"","content":""},{"lang_code":"ja","title":"","content":""},{"lang_code":"ko","title":"","content":""}]
"sign" :签名值,该字段不参与签名。请求签名 所有参数按照字母升序升序排列md5(param1=¶m2&$key).
请求参数示例:
{"sdkUserID":"4ffbbcb0e96164cb5f7a8a4c30589095","giftID":"ThingMoneyParam:2:300+ThingGoodsParam:10100:100+ThingMoneyParam:3:200+ThingMoneyParam:1:99+ThingHeroParam:334201:0+ThingHeroParam:232601:2+ThingHeroParam:132601:1","gameID":"93","serverID":"1","roleID":"5c167e8406a146bb80373e4925c99b37","extra":"Luna#Luna+1","extra2":"[{\"lang_code\":\"ft\",\"title\":\"Luna\",\"content\":\"Luna+1\"}]","sign":"10f0178cece885656c0dfd5101f294de"}
游戏服务器sign验证规则: 首先对收到的data中的数据进行解析, 解析出来之后,除了sign字段外, 其他所有的字段按照字母升序排列进行组合,空数据也参与加密,格式如下:
signStr ="extra=1#100|2#50|5#30|7#20|20#1&gameID=53&...&sdkUserID=55848622-22F3-4BF8-9E3E-E03B691BF711&serverID=1"
组合字符串最后,加上u8server为该游戏分配的SecretKey。
signStr += "&" + SecretKey
将本地生成的md5和收到的sign进行比对。 一致,则验证通过。 返回 游戏服处理成功,直接返回一个”success”字符即可。失败,返回一个”fail”字符串
1.5 firebase消息推送—游戏服务器调用接口
/**
* 备注:这个接口用到的game_id和加密key都需要单独提供。
*/
请求地址:https://andhk-api.m-co.cn/message/hw/push
请求方式:POST
请求参数
"game_id": 79 游戏id(需单独提供)
"time" : 1633934270 请求时间(时间戳)
"user_name":19469c50e4339b8f 用户id,登录成功之后返回的sdkUserID;多个id用`,`号(半角)隔开,限制最多250个id
"messageTitle":test 消息标题
"messageBody":test 消息体内容
"messageExtraData":test 消息额外数据(可以为一般字符串或标准的json字符串)
"sign" :签名值,该字段不参与签名。请求签名 所有参数按键值升序排列md5(param1=¶m2&$key),加密key也单独提供
游戏服务器sign验证规则:
首先对收到的data中的数据进行解析, 解析出来之后,除了sign字段外, 其他所有的字段按照字母升序排列进行组合,只拼接value值,格式如下:
signStr ="79"+"test"+...+"1633934270"+"19469c50e4339b8f"
组合字符串最后,加上该游戏单独分配的appKey,请仔细看参数文档。
signStr += appKey
将本地生成的md5和收到的sign进行比对。 一致,则验证通过。
返回
{
"code": 0,//(number),"0"代表成功,其余代表失败
"msg": "xxx",//(string)
"data":[]
}
1.6 退款邮件游戏对接(全服发送邮件)
游戏服务端退款邮件地址:https://xxxx.com (游戏方提供)
请求方式【POST】
具体参数:
sdkUserID:(String) sdk中的user_name
serverID(int) 退单中的server_id,
mail_info(json Array): [
{
"lang_code": "en",//根据多余语言配置返回,例如:英文(en),韩文(ko),日文(ja),中文繁体(ft),中文简体(zh)
"lang_name": "英文",
"is_default": 1,//默认语言是1,非默认语言是0
"title": "ce",
"content": "55"
},
{
"lang_code": "ft",
"lang_name": "中文繁体",
"is_default": 0,
"title": "44",
"content": "888888"
}
]
参与加密AppSecret(String): AppSecret 游戏加密key
sign(String) = md5(mail_info . sdkUserID . serverID . AppSecret) (32位小写字符)
请求返回:
{"code":1, "msg": "success"};失败示例:{"code":0, "msg": "fail, account not exist"}
具体代码示例:
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{
"sdkUserID": "57e7e449647e09ac",
"serverID": "200001",
"sign": "xxxxx",
"mail_info": [
{
"lang_code": "en",
"lang_name": "英文",
"is_default": 1,//默认语言是1,非默认语言是0
"title": "ce",
"content": "55"
},
{
"lang_code": "ft",
"lang_name": "中文繁体",
"is_default": 0,
"title": "44",
"content": "888888"
}
]
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
1.7 广告播放奖励发放——游戏服务器回调接口
当客户端播放完广告,我们服务端接受到广告回调通知后会调用游戏服的奖励发放回调地址,通知游戏下发奖励,让游戏给玩家发奖励。
请求地址:游戏方提供
请求方式:POST
请求参数
"sdkUserID":渠道SDK平台用户唯一ID
"eventId" :IronSource事件ID
"placementName": 广告位置
"rewardName": 奖励名称
"rewardAmount": 奖励数量
"serverId": 服务器ID
"roleId": 角色ID
"extra": 广告位置
"type": 类型,1:发放奖励,2:撤销奖励
"time": 请求时间
"sign" :签名值,该字段不参与签名。请求签名 所有参数按照字母升序升序排列md5(param1+param2+key).
请求参数示例:
{"sdkUserID":"57e7e449647e09ac","eventId":"26abY910f380b73bf619Y0","placementName":"DefaultRewardedVideo","rewardName":"Virtual Item","rewardAmount":"1","type":1,"serverId":"4","roleId":"22","extra":"额外参数","time":1652925873,"sign":"199cb4f3c8303e8f6dc338a78b763697"}
请求返回:
!> 注意:error:0成功;1已发放;2其他错误(注意:0和1状态必须要有)
{"error":0, "msg": "success", "data": ""};失败示例:{"error":2, "msg": "sign error", "data": ""}
2. 订单中心
【2. 订单中心】此模块为未对接客户端SDK(如【幻想宝贝】)的游戏需要对接的服务端接口。
2.1 创建订单
功能描述:
游戏app为某个商品支付前上报订单信息,订单中心为此笔订单创建一个平台唯一订单号platorderId并返回给游戏,游戏在支付时带上唯一订单号标识(如:谷歌在发出getBuyIntent请求时为返回的developerPayload字段指定这个值)
请求地址: https://apigameord.g.ledu.com/v2.0/ordercenter/createorder
请求方式: POST
请求参数:
productId: (string) - 商品id:com.rxsg1.07
productName: (string) - 商品名称
money: (number) - 付款订单金额:100
currency: (string) - 币种:RMB
gameId: (number) - 平台中心配置appid,订单后台为每个游戏配置的gameid值 每个游戏有不同gameid,例如:1001
channelId: (number) -游戏渠道id:不传时默认为0(非必传)
gameName: (string) - app名
orderID: (string) - app的订单号,如果支付前app内未产生订单号 支付时再返回
roleID: (string) - 角色id
roleName: (string) - 角色名称
serverID: (string) - 服务器id:50936
serverName: (string) - 服务器名
userID: (string) - 充值用户id
userName: (string) - 充值用户名
roleLevel: (string) - 角色等级
payChannel: (string) - 充值渠道方式,1:谷歌 2:苹果 3:one store 4:华为 5:Xsolla-Client 6:Xsolla-Web 7:KG 8:Qoo
packageName: (string) - app包名
createTime: (number) - 订单创建时间
orderType: (number) -0:内购订单 1:订阅 2:订阅自动续费(订阅功能未测试 若对接此功能请提前联系)
extraOrder: (string)-订单关联信息,orderType为2时 订阅时的平台唯一订单号
deliveryUrl: (string) - 发货地址(非必传)
extraData: (string) - 透传参数
time: (number) - 发起时间
sign: (string)
游戏请求api接口加密串验证方式(sign):
加密方式: md5(strtolower(http_build_query(ksort($request)).”&xxx))
注意1: http_build_query($request)转成URL-encode 形如:key1=value1&key2=value2
注意2: "xxx"为加密key需要和游戏方约定好
返回(json):
{
resultCode: 0, //3.创建订单失败
resultMessage: "success",//失败时显示失败原因
data: {
platorderId: "10011554867699875662",//string 平台生成的唯一订单号
channelPayInfo: {
token: "xxxx",//渠道支付信息(xsolla支付token)
}
}
}
3. 游戏官网支付相关对接
【3. 游戏官网支付相关对接】如果该游戏需要支持在游戏官网可充值,则需要对接【3.1】。如果游戏对接了客户端SDK,则不需要对接【3.2】,否则(类似幻想宝贝)则需要实现这个接口。
3.1 游戏角色查询
功能描述:
根据游戏内唯一标识查询游戏服务器等信息,角色信息以数组形式返回(data.roleInfo)
请求地址: 游戏提供
请求方式: POST
请求参数:
roleId: (string) - 游戏内角色id(游戏角色唯一标识)
payChannel(string) - 允许的充值渠道(1:谷歌 2:苹果 3:one store 4:华为 5:Xsolla-Client 6:Xsolla-Web 7:KG INICIS 8:Qoo);多个以`,`分隔(非必传)
time: (number) - 发起时间
sign: (string)
游戏请求api接口加密串验证方式(sign):
加密方式: md5(strtolower(http_build_query(ksort($request)).”&xxx))
注意1: http_build_query($request)转成URL-encode 形如:key1=value1&key2=value2
注意2: "xxx"为加密key需要和游戏方约定好
返回(json):
{
"code": 0,//(number)
"mesasge": "xxx",//(string)
"data": {
"roleInfo":[
{
"gameId":1,//平台中心配置appid(订单后台为每个游戏配置的gameid值 每个游戏有不同gameid):例如:1001
"channelId":1,//游戏渠道id:不传时默认为0(非必传)
"gameName":"xxx",//app名
"roleName":"xxx",//角色名称
"serverID":"xxx",//服务器id
"serverName":"xxx",//服务器名
"userID":"xxx",//用户id
"userName":"xxx",//用户名
"roleLevel":"xxx",//角色等级
"packageName":"xxx",//app包名
"deliveryUrl":"xxx",//发货地址(可不返回)
"payAllow":0,//0:不允许充值 1:允许充值
}
]
}
}
3.2 游戏发货
功能描述:
游戏内道具发放接口
请求地址: 游戏方提供
请求方式: POST
请求参数:
gameId: (nubmer) - 平台中心配置appid(订单后台为每个游戏配置的gameid值 每个游戏有不同gameid):例如:1001
channelId: (nubmer) - 游戏渠道id:不传时默认为0(非必传)
orderID: (string) - 游戏订单号,游戏需要对发货完成订单做过滤处理
platorderId: (string) - 平台订单号,游戏需要对发货完成订单做过滤处理
userID: (string) - 充值用户id
payChannel: (string) - payChannel(string) - 充值渠道方式(1:谷歌 2:苹果 3:one store 4:华为 5:Xsolla-Client 6:Xsolla-Web 7:KG INICIS 8:Qoo)
roleId: (string) - 游戏角色ID,游戏内唯一用户角色id
serverID: (string) - 服务器id
productId: (string) - 游戏商品ID,游戏内唯一商品id
extraData: (string) - 游戏透传参数
time: (number) - 发起时间
sign: (string)
返回参数:
code=0: 发货正常
code=1001: 已发货(如果是重复发货,用1001标识或0标识,这两种情况在平台都会标识为成功)
code=1002: 取消已发货
其他异常情况游戏自己定义code即可
游戏请求api接口加密串验证方式(sign):
加密方式: md5(strtolower(http_build_query(ksort($request)).”&xxx))
注意1: http_build_query($request)转成URL-encode 形如:key1=value1&key2=value2
注意2: "xxx"为加密key需要和游戏方约定好
返回(json):
{
"code": 0,//(number)
"mesasge": "sucess",//(string)
"data": []
}
4. 数数上报相关接口文档
4.1 用户属性上报
请求地址: https://andhk-api.m-co.cn/external/ta/userReport (请求域名对于不同的应用可能有所变动,对接前我放提供)
请求方式: POST
请求参数:
appId: (string) - 我方提供,为一固定值
roleId: (string) - 游戏方角色ID
serverId: (string) - 游戏方服务器ID
userProperties: (string) - 用户属性(json字符串形式的参数)
time: (number) - 发起时间
sign: (string) - 签名值,该字段不参与签名;所有参数按照字母升序升序排列md5(param1=¶m2&$key)
userProperties目前支持的属性值:
{
"mj_item_details":[{
"mj_daoju_id":"ceshi_1",//string,道具ID
"mj_daoju_name":"daoju_1",//string,道具名称
"mj_daoju_type":"daoju_type_1",//string,道具类型
"mj_daoju_value":0.01,//number,道具价值剩余
}]
}
返回(json):
{
"error": 0,//(number)
"msg": "xxx",//(string)
"data": []
}
}
4.2 事件上报
请求地址: https://andhk-api.m-co.cn/external/ta/eventReport (请求域名对于不同的应用可能有所变动,对接前我放提供)
请求方式: POST
请求参数:
appId: (string) - 我方提供,为一固定值
roleId: (string) - 游戏方角色ID
serverId: (string) - 游戏方服务器ID
eventName: (string) - 事件名称
eventProperties: (string) - 事件属性(json字符串形式的参数)
time: (number) - 发起时间
sign: (string) - 签名值,该字段不参与签名;所有参数按照字母升序升序排列md5(param1=¶m2&$key)
eventName目前支持的值:
mj_online_time
对应eventProperties的属性值:
{
"mj_online_date":"2022-01-01",//string,日期
"mj_online_value":1,//number,在线时长(秒)
}
返回(json):
{
"error": 0,//(number)
"msg": "xxx",//(string)
"data": []
}
}
5. 打包相关接口文档
5.1 获取打包参数
- 请求地址: http://api-faxing.miaoju.cn/api/common/getChannelConfig
- 请求方式: GET
- 请求参数:
名称 | 位置 | 类型 | 必选 | 说明 |
---|---|---|---|---|
time | query | string | 是 | 当前时间戳 |
channel_id | query | integer | 是 | channelID |
sign | query | string | 否 | 加密字符串,MD5(channel_id=111&time=1680587161&key),key为U8game表中的的appKey,私下提供 |
- 返回数据结构
名称 | 类型 | 说明 |
---|---|---|
» code | number | 0:成功,1:参数错误,2:参数错误,3:签名错误,4:信息错误 |
» data | json | 返回channel的配置,需将值写入对应的配置文件中,详细见data说明。 |
» msg | sting | 返回值说明 |
- data中值写入对应文件(安卓)
名称 | 对应文件 | 说明 |
---|---|---|
androidManifest | AndroidManifest.xml | |
u8DeveloperConfig | asset/u8_developer_config.properties | |
resValues | res/values/values.xml | |
file | Google_server_json => google-service.json |
- data中值写入对应文件(IOS)
名称 | 对应文件 | 说明 |
---|---|---|
infoPlist | info.plist | 按层级写入info.plist文件中 |
URLTypes | URL Types | 将配置写入URL Types中 |
file | Google_server_info_plist => GoogleService-Info.plist |
- 安卓返回示例
{
"code": 0,
"msg":"成功",
"data": {
"u8DeveloperConfig": {
"MK_APPSFLYER_KEY": "NNYppuxxxxxx",
"MK_GAME_ID": "111",
"MK_GAME_KEY": "gfpPfGwxxxxx",
"MK_GAME_SECRET": "Mgrizxxxxxx",
"MK_TA_APP_ID": "1e6bdc78073d489xxxxxxx",
"MK_TA_SERVER_URL": "https://sskj-api.m-co.cn",
"NAVER_CAFE_ID": "",
"NAVER_APP_ID": "",
"NAVER_APP_KEY": "",
"MK_SCREEN_ORIENTATION": "0",
"MK_IRONSOURCE_APPKEY": "12345678",
"U8_SDK_VERSION_CODE": "1",
"U8_Channel": "2284",
"U8_APPID": "122",
"U8_APPKEY": "8d97accccccccc",
"U8_SDK_SHOW_SPLASH": false,
"U8SERVER_URL": "https://apisy.metajoygames.com",
"U8_ANALYTICS": true,
"MK_SERVER_URL": "https://and-api.metajoygames.com",
"U8SERVER_WS_URL": "wss://wshk.sy.faxing.ledu.com"
},
"resValues": {
"server_client_id": "123456789-xxxxxxxxxx3.apps.googleusercontent.com",
"facebook_app_id": "123456789",
"fb_login_protocol_scheme": "fb123456789"
},
"androidManifest": {
"com.google.android.gms.ads.APPLICATION_ID": "ca-app-pub-1234567890~98765431"
},
"file": {
"Google_server_json" :{
}
}
}
}
- IOS返回示例
{
"code": 0,
"data": {
"infoPlist": {
"FacebookAppID": "12344566",
"FacebookDisplayName": "海外Demo",
"FacebookClientToken": "",
"GADIsAdManagerApp": "YES",
"GADApplicationIdentifier": "ca-app-pub-12345678",
"NSUserTrackingUsageDescription": "",
"NSCameraUsageDescription": "",
"NSPhotoLibraryUsageDescription": "",
"NSLocationWhenInUseUsageDescription": "",
"TDDisPresetProperties": [
"#start_reason"
],
"U8SDK": {
"AppId": "125",
"AppKey": "11111xxx2233",
"U8Url": "https://hkpre.sy.faxing.ledu.com",
"U8WSUrl": "ws://hkpre.sy.faxing.ledu.com",
"Channel": 2291,
"ChannelName": "MCOOS",
"Plugins": [
{
"name": "MCOOS",
"key": "xxxxx",
"gameID": "112",
"payKey": "xxxx",
"sdkSchemeName": "mcoossdk",
"channel": "0_0",
"appsFlyerDevKey": "xxxxx",
"appleAppID": "123456",
"thinkingAppId": "123ds12321",
"thinkingUrl": "https://sskj-api.m-co.cn",
"mkIOSServer": "http://ioshk-pre-api.m-co.cn",
"googleClientID": "xxxx-xxxx.apps.googleusercontent.com",
"fbAppId": "123213456",
"fbDisplayNAame": "海外Demo",
"googleAppId": "com.googleusercontent.apps.123449-xxxxx",
"fbClientToken": "",
"ironAppKey": "xxxx",
"adMobID": "ca-app-pub-xxxxx~xxxxx",
"plugClientId": "xxxxxx",
"plugSecret": "xxx",
"plugCafeId": "123213"
}
]
},
"LSApplicationQueriesSchemes": [
"fbapi",
"fbapi20130214",
"fbapi20130410",
"fbapi20130702",
"fbapi20131010",
"fbapi20131219",
"fbapi20140410",
"fbapi20140116",
"fbapi20150313",
"fbapi20150629",
"fbapi20160328",
"fbauth",
"fb-messenger-share-api",
"fbauth2",
"fbshareextension",
"navercafe",
"naversearchapp",
"naversearchthirdlogin"
],
"SKAdNetworkItems": [
{
"SKAdNetworkIdentifier": "su67r6k2v3.skadnetwork"
},
{
"SKAdNetworkIdentifier": "f7s53z58qe.skadnetwork"
},
{
"SKAdNetworkIdentifier": "2u9pt9hc89.skadnetwork"
},
{
"SKAdNetworkIdentifier": "hs6bdukanm.skadnetwork"
}
]
},
"URLTypes": [
{
"URL Schemes": "fb11234567"
},
{
"URL Schemes": "com.googleusercontent.apps.x12321312-xxxxxxx"
}
],
"file": {
"Google_server_info_plist": ""
}
}
}