国内游戏服务端对接指南
集成指南
1.1 登录认证
客户端登录成功之后,U8Server返回userID和token等数据,客户端需要将该参数告诉游戏服务器,游戏服务器拿着这些参数,去U8Server进行一次登录认证。
登录认证地址:https://api.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和rsa,可以自己设定。 该字段不参与签名
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游戏服务器订阅商品(IOS)回调接口
当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 奖励发放——游戏服务器回调接口
当用户在官网预约成功后,在客户端用手机号首次登录/绑定后会调用游戏服的奖励发放回调地址,通知游戏下发奖励,让游戏给玩家发奖励。
请求地址:游戏方提供
请求方式:POST
请求参数
"sdkUserID":渠道SDK平台用户唯一ID
"gameID": 游戏ID
"giftID" :礼包ID
"orderId" :预约奖励订单ID
"serverId": 服务器ID
"roleId": 角色ID
"time": 请求时间
"extra":额外参数
"extra2":额外参数2,该字段返回内容为 [{"lang_code":"zh","title":"\u54c8\u54c8","content":"\u563b\u563b"}]
"sign" :签名值,该字段不参与签名。请求签名 所有参数按照字母升序升序排列md5(param1+param2+key).
请求参数示例:
{"sdkUserID":"57e7e449647e09ac","gameID":"1",orderId":"1","serverId":"4","roleId":"22","time":1652925873,"sign":"3cd03ae8059bda607f630e3ee8fcfb5b","giftID":"3#533","extra":"Luna#Luna+1","extra2":"[{\"lang_code\":\"zh\",\"title\":\"Luna\",\"content\":\"Luna+1\"}]"}
请求返回:
!> 注意:error:0成功;1已发放;2其他错误(注意:0和1状态必须要有)
{"error":0, "msg": "success", "data": ""};失败示例:{"error":2, "msg": "sign error", "data": ""}
1.5 活动支付回调(支持活动商品数量的传入)
当妙酷收到活动订单的支付回调,并处理成功时,我们会调用游戏的活动支付回调地址,通知游戏服给玩家发货。这个回调的地址,每个游戏固定一个默认地址,另外每个活动也可单独配置回调地址,活动内配置的地址优先调用
请求地址:游戏服接收请求的http地址(每个游戏有且仅有一个地址,相同游戏下的不同的服,请游戏自行中转)
请求方式:POST
参数格式:application/json
请求参数(JSON格式):
{
"state": 1, //状态,1:成功;其他失败
"data": {
"productID": "product_1", //自定义,由运营人员在发行后台中进行的商品配置填写
"productNum": 1,
"orderID": "MK1000000489", //妙酷订单ID:MK1000000489
"userID": 1700001, //U8用户自增长ID:- [参考1.1登录认证]中的返回
"channelID": 2285, //U8渠道ID
"gameID": 124, //U8游戏ID
"serverID": 100, //U8游戏服ID
"roleID": "roleID", //玩家角色ID
"money": 100, //充值金额,单位分
"currency": "RMB", //货币类型,默认RMB
"extension": "", //获取订单号服务器传过来的自定义参数,原样返回
"signType": "MD5", //签名类型,目前支持md5和rsa,可以自己设定。 该字段不参与签名
"sign": "", //签名值。 该字段不参与签名
}
}
游戏服务器返回:
游戏服务器处理成功,直接返回一个"SUCCESS"字符串到妙酷即可。失败,返回一个"FAIL"字符串。
游戏服务器sign验证规则:
上面参数中,除了 signType和sign三个字段外, 其他所有的字段按照字母排列顺序进行组合,格式如下:
signStr = "channelID=5¤cy=RMB&.....&userID=4344"
组合字符串最后,加上u8server为该游戏分配的AppSecret。
signStr += "&" + AppSecret
这样得到的signStr,就是待校验的数据字符串了。signType写死MD5。
signType=="md5",验证:
String localSign = md5(signStr)
if(localSign == sign) return true;
else return false;
将本地生成的md5和收到的sign进行比对。 一致,则验证通过。
1.6 广告播放奖励发放——游戏服务器回调接口
当客户端播放完广告,我们服务端接受到广告回调通知后会调用游戏服的奖励发放回调地址,通知游戏下发奖励,让游戏给玩家发奖励。
请求地址:游戏方提供
请求方式:POST
请求参数
"sdkUserID":渠道SDK平台用户唯一ID
"eventId" :IronSource事件ID
"placementName": 广告位置
"rewardName": 奖励名称
"rewardAmount": 奖励数量
"serverId": 服务器ID
"roleId": 角色ID
"extra": 广告位置
"type": 类型,1:发放奖励,2:撤销奖励
"scenarioId":广告场景ID
"time": 请求时间
"sign" :签名值,该字段不参与签名。请求签名 所有参数按照字母升序升序排列md5(param1+param2+key).
请求参数示例:
{"sdkUserID":"57e7e449647e09ac","eventId":"26abY910f380b73bf619Y0","placementName":"DefaultRewardedVideo","rewardName":"Virtual Item","rewardAmount":"1","type":1,"serverId":"4","roleId":"22","extra":"额外参数","scenarioId":"AND_001","time":1652925873,"sign":"199cb4f3c8303e8f6dc338a78b763697"}
请求返回: error:0成功;1已发放;2其他错误(注意:0和1状态必须要有)
{"error":0, "msg": "success", "data": ""};失败示例:{"error":2, "msg": "sign error", "data": ""}
数数上报相关接口文档
2.1 用户属性上报
请求地址: https://and.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+param2+...+$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": []
}
2.2 事件上报
请求地址: https://and.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+param2+...+$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": []
}
}