国内游戏服务端对接指南
集成指南
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
"orderId" :预约奖励订单ID
"serverId": 服务器ID
"roleId": 角色ID
"time": 请求时间
"sign" :签名值,该字段不参与签名。请求签名 所有参数按照字母升序升序排列md5(param1+param2+key).
请求参数示例:
{"sdkUserID":"57e7e449647e09ac","orderId":"1","serverId":"4","roleId":"22","time":1652925873,"sign":"3cd03ae8059bda607f630e3ee8fcfb5b"}
请求返回:
!> 注意: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:商品ID
productNum:商品数量
orderID: 订单号
userID: 用户ID
channelID: 渠道ID
gameID: 游戏ID
serverID:游戏服务器ID
money:充值金额,单位分
currency:货币类型,默认RMB
extension:获取订单号服务器传过来的自定义参数,原样返回
signType:签名类型,目前支持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进行比对。 一致,则验证通过。
数数上报相关接口文档
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": []
}
}