Skip to main content

API 接入文档

1. 接入概览

项目说明
域名https://api-bs.360xpay.com
基础路径/api/v1/
协议HTTPS
请求方式POST
请求格式Content-Type: application/json
鉴权方式Header: Authorization: api-key {apiKey}
签名算法HMAC-SHA256,Base64 输出
下单超时服务端异步任务超时时间 300 秒

说明:服务端也兼容 Authorization: {apiKey},但建议统一使用 api-key 前缀。

2. 通用响应格式

所有商户主动调用接口统一返回:

字段类型说明
codeInteger业务响应码,0 表示成功
messageString响应描述
dataStringJSON 字符串;客户端需要再次 JSON 解析

示例:

{
"code": 0,
"message": "success",
"data": "{\"transactionNo\":\"COLL123\",\"merchantOrderNo\":\"M202604300001\",\"amount\":\"100.00\"}"
}

为便于阅读,本文后续示例会把 data 展开为 JSON 对象。当前实现会把响应数据中的金额类数值转换为字符串。

3. 签名规则

3.1 Authorization

每个商户由平台分配:

凭据用途
apiKey放在 Authorization 请求头中,用于识别商户
signKey用于请求签名和平台回调验签

请求头示例:

Authorization: api-key YOUR_API_KEY
Content-Type: application/json

3.2 签名生成步骤

  1. 根据接口签名字段白名单取值,不参与签名的字段不要放入签名串。
  2. 移除值为 null 的字段。
  3. 移除空字符串字段。
  4. 按字段名升序排序。
  5. 拼接为 key=value&key=value
  6. 使用 signKey 对拼接串做 HMAC-SHA256。
  7. 将摘要结果 Base64 编码,得到 sign

伪代码:

stringA = sort(params)
.filter(value != null && value != "")
.map(key + "=" + value)
.join("&")

sign = Base64(HMAC_SHA256(stringA, signKey))

Java 示例:

Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(signKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
String sign = Base64.getEncoder().encodeToString(mac.doFinal(stringA.getBytes(StandardCharsets.UTF_8)));

3.3 金额与对象字段注意事项

项目要求
amount建议使用普通十进制格式,如 100.00,不要使用科学计数法
sign不参与签名
channelParams如果传入,会参与签名;不同语言对象字符串化结果可能不一致,建议为空或与平台联调确认
manualOrderType不传时下单默认为系统订单;如果传入,会参与签名

4. 订单状态

状态码状态名说明
0PENDING待处理
1PROCESSING处理中
2SUCCESS成功
3FAILED失败
4EXPIRED已过期
5REVERSED已冲正

接口返回中的 status 当前为字符串形式的状态码,如 "1""2"

5. 创建代收订单

项目说明
URL/api/v1/createCollectionOrder
MethodPOST
鉴权需要 Authorization
签名需要

5.1 请求字段

字段类型必填是否参与签名说明
merchantIdString商户 ID
merchantOrderNoString商户订单号,代收订单内唯一
paymentNoString商户通道编码
amountDecimal代收金额,必须大于 0
currencyString币种,如 VNDPKRIDRUSDCNY
notificationUrlString平台异步通知商户的回调地址
channelParamsString是,非空时参与渠道扩展参数
remarkString是,非空时参与备注
manualOrderTypeInteger是,非空时参与API 默认不传;调试可选 34 ,3 :会发生金额的测试订单, 4 : 不会发生金额,可回退订单
signString请求签名

签名字段白名单:

merchantId, merchantOrderNo, paymentNo, amount, currency, notificationUrl, channelParams, remark, manualOrderType

5.2 请求示例

{
"merchantId": "M10001",
"merchantOrderNo": "COLL202604300001",
"paymentNo": "PAYMENT_A",
"amount": "100.00",
"currency": "USDT",
"notificationUrl": "https://merchant.example.com/api/v1/notify",
"remark": "test collection",
"sign": "BASE64_HMAC_SHA256_SIGN"
}

5.3 成功响应 data

data 为 JSON 对象;实际接口外层 data 字段当前以 JSON 字符串形式返回,客户端需要先解析。

字段类型说明
amountString订单金额
transactionNoString平台交易号,代收以 COLL 开头
merchantOrderNoString商户订单号
currencyString币种
createTimeString当前代收创建响应为时间字符串
statusString订单状态码
qrCodeString可选,渠道返回图片或者 Base64
cashierUrlString可选,渠道返回收银台地址
payUrlString可选,渠道返回支付地址

示例:

{
"code": 0,
"message": "success",
"data": {
"amount": "100.00",
"transactionNo": "COLL1234567890",
"merchantOrderNo": "COLL202604300001",
"currency": "USDT",
"createTime": "1776052048",
"status": "1",
"payUrl": "https://pay.example.com/order/xxx"
}
}

6. 创建代付订单

项目说明
URL/api/v1/createPayOutOrder
MethodPOST
鉴权需要 Authorization
签名需要

6.1 请求字段

字段类型必填是否参与签名说明
merchantIdString商户 ID
merchantOrderNoString商户订单号,代付订单内唯一
paymentNoString商户通道编码
amountDecimal代付金额,必须大于 0
currencyString币种
notificationUrlString平台异步通知商户的回调地址
bankCodeString是,非空时参与收款银行或支付机构编码;如果 channelParams 已包含渠道所需信息,可为空
accountNameString是,非空时参与收款账户名称
accountNoString是,非空时参与收款账号
channelParamsString是,非空时参与渠道扩展参数
remarkString是,非空时参与备注
manualOrderTypeInteger是,非空时参与API 默认不传;调试可选 34 ,3 :会发生金额的测试订单, 4 : 不会发生金额,可回退订单
signString请求签名

签名字段白名单:

merchantId, merchantOrderNo, paymentNo, amount, currency, notificationUrl, bankCode, accountName, accountNo, channelParams, remark, manualOrderType

6.2 请求示例

{
"merchantId": "M10001",
"merchantOrderNo": "PAY202604300001",
"paymentNo": "PAYOUT_A",
"amount": "50.00",
"currency": "USDT",
"notificationUrl": "https://merchant.example.com/pakgopay/notify",
"bankCode": "BANK001",
"accountName": "Alice",
"accountNo": "1234567890",
"remark": "test payout",
"sign": "BASE64_HMAC_SHA256_SIGN"
}

6.3 成功响应 data

data 为 JSON 对象;实际接口外层 data 字段当前以 JSON 字符串形式返回,客户端需要先解析。

字段类型说明
amountString订单金额
transactionNoString平台交易号,代付以 PAY 开头
merchantOrderNoString商户订单号
currencyString币种
createTimeString当前代付创建响应为时间戳字符串
statusString订单状态码

7. 查询订单

项目说明
URL/api/v1/queryOrder
MethodPOST
鉴权需要 Authorization
签名需要

当前实现按商户订单号查询当前月订单;跨月历史订单需要平台另行扩展查询范围。

7.1 请求字段

字段类型必填是否参与签名说明
merchantIdString商户 ID
merchantOrderNoString商户订单号
orderTypeString订单类型:COLL 代收,PAY 代付
signString请求签名

签名字段白名单:

merchantId, merchantOrderNo, orderType

7.2 请求示例

{
"merchantId": "M10001",
"merchantOrderNo": "COLL202604300001",
"orderType": "COLL",
"sign": "BASE64_HMAC_SHA256_SIGN"
}

7.3 成功响应 data

字段类型说明
merchantOrderNoString商户订单号
transactionNoString平台交易号
amountString订单金额
currencyString币种
statusString订单状态码
createTimeString时间戳字符串
updateTimeString时间戳秒字符串
failureReasonString失败原因;仅失败订单返回,当前实现可能为空字符串
successCallBackTimeString/null成功回调时间;仅成功订单返回

8. 查询余额

项目说明
URL/api/v1/balance
MethodPOST
鉴权需要 Authorization
签名需要

8.1 请求字段

字段类型必填是否参与签名说明
merchantIdString商户 ID
signString请求签名

签名字段白名单:

merchantId

8.2 请求示例

{
"merchantId": "M10001",
"sign": "BASE64_HMAC_SHA256_SIGN"
}

8.3 成功响应 data

data 按币种分组,每个币种包含可用、冻结、总额。

字段类型说明
{currency}.availableString可用余额
{currency}.frozenString冻结余额
{currency}.totalString总余额

示例:

{
"code": 0,
"message": "success",
"data": {
"USDT": {
"available": "1000.00",
"frozen": "50.00",
"total": "1050.00"
}
}
}

9. 平台异步通知商户

商户在创建订单时传入 notificationUrl,订单终态变化后平台会向该地址发起 POST application/json 通知。

9.1 代收通知字段

字段类型是否参与签名说明
merchantUserIdString商户 ID
transactionNoString平台交易号
merchantOrderNoString商户订单号
createTimeString订单创建时间,时间戳字符串
amountString原订单金额,保留 2 位小数
actualAmountString实际金额,保留 2 位小数
merchantFeeString商户手续费,保留 2 位小数
depositTimeString是,非空时参与成功时间,时间戳字符串
notifyTimeString通知发送时间,时间戳字符串
statusString状态名,如 SUCCESSFAILED
origAmountString原始金额,保留 2 位小数
payerNameString/null否,当前为空付款人名称
signString平台回调签名

9.2 代付通知字段

字段类型是否参与签名说明
merchantUserIdString商户 ID
transactionNoString平台交易号
merchantOrderNoString商户订单号
createTimeString订单创建时间,时间戳字符串
amountString原订单金额,保留 2 位小数
actualAmountString实际金额,保留 2 位小数
merchantFeeString商户手续费,保留 2 位小数
depositTimeString是,非空时参与成功时间 ,时间戳字符串
notifyTimeString通知发送时间,时间戳字符串
statusString状态名,如 SUCCESSFAILED
origAmountString原始金额,保留 2 位小数
fromCardNoString/null否,当前为空出款卡号
signString平台回调签名

9.3 商户响应要求

平台认为商户通知成功的条件:商户回调接口返回 JSON,且响应体中的 code200

推荐响应:

{
"code": 200,
"data": "ok"
}

10. 常见错误码

codemessage说明
0success成功
1server internal error服务内部错误
100113request time out请求超时
100115params is invalid参数或签名错误
100118http request error请求上游通道失败
100201request param is valid订单参数校验失败
100202client ip is not in white list请求 IP 不在商户白名单
100203user is not enabled商户未启用
100204merchant order id is exits商户订单号重复
100205the merchant has no available channels.商户无可用通道
100206the order over amount limit.订单金额超过限制
100207exceeding the daily/monthly available limit for the channel通道日/月限额不足
100208channel is not support this currency通道不支持币种
100209merchant is not support collection商户不支持代收
100210merchant is not support payout商户不支持代付
100211merchantOrderNo is not exits商户订单号不存在
100212user has no balance data商户无余额数据
100213merchants with insufficient available balance商户余额不足

11. 签名验证

平台请求与平台回调均使用同一套签名规则:按字段白名单过滤、移除 null 和空字符串、按字段名升序拼接 key=value,再使用 signKey 做 HMAC-SHA256 并进行 Base64 编码。详细说明见 签名验证说明

12. 联调检查清单

检查项要求
HeaderAuthorization 使用平台分配的 apiKey
签名按接口白名单字段签名,排除 sign
金额使用普通十进制字符串,避免科学计数法
商户订单号同一订单类型下保持唯一
IP 白名单代收、代付分别配置对应请求源 IP 白名单
回调验签使用同一 signKey 按 HMAC-SHA256 + Base64 验签
回调响应返回 JSON 且 code=200