备注:此文档仅限于外部游戏使用,自研及发行游戏接入查看supersdk服务端接入指引_内部游戏专用
游戏App调用SuperSDK框架Login接口后弹出渠道3rd-SDK登录界面,相应3rd-SDK内部向3rd-SDK Server发起登录请求验证
用户登录成功, 3rd-SDK获取到3rd Server返回的token
SuperSDK将从3rd-SDK得到的token,提交给SuperSDK server验证请求。
SuperSDK Server 接收到SuperSDK请求的数据后将去3rd-SDK Server进行用户登录验证
SuperSDK Server收3rd-SDK Server的验证结果
SuperSDK 将3rd-SDK Server返回统一封装并加密数据
SuperSDK 收到的加密数据(osdk_ticket)抛给Game App,Game App转发给Game Server(此步接入商需自行完成),Game Server对加密数据进行解析并加入自己的业务 (此步骤执行解析操作,在下面有提供PHP的DEMO代码,开发者可以直接使用或者参考实现,osdk_ticket包括:game_id,user_id,login_sdk_name,time)
Game APP收到返回结果并判断是否登陆成功
1. 将得到的osdk_ticket进行base64解码
2. 得到sign,user_id,login_sdk_name,time等值,将sign与通过签名算法得到的签名进行验证,其中key为配置时获取到的的game_secret;
备注:game_secret在SuperSDK打包工具中添加完游戏后,游戏配置中可查看。
3. 签名算法请见附1:签名算法
范例:
osdk_ticket =base64({
"osdk_game_id": "132435",
"user_id": "837263",
"account_system_id": "0060001",
"osdk_user_id": "0060001_837263",
"login_sdk_name": "360",
"channel_id": "0",
"extend":"", //此参数在配置参数时配置的扩展参数
"ip": "128.1.1.10",
"time": 149382731,
"sign": "21232f297a57a5a743894a0e4a801fc3"
})
参数说明:
参数名称 | 类型 | 说明 |
---|---|---|
osdk_game_id | string | SuperSDK分配的游戏编号 |
user_id | string | 3rd Server返回的用户唯一标识 |
login_sdk_name | string | 第三方联运商名称 |
account_system_id | string | 用户账号系统编号(用户体系按联运平台划分,每个联运平台一个用户帐号系统编号,具体编号可以参考付3:用户帐号系统编号列表) |
osdk_user_id | string | oneskd用户编号,格式:osdk_user_id= account_systemid++user_id |
channel_id | string | 渠道编号 |
extend | string | 扩展参数,在打包工具中配置的扩展参数 |
time | int | sign生成的时间戳 |
ip | string | 客户端请求的ip地址 |
sign | string | 签名,签名算法请见附1:签名算法 |
Game APP调用SuperSDK支付接口(pay),SuperSDK请求 SuperSDK Server生成本次交易订单号
SuperSDK Server返回本次交易订单号
SuperSDK调用3rd-SDK支付接口请求3rd-SDK Server支付
支付成功后3rd-SDK Server将返回支付成功,Game App不能以此信息来判断是否支付成功,具体支付成功信息请求服务器通知为准。
3rd-SDK Server完成订单支付后将订单信息异步通知SuperSDK Server,此步需要开发者在3rd-SDK后台将支付通知地址配置为打包工具参数配置界面的支付回调地址
SuperSDK Server对3rd-SDK Server订单信息进行校验 ,并返回相应的处理结果
SuperSDK Server 将订单支付信息推送给Game Server,此通知地址在打包工具配置参数界面配置
Game Server对SuperSDK Server订单信息进行校验 ,并返回相应的处理结果(成功返回ok)
Game Server向GameApp push支付通知
说明:接口地址接入商提供,接口地址在打包工具支付通知地址中配置
接口地址:接入商自定义
HTTP请求:POST
编码:UTF-8
请求参数:
参数名称 | 类型 | 说明 |
---|---|---|
user_id | string | 第三方联运商用户标识 ==注:此字段不具备惟一性== |
account_system_id | string | 用户账号体系编号(用户体系按联运平台划分,每个联运平台一个用户帐号系统编号;具体编号可以参考付3:用户帐号系统编号列表) |
osdk_user_id | string | 用户标识 格式:osdk_user_id=account_systemid++user_id ==注:此字段为用户惟一标识== |
amount | float | 充值金额,单位请查看currency,国内默认为人民币,国外默认为美元 |
server_id | string | 游戏服编号 |
product_id | string | 商品编号 |
product_name | string | 商品名称 |
pay_status | integer | 支付状态 |
pay_time | integer | 支付时间 |
order_id | string | 订单号 |
coo_order_id | string | 第三方联运营商订单号 |
channel_id | string | 渠道编号 |
game_id | integer | 游戏服编号 |
game_role_id | string | 游戏角色编号 |
is_sandbox | integer | 是否沙盒充值(沙盒充值指没有使用真钱充值,而是使用联运平台给的测试虚拟平台币) |
currency | string | 货币,使用国际能用货币单位(人民币:CNY) |
sdk_pay_extend | string | sdk客户端充值时传递的扩展参数 |
custom_data | string | 打包工具中设置的自定义参数 |
sign | string | 签名,验签参考签名算法,请见附1:签名算法,key为打包工具中的game_server_secret |
请求示例
http请求body内容
order_id=OS_J8KTP5647PFPC4XYC&user_id=428545488&game_id=196377310
&server_id=&product_name=60&product_id=1&pay_status=1&
pay_time=1415977939&coo_order_id=2-32817-20141114230037-100-1655
&amount=1.00&sdk_pay_extend=123123123123&channel_id=&
game_role_id=&is_sandbox=0¤cy=CNY&account_system_id=0060002
&osdk_user_id=0060002_428545488&custom_data=0
&sign=0e5cf7569b73741effef8cc832966634
返回结果OK
通知机制
充值操作完成后,只有充值支付成功,“SuperSDK 服务器” 才会将充值结果通过“支付通知地址”发送到“GameServer 服务器”。“GameServer 服务器”收到“SuperSDK 服务器”的充值通知后,根据处理结果返回字符串ok(小写) 或其它(如 参数错误:param_error,签名错误:sign_error,系统错误:system_error),ok代表成功。 如果回应其他值或者不回应, 则被认为通知失败, SuperSDK Server会尝试多次通知.
建议
“GameServer 服务器”在接收“SuperSDK 服务器”的充值结果通知时,不管订单是否成功,只要业务逻辑正常,一般都应该返回ok,表示不需要“SuperSDK 服务器”再次发起通知。当业务逻辑异常(如:收到的SuperSDK 服务器的充值结果通知内容的签名不正确、充值结果与提交的充值请求不符等),认为需要再次通知,才返回其它。
重复通知
由于存在多次发送通知的情况,Game Server应防止因收到多次支付通知而给玩家多次加钱,Game Server可以使用同一order_id只当做一笔充值处理。 正常接到消息应该回应ok, 无需SuperSDK Server继续发送通知。
请见附1:签名算法
重复通知间隔为: 1分钟,4分钟 ,9分钟,16分钟 ,25分钟 ,36分钟,49分钟,64分钟,81分钟,100分钟共 10次,直到中间有收到接收成功的反馈消息,或10次发送完,结束周期性发送。
1. 所有参数按照参数名字母升序排列,sign不参与签名;
2. 将排序后的参数名与对应的参数值(非urlencode的值)用&拼接在一起,如:a=1,b=2,c=3拼接得到a=1&b=2&c=3;
3. 然后在直接连接key值,做一次md5加密并转换成小写,得到签名waitSign值
4. 将waitSign与参数中的sign对比,相同则验证成功
5. 参数名与参数个数可能会有变动,建义不要把参数写死,可直接把获取到的所有参数除sign以外参与签名
6. key对应的value如果是空的,也要参与签名,见下方示例里面的key:b
范例:收到数据为UTF-8格式,并已经使用urlencode编码: a=%e5%85%83%e5%ae%9d&c=1&b=&sign=5,而:key=k waitSign=md5(“a=元宝&b=&c=1k”)
代码范例:
function sign($data, $key)
{
ksort($data);
$str = array();
foreach ($data as $k => $v)
{
$str[] = $k . "=" . urldecode($v);
}
$strData = implode("&", $str) . $key;
return md5($strData);
}