接入流程可参考【 接入指南-3 时序图 】
# 1 登录鉴权
1.1 接口说明
客户端SDK登录成功后,建议cp通过服务端接口验证 AccessToken。
1.2 请求地址
以下都是正式环境,无测试环境,游戏开发者在接入测试时也使用SDK正式环境地址。
加速请求:
- http://uglobal.ultrasdk.com/hu/v1/login/checkUserInfo.lg
SDK服务端API默认使用 HTTP POST application/x-www-form-urlencoded
1.3 请求参数
字段 | 必填 | 类型 | 字段说明 |
---|---|---|---|
pcode | 必须 | String | ProductId,SDK的产品ID |
data | 必须 | String | 加密后的业务数据,加密前的参数值参考1.4.1 参数生成规则 |
timestamp | 必须 | String | unix 时间戳,格式如:1626320008 |
sign | 必须 | String | 签名,参数生成规则 |
1.3.1 data参数
字段 | 必填 | 类型 | 字段说明 |
---|---|---|---|
cUid | 必须 | String | 渠道用户ID |
cName | 可选 | String | 渠道用户名称 |
accessToken | 必须 | String | SDK客户端登录返回的Token |
1.4 请求示例
curl https://uglobal.ultrasdk.com/hu/v1/login/checkUserInfo.lg -d 'data=eiJjVWlkIjNiMTAwMmtlIiwiY05hbWUiOyIiLCJhY2olc3NUb2dtbiI6ImV5SmphR0Z1Ym1Wc1gybGtJam9pSWl3aVpYaDBaVzVrSWpvaU1qRXdObnd5TlRWOE1DSXNJbTl6Wkd0ZmRYTmxjbDlwWkNJNklqQXdOakF3TVRWZk1UQXdNbWR0SWl3aWFYQWlPaUl4TWpjdU1DNHdMakVpTENKMGFXMWxJam94TmpJMk1EVTNPVEUyTENKemFXZHVJam9pTUdSbE56RXhOREZsTm1Oak16YzFOMkV6TldWak9EaGlOV1U0WWpabU5HUWlmUT09In0%3D&pcode=17188&sign=55f35601801fa4bb5a1644076076b15e×tamp=1626057916'
1.5 响应参数
字段 | 名称 | 重要性 | 类型 | 说明 |
---|---|---|---|---|
code | 状态 | 必须 | int | 业务状态,0代表成功,不为0代表失败,具体错误可查看msg |
msg | 描述 | 可选 | String | 错误信息 |
cUid | 渠道的用户id | 必须 | String | - |
cName | 渠道的username | 必须 | String | 转发第三方渠道用户名,若渠道不提供用户名,则返回为空字符串 |
channel | 渠道码 | 必须 | String | ultra、baidu、ysdk |
channelId | 渠道ID | 必须 | int | - |
swLogin | 切登录 | 可选 | int | 1 : 表示是切登录过来的,默认没有该字段 |
curChannelUser | 切登录 | 可选 | int | 当前登录的渠道用户信息,默认没有该字段 |
- 说明:
- 关于
唯一用户ID
:cUid 在 渠道内是唯一的,但在不同渠道之间是可能重复;
请使用
channelId
与cUid
的结合,来确定玩家的唯一账号;- 也可以使用
channel
与cUid
组合
- 也可以使用
官方渠道需要特殊处理 ,即「安卓渠道与iOS渠道的cUid是互通的」;- 官方国内与官方海外之间不互通;
channelId channel 渠道名称 7 ultra 国内Android 8 iultra 国内iOS channelId channel 渠道名称 3 iultraglobal 海外iOS 4 ultraglobal 海外Android
- 关于
1.6 响应示例
{
"code": 0, // 0代表成功,不为0代表失败,具体错误可查看msg
"msg": "",
"timestamp": 1626060519882,
"channel": "anzhi",
"channelId": 29,
"cUid": "20180112002346jUru7agnHW",
"swLogin": 1,
"ext": {},
"curChannelUser": {
"cUid": "97422201",
"cName": "amengyan",
"channel": "iultra",
"channelId": 8
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1.7 返回码
code不为0都为失败,
code | 说明 |
---|---|
0 | 成功 |
-1 | 1.xxx参数不合法,如productId不合法 2.错误的 accessToken 3.签名校验失败 |
1 | 用户未创建 |
1002 | 错误的用户 |
# 2 支付回调
2.1 业务说明
当玩家
- 玩家支付成功: 以 SDK服务端收到、并验证支付结果通过 为准;
- 关于回调地址:
请务必在【SDK管理后台 (opens new window)-出包->选择游戏->游戏配置->支付回调地址】中填写
Callback_Url
,或联系运营协助设置;请勿泄露真实回调地址;
- 回调请求方法:
HTTP
、POST
、application/x-www-form-urlencoded
- 回调解密计算:
- 业务数据有加密和签名,参考 签名计算规则
- 回调的响应值:
- SUCCESS
- 注意,只有这7个字符,不要有空白或其它字符;
- 表示支付结果正常受理,
流程结束
。
- ABORT
- 表示
支付结果受理但有异常,流程结束
,SDK 服务端不再重试通知该订单的结果; - 也可以返回 ABORT:描述信息 来补充少量说明信息;
- 表示
- 其它情况均表示
支付结果受理异常,流程未结束 ,SDK 会定时重试通知回调地址(见下文 回调重试策略);
- SUCCESS
说明
客户端和中台都能配置回调地址,如果都配置,以
中台配置
的为准,如果想更改优先级,请联系客服
- 请求方法:
POST
2.2 回调参数
字段 | 名称 | 重要性 | 类型 | 说明 |
---|---|---|---|---|
data | String | 必须 | 密文,通知主要内容,需要解密。已做URLEncode 编码,格式见下文 | |
sign | String | 必须 | 签名 |
data
解密后的基础字段说明:参数 类型 重要性 来源 描述 amount Double 必须 SDK 成交金额,单位 元
(CNY)gameOrder Sring 必须 游戏 游戏订单号 orderNo String 必须 SDK 整合sdk订单号 status int 必须 SDK 交易状态, 0表示成功
selfDefine String 可选 游戏 透传参数 channelUid String 必须 SDK 渠道的用户id payTime String 必须 SDK 交易时间 yyyy-MM-dd HH:mm:ss
channel String 必须 SDK 渠道类型 channelId int 必须 SDK 渠道ID goodsId String 必须 SDK 渠道的档位ID goodsName String 必须 SDK 商品名称 isTest int 必须 SDK 是否为母包测试,1为母包测试, 0为其他渠道 data
解密后的额外字段说明,有代金券、iOS订阅、其他需求可使用参数 类型 重要性 来源 描述 yx_is_in_intro_offer_period
String 可选 SDK 订阅:是否处于介绍价格期 仅国内iOS渠道下有该字段
yx_is_trial_period
String 可选 SDK 订阅: 是否处于免费试用期 仅国内iOS渠道下有该字段
iap_sub_expire
String 可选 SDK 订阅:过期时间 仅国内iOS渠道下有该字段
iap_sub
String 可选 SDK 订阅:是否是订阅 仅国内渠道iOS下有该字段
paytype String 可选 SDK 支付方式类型 仅国内渠道下有该字段
yx_sub_type
String 可选 SDK 支付方式子类型 仅国内渠道下有该字段
yx_sub_type
String 可选 SDK 支付方式子类型 仅国内渠道下有该字段
dealAmount String 可选 SDK 使用了SDK代金券
实际支付的金额仅国内渠道下有该字段
qkChannelId int 可选 SDK quicksdk的id quickChannelId int 可选 SDK quicksdk的id 等于 qkChannelId
值一样sandbox String 可选 SDK 是否是沙盒 等于 仅(国内/全球)渠道下有该字段
iapSub String 可选 SDK 订阅:是否是订阅 仅全球iOS渠道下有该字段
iapSubExpire String 可选 SDK 订阅:订阅过期时间 仅全球iOS渠道下有该字段
currency String 可选 SDK 币种 仅全球渠道下有该字段
payType String 可选 SDK 支付方式类型 仅全球渠道下有该字段
2.3 回调数据示例
示例
data=eyJhbW91bnQiOjEuMCwib3JkZXJObyI6IkhVQTEwMTg2MTY0NDEyIiwicGF5VGltZSI6IjIwMjEtMDctMDUgMTQ6NDI6MzMiLCJnb29kc0lkIjoiMSIsImNoYW5uZWxVaWQiOiIxMTg1OTEzMzk3OTAxMTM5Iiwic2VsZkRlZmluZSI6IumAj%2BS8oOWPguaVsCIsImNoYW5uZWwiOiJodWF3ZWkiLCJxdWlja0NoYW5uZWxJZCI6MjQsInFrQ2hhbm5lbElkIjoyNCwiZ2FtZU9yZGVyIjoiY3BPcmRlcklkXzE2MjU0Njc2MTIxMzAiLCJnb29kc05hbWUiOiLllYblk4FJROiHquWumuS5iea1i%2BivleWVhuWTgS0wMSIsImNoYW5uZWxJZCI6MTEsInN0YXR1cyI6MH0%3D&sign=1741120cdda4b3a50fe59224595da88f
data解密后的示例
{
"amount": 1.0,
"orderNo": "HUA10186164412",
"payTime": "2021-07-05 14:42:33",
"goodsId": "1",
"channelUid": "1185913397901139",
"selfDefine": "透传参数",
"channel": "huawei",
"quickChannelId": 24,
"qkChannelId": 24,
"gameOrder": "cpOrderId_1625467612130",
"goodsName": "商品ID自定义测试商品-01",
"channelId": 11,
"isTest": 0, // 是否为母包测试,1为母包测试, 0为其他渠道
"status": 0 // 0代表成功,不为0代表失败
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2.4 返回响应
- SUCCESS
- 注意,只有这7个字符,不要有空白或其它字符;
- 表示支付结果正常受理,
流程结束
。
- ABORT
- 表示
支付结果受理但有异常,流程结束
,SDK 服务端不再重试通知该订单的结果; - 也可以返回 ABORT:描述信息 来补充少量说明信息;
- 表示
- 其它情况均表示
支付结果受理异常,流程未结束 ,SDK 会定时重试通知回调地址(见下文 回调重试策略);
2.5 回调重试策略
回调通知会在24小时内,每间隔10分钟通知一次,直至收到SUCCESS应答后停止。
苹果、谷歌、华为由于是小票机制校验,可能会存在小票延迟的情况,这样会导致长时间不会到账;客户端会有轮询机制上报小票,24小时之内如果成功都会通知游戏服务器
2.6 发货条件(非常重要)
支付回调的成功响应只能确保玩家完成了支付行为,CP 需要独立校验该订单的合法性(cp 订单号与 amount、goodId,userId 等是否匹配),确认无误后才可以发货,否则会有潜在的刷单风险。
需要 CP 独立校验的字段包括:
1、渠道id是否一致
2、用户信息是否一致
3、自定义信息是否正确
4、金额档位是否正确
5、订单号是否一致
6、其它 `根据实际游戏业务需要验证的字段进行判断`
2
3
4
5
6
# 3 支付退款
3.1 退款接口说明
在
用户退款 后,SDK服务器会将支付结果通知给游戏(CP)提供的回调地址。退款支持渠道: 目前只支持
utral-海外iOS (渠道id:3) 、utral-海外Android (渠道id:4) 、utral-国内iOS (渠道id:8) 退款回调地址: 开始前请务必在【SDK管理后台 (opens new window)-游戏管理-游戏基础信息】中填写
退款回调地址
请求方法:
POST
3.2 退款回调参数
字段 | 名称 | 重要性 | 类型 | 说明 |
---|---|---|---|---|
data | String | 必须 | 通知主要内容,需要解密。格式见下文 | |
sign | String | 必须 | 签名 |
data各字段说明:
参数 | 类型 | 重要性 | 来源 | 描述 |
---|---|---|---|---|
amount | Double | 必须 | SDK | 成交金额,单位元 |
gameOrder | Sring | 必须 | 游戏 | 游戏订单号 |
orderNo | String | 必须 | SDK | 整合sdk订单号 |
status | int | 必须 | SDK | 交易状态,0表示成功 |
selfDefine | String | 可选 | 游戏 | 透传参数 |
channelUid | String | 必须 | SDK | 渠道的用户id |
payTime | String | 必须 | SDK | 交易时间yyyy-MM-dd HH:mm:ss |
channel | String | 必须 | SDK | 渠道类型 |
channelId | String | 必须 | SDK | 渠道ID |
goodsId | String | 必须 | SDK | 渠道的档位ID |
int | 必须 | SDK | 退款状态,1表示退款订单 | |
String | 必须 | SDK | 用户退款时间 |
额外字段说明,是代金券、iOS订阅、其他需求可使用
参数 | 类型 | 重要性 | 来源 | 描述 |
---|---|---|---|---|
iap_sub_expire | String | 必须 | SDK | 订阅:过期时间 仅国内iOS渠道下有该字段 |
paytype | String | 必须 | SDK | 支付类型 仅国内iOS渠道下有该字段 |
dealAmount | String | 可选 | SDK | 使用了SDK代金券 实际支付的金额 仅国内渠道下有该字段 |
3.3 退款回调数据示例
data解密后的示例
{
"iap_sub_expire": "",
"amount": 30,
"orderNo": "HUA10********",
"payTime": "2020-06-28 18:26:14",
"goodsId": "****",
"channelUid": "*****",
"selfDefine": "****",
"channel": "iultra",
"sandbox": "",
"iap_sub": "",
"qkChannelId": 0,
"gameOrder": "****",
"refund_time": "2020-06-29 02:34:20",
"goodsName": "****",
"channelId": 56,
"status": 0, // 0代表成功,不为0代表失败
"refund": 1
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
3.4 退款回调返回响应
SUCCESS (注意,只有这7个字符,不能有空白或其它字符)
通知的解密签名计算
- 参考 签名计算规则
3.5 退款回调重试策略 退款回调通知每间隔5分钟连续通知3次,在收到SUCCESS应答后即停止。