MoneyWave 商户接入接口文档
1. 接入约定
1.1 基础地址
由平台分配实际环境地址,本文以占位地址表示:
text
https://{payment-api-domain}1.2 请求格式
下单接口支持以下两种请求格式:
application/x-www-form-urlencodedapplication/json
查单、退款、退款查询接口按当前实现从 request.getParameterMap() 读取参数,建议使用:
application/x-www-form-urlencoded
代付申请、代付查询接口支持以下两种请求格式:
application/x-www-form-urlencodedapplication/json
1.3 通用返回格式
json
{
"code": "200",
"message": "请求成功",
"orderNo": "平台订单号",
"data": {}
}| 字段 | 类型 | 说明 |
|---|---|---|
| code | string | 平台返回码,200 表示接口处理成功 |
| message | string | 返回说明 |
| orderNo | string | 平台订单号,查单时使用 |
| data | object/string | 业务数据;不同接口不同 |
1.4 常见返回码
| code | 说明 |
|---|---|
| 200 | 请求成功 |
| 201 | 签名错误 |
| 303 | 参数错误 |
| 400 | 商户未开通 |
| 401 | 支付渠道未开通 |
| 402 | 支付场景未开通 |
| 405 | 交易失败 |
| 410 | 退款失败 |
| 411 | 退款中或退款成功 |
| 412 | 退款金额不正确 |
| 502 | 订单不存在 |
| 509 | 订单未支付 |
| 510 | 退款订单不存在 |
| 998 | 服务繁忙 |
| 999 | 服务请求错误 |
代付接口使用独立返回包装,常见返回码如下:
| code | 说明 |
|---|---|
| 200 | 请求成功 |
| 500 | 业务处理失败 |
2. 签名规则
当前商户接口使用 MD5 签名。
2.1 签名字段
请求参数中需要携带:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| t_Sign | string | 是 | MD5 签名值,32 位小写十六进制字符串 |
平台为每个商户分配 t_MerchantId 和 md5Key。md5Key 不参与接口明文传输。
2.2 签名生成步骤
- 取所有请求参数。
- 移除签名字段
t_Sign。 - 移除字段名为
key的参数。 - 移除值为空字符串或
null的参数。 - 按参数名进行大小写不敏感排序。
- 按
key=value用&拼接。 - 在末尾追加
&key={md5Key}。 - 对最终字符串做 UTF-8 MD5,得到小写 32 位签名。
如果请求包含 t_PayExtra,它作为一个普通字符串字段参与签名,不展开 JSON 内部字段。签名前后必须使用完全一致的 t_PayExtra 原始字符串,包括字段顺序、空格、转义和大小写。
2.3 签名示例
请求参数:
text
t_Version=1.0
t_MerchantId=10000001
t_ChannelId=CH_70000016
t_OrderNo=M202609200001
t_Subject=Test Order
t_Body=Test Goods
t_Amount=10.00
t_NotifyUrl=https://merchant.example.com/payment/notify
t_ReturnUrl=https://merchant.example.com/payment/return
t_ClientIp=203.0.113.10
t_PayExtra={"card":{"holderFirstName":"lian","holderLastName":"wei","holderEmail":"[email protected]","number":"4937241000101725"}}排序拼接后:
text
t_Amount=10.00&t_Body=Test Goods&t_ChannelId=CH_70000016&t_ClientIp=203.0.113.10&t_MerchantId=10000001&t_NotifyUrl=https://merchant.example.com/payment/notify&t_OrderNo=M202609200001&t_PayExtra={"card":{"holderFirstName":"lian","holderLastName":"wei","holderEmail":"[email protected]","number":"4937241000101725"}}&t_ReturnUrl=https://merchant.example.com/payment/return&t_Subject=Test Order&t_Version=1.0追加密钥:
text
t_Amount=10.00&t_Body=Test Goods&t_ChannelId=CH_70000016&t_ClientIp=203.0.113.10&t_MerchantId=10000001&t_NotifyUrl=https://merchant.example.com/payment/notify&t_OrderNo=M202609200001&t_PayExtra={"card":{"holderFirstName":"lian","holderLastName":"wei","holderEmail":"[email protected]","number":"4937241000101725"}}&t_ReturnUrl=https://merchant.example.com/payment/return&t_Subject=Test Order&t_Version=1.0&key=YOUR_MD5_KEY计算:
text
t_Sign = md5(上述字符串)2.4 Java 示例
java
public static String sign(Map<String, String> params, String md5Key) {
String text = params.entrySet().stream()
.filter(e -> e.getValue() != null && !e.getValue().isEmpty())
.filter(e -> !"t_Sign".equals(e.getKey()))
.filter(e -> !"key".equals(e.getKey()))
.sorted((a, b) -> String.CASE_INSENSITIVE_ORDER.compare(a.getKey(), b.getKey()))
.map(e -> e.getKey() + "=" + e.getValue())
.collect(java.util.stream.Collectors.joining("&"))
.concat("&key=" + md5Key);
return org.apache.commons.codec.digest.DigestUtils.md5Hex(
text.getBytes(java.nio.charset.StandardCharsets.UTF_8));
}3. 下单支付接口
3.1 接口信息
text
POST /payment/doPay3.2 请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| t_Version | string | 是 | 接口版本号,建议传 1.0 |
| t_MerchantId | string | 是 | 平台分配的商户号 |
| t_ChannelId | string | 是 | 平台为商户分配的不透明收单路由标识,例如 CH_70000016 |
| t_OrderNo | string | 是 | 商户订单号,商户侧唯一 |
| t_Subject | string | 是 | 商品标题 |
| t_Body | string | 是 | 商品描述 |
| t_Amount | string | 是 | 订单金额,按该路由币种的主单位传入,例如 10.00;币种与精度由平台路由配置决定 |
| t_NotifyUrl | string | 是 | 商户异步通知地址 |
| t_ReturnUrl | string | 否 | 支付完成后的前端跳转地址 |
| t_ClientIp | string | 否 | 客户端 IP;不传时平台会尝试取请求 IP |
| t_DeviceId | string | 否 | 设备号 |
| t_Attach | string | 否 | 商户附加数据,回调时原样返回 |
| t_PayExtra | string | 否 | JSON 字符串,扩展参数 |
| t_Sign | string | 是 | 签名 |
3.3 t_PayExtra 通用参数
t_PayExtra 是参与签名的普通请求字段。商户侧生成签名时,应使用最终提交的原始 JSON 字符串参与签名,不要在签名后再调整字段顺序或内容。
组装规范:
t_PayExtra的值必须是合法 JSON 对象字符串。- 建议使用无空格压缩 JSON 作为签名和提交值,便于保持字符串一致。
- 签名时不要把
card.number、card.holderEmail等内部字段展开参与排序,只使用t_PayExtra={JSON字符串}这一项。 - 表单提交时可以对
t_PayExtra做 URL 编码,但签名值应以业务原始字符串计算,不要使用 URL 编码后的字符串计算。 - 签名后不要重新序列化
t_PayExtra。重新序列化可能改变字段顺序或空格,导致验签失败。
正确签名字段示例:
text
t_PayExtra={"card":{"holderFirstName":"lian","holderLastName":"wei","holderEmail":"[email protected]","number":"4937241000101725"}}错误示例:
text
card.holderFirstName=lian&card.holderLastName=wei&[email protected]&card.number=4937241000101725text
t_PayExtra=%7B%22card%22%3A%7B%22holderFirstName%22%3A%22lian%22%2C%22holderLastName%22%3A%22wei%22%2C%22holderEmail%22%3A%22odinjack163%40gmail.com%22%2C%22number%22%3A%224937241000101725%22%7D%7D海外支付使用以下结构承载卡信息和账单信息。服务商、国家、币种、支付方式、金额精度和时区均由 t_ChannelId 在平台内部解析,禁止放入 t_PayExtra 或作为顶层请求参数传入。
推荐结构:
json
{
"card": {
"number": "4111111111111111",
"expiry": "YYYY-MM",
"cvv": "123",
"holderFirstName": "John",
"holderLastName": "Doe",
"holderEmail": "[email protected]",
"holderPhone": "85266666666"
},
"billing": {
"addressStreet": "1 Queen Road",
"city": "Hong Kong",
"postalCode": "999077",
"state": "HK",
"country": "HK"
}
}通用字段说明:
| 字段 | 必填 | 说明 |
|---|---|---|
| card.number | 是 | 银行卡号 |
| card.expiry | 是 | 有效期,建议格式 YYYY-MM |
| card.cvv | 是 | CVV/CVC |
| card.holderFirstName | 是 | 持卡人名 |
| card.holderLastName | 是 | 持卡人姓 |
| card.holderEmail | 是 | 持卡人邮箱 |
| card.holderPhone | 是 | 持卡人手机号 |
| billing.addressStreet | 是 | 账单地址 |
| billing.city | 是 | 账单城市 |
| billing.postalCode | 是 | 账单邮编 |
| billing.state | 是 | 账单州/省/地区 |
| billing.country | 是 | 账单国家或地区代码 |
3.5 成功响应示例
收银台/跳转类支付成功创建订单时,接口返回:
json
{
"code": "200",
"message": "生成链接成功",
"orderNo": "1900000000000000001",
"data": "https://payment-page.example.com/checkout/xxx"
}| 字段 | 说明 |
|---|---|
| code | 200 表示平台接单成功 |
| message | 生成链接成功 表示需要商户前端跳转至 data |
| orderNo | 平台订单号,后续查单使用 |
| data | 支付链接或通道返回数据 |
3.6 失败响应示例
json
{
"code": "201",
"message": "签名错误",
"orderNo": null,
"data": null
}4. 查单接口
4.1 接口信息
text
POST /payment/doGet/{outTradeNo}outTradeNo 为平台订单号,即下单接口返回的 orderNo。
4.2 请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| t_MerchantId | string | 是 | 平台分配的商户号 |
| t_BeginTime | string | 否 | 查询开始时间,格式 yyyy-MM-dd HH:mm:ss;不传默认近 3 天 |
| t_EndTime | string | 否 | 查询结束时间,格式 yyyy-MM-dd HH:mm:ss;不传默认当前时间 |
| t_Sign | string | 是 | 签名 |
查单签名参数包含 t_MerchantId、可选的 t_BeginTime、t_EndTime,不包含路径中的 outTradeNo。
4.3 请求示例
bash
curl -X POST 'https://{payment-api-domain}/payment/doGet/1900000000000000001' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 't_MerchantId=10000001' \
--data-urlencode 't_BeginTime=2026-09-20 00:00:00' \
--data-urlencode 't_EndTime=2026-09-20 23:59:59' \
--data-urlencode 't_Sign=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'4.4 成功响应示例
json
{
"code": "200",
"message": "订单查询成功",
"orderNo": "1900000000000000001",
"data": {
"orderId": "1900000000000000001",
"merchantOrderId": "M202609200001",
"thirdOrderId": "TP202609200001",
"totalAmount": "10.00",
"orderAmount": "10.00",
"status": "4",
"failReason": null,
"returnUrl": "https://merchant.example.com/payment/return"
}
}4.5 data 字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
| orderId | string | 平台订单号 |
| merchantOrderId | string | 商户订单号 |
| thirdOrderId | string | 上游通道订单号 |
| totalAmount | string | 实际支付金额,按订单币种主单位返回 |
| orderAmount | string | 原始订单金额,按订单币种主单位返回 |
| status | string | 订单状态 |
| failReason | string | 支付失败原因;仅失败订单返回有效值 |
| returnUrl | string | 商户前端返回地址 |
4.6 订单状态
| status | 说明 |
|---|---|
| 1 | 预下单中 |
| 2 | 下单成功,等待支付结果 |
| 3 | 下单失败 |
| 4 | 支付成功 |
| 5 | 支付失败 |
| 6 | 退款成功 |
| 7 | 退款失败 |
| 8 | 部分退款 |
5. 退款申请接口
5.1 接口信息
text
POST /payment/refund5.2 请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| t_MerchantId | string | 是 | 平台分配的商户号 |
| t_OutRefundNo | string | 是 | 商户退款单号;同一商户下唯一,用于幂等 |
| t_OrderNo | string | 条件必填 | 平台订单号;与 t_OutOrderNo 至少传一个 |
| t_OutOrderNo | string | 条件必填 | 商户订单号;与 t_OrderNo 至少传一个 |
| t_RefundAmount | string | 否 | 退款金额,按原订单币种主单位传入;不传时默认退当前剩余可退金额 |
| t_RefundReason | string | 否 | 退款原因 |
| t_FinishTime | string | 否 | 原订单完成时间,格式 yyyyMMddHHmmss;不传默认按当前时间所在月份查询 |
| t_Sign | string | 是 | 签名 |
5.3 业务规则
- 支持部分退款,同一订单可发起多笔退款。
t_RefundAmount必须大于 0,且不能超过订单剩余可退金额。- 剩余可退金额 = 订单支付金额 - 成功退款金额 - 退款中金额。
- 同一个
t_OutRefundNo重复请求时,平台按幂等返回原退款单结果。 - 同一个
t_OutRefundNo不允许变更订单或退款金额。 - 订单状态为
4支付成功或8部分退款时允许继续退款。 - 退款成功后,累计成功退款金额小于订单支付金额时,订单状态为
8部分退款;累计成功退款金额等于订单支付金额时,订单状态为6退款成功。 - 若订单存在争议、RDR 预防记录等阻断状态,平台会拒绝普通退款。
5.4 请求示例
bash
curl -X POST 'https://{payment-api-domain}/payment/refund' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 't_MerchantId=10000001' \
--data-urlencode 't_OutRefundNo=R202609210001' \
--data-urlencode 't_OrderNo=1900000000000000001' \
--data-urlencode 't_RefundAmount=3.00' \
--data-urlencode 't_RefundReason=Customer requested partial refund' \
--data-urlencode 't_Sign=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'5.5 成功响应示例
json
{
"code": "200",
"message": "请求成功",
"orderNo": "2100000000000000001",
"data": {
"status": 1,
"refundAmount": "3.00",
"actualRefundAmount": "3.00",
"refundFee": "0.35",
"refundNo": "2100000000000000001",
"outRefundNo": "R202609210001",
"orderRefundedAmount": "0",
"orderRefundingAmount": "3.00",
"orderRefundableAmount": "7.00",
"retMsg": "退款处理中"
}
}5.6 data 字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
| status | integer | 退款状态:1 处理中,2 成功,3 失败,4 错误 |
| refundAmount | string | 本次申请退款金额,按原订单币种主单位返回 |
| actualRefundAmount | string | 本次实际退款金额,按原订单币种主单位返回 |
| refundFee | string | 本次退款手续费,按原订单币种主单位返回 |
| refundNo | string | 平台退款单号 |
| outRefundNo | string | 商户退款单号 |
| orderRefundedAmount | string | 当前订单累计成功退款金额,按原订单币种主单位返回 |
| orderRefundingAmount | string | 当前订单退款中金额,按原订单币种主单位返回 |
| orderRefundableAmount | string | 当前订单剩余可退金额,按原订单币种主单位返回 |
| retMsg | string | 通道或平台返回说明 |
5.7 失败响应示例
json
{
"code": "412",
"message": "可退金额不足,当前可退金额:7.00",
"orderNo": null,
"data": null
}6. 退款查询接口
6.1 接口信息
text
POST /payment/refund/query6.2 请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| t_MerchantId | string | 是 | 平台分配的商户号 |
| t_OutRefundNo | string | 是 | 商户退款单号 |
| t_OrderNo | string | 否 | 平台订单号 |
| t_OutOrderNo | string | 否 | 商户订单号 |
| t_Sign | string | 是 | 签名 |
6.3 请求示例
bash
curl -X POST 'https://{payment-api-domain}/payment/refund/query' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 't_MerchantId=10000001' \
--data-urlencode 't_OutRefundNo=R202609210001' \
--data-urlencode 't_OrderNo=1900000000000000001' \
--data-urlencode 't_Sign=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'6.4 成功响应示例
json
{
"code": "200",
"message": "请求成功",
"orderNo": "2100000000000000001",
"data": {
"status": 2,
"refundAmount": "3.00",
"actualRefundAmount": "3.00",
"refundFee": "0.35",
"refundNo": "2100000000000000001",
"outRefundNo": "R202609210001",
"orderRefundedAmount": "3.00",
"orderRefundingAmount": "0",
"orderRefundableAmount": "7.00",
"retMsg": "退款成功"
}
}7. 代付申请接口
7.1 接口信息
text
POST /agent/payment该接口用于商户通过 API 发起单笔代付申请。平台接收成功后会创建代付批次和代付记录,并冻结对应统一账户余额,后续由平台定时任务或通道处理流程提交至上游。
7.2 请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| t_MerchantId | string | 是 | 平台分配的商户号 |
| t_MerchantTradeNo | string | 是 | 商户代付单号,商户侧唯一,用于幂等 |
| t_ChannelId | string | 是 | 平台为商户分配的不透明代付路由标识,例如 TH_OUT_01 |
| t_Amount | string | 是 | 代付金额,按该路由币种的主单位传入,例如 100.00;精度由平台路由配置决定 |
| t_HolderName | string | 是 | 收款人姓名 |
| t_HolderPhone | string | 否 | 收款人手机号 |
| t_HolderIdNum | string | 否 | 收款人证件号 |
| t_BankName | string | 否 | 银行名称 |
| t_SubbranchName | string | 否 | 支行名称 |
| t_BankNo | string | 否 | 银行联行号或银行编码 |
| t_Province | string | 否 | 银行省份编码或名称 |
| t_City | string | 否 | 银行城市编码或名称 |
| t_AccountType | string | 否 | 收款类型,按具体渠道要求传递 |
| t_ReceiverAccountType | string | 否 | 收款账户类型,按具体渠道要求传递 |
| t_CardNo | string | 是 | 收款银行卡号或收款账号 |
| t_CardType | string | 否 | 银行卡类型,按具体渠道要求传递 |
| t_NotifyUrl | string | 否 | 商户代付结果异步通知地址;需要接收代付结果通知时必填 |
| t_Remark | string | 否 | 商户备注 |
| t_Sign | string | 是 | 签名 |
代付签名规则同第 2 节。签名参数包含所有非空请求字段,不包含 t_Sign 和 key。
7.3 业务规则
- 商户必须已开通并处于启用状态。
t_ChannelId必须是平台为当前商户启用的代付路由;平台在内部解析服务商账户、国家、币种、代付方式、金额精度和费用配置。- 商户不得提交
providerCode、providerAccountId、country、currency、paymentMethod、amountScale、timezone、t_PayChannel或t_PayScene。 - 平台按路由对应的商户、服务商与币种查找统一账户;账户不存在或余额不足时拒绝受理。
- 冻结金额 = 代付金额 + 固定代付手续费 + 比例代付手续费 + 保证金。
- 同一商户下
t_MerchantTradeNo不允许重复;重复提交会返回业务失败。 - 接口受理成功不代表代付成功,只代表平台已创建代付记录并进入处理中状态。
- 代付最终成功或失败后,若申请时传入
t_NotifyUrl,平台会向该地址发送代付结果回调。
7.4 请求示例
bash
curl -X POST 'https://{payment-api-domain}/agent/payment' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 't_MerchantId=10000001' \
--data-urlencode 't_MerchantTradeNo=AP202609240001' \
--data-urlencode 't_ChannelId=TH_OUT_01' \
--data-urlencode 't_Amount=100.00' \
--data-urlencode 't_HolderName=John Doe' \
--data-urlencode 't_HolderPhone=85266666666' \
--data-urlencode 't_BankName=Example Bank' \
--data-urlencode 't_SubbranchName=Central Branch' \
--data-urlencode 't_BankNo=EXAMPLEBANK' \
--data-urlencode 't_CardNo=6222000000000000000' \
--data-urlencode 't_AccountType=BANK_CARD' \
--data-urlencode 't_NotifyUrl=https://merchant.example.com/payout/notify' \
--data-urlencode 't_Remark=single payout' \
--data-urlencode 't_Sign=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'7.5 成功响应示例
json
{
"code": 200,
"message": "代付处理中",
"timestamp": 1790179200000,
"data": "2100000000000000001001"
}| 字段 | 类型 | 说明 |
|---|---|---|
| code | number | 200 表示平台已受理 |
| message | string | 受理说明 |
| timestamp | number | 平台响应时间戳 |
| data | string | 平台代付单号 agentTradeNo |
7.6 失败响应示例
json
{
"code": 500,
"message": "统一账户可提现余额不足",
"timestamp": 1790179200000,
"data": null
}8. 代付查询接口
8.1 接口信息
text
POST /agent/doGet/{merchantTradeNo}merchantTradeNo 为商户代付单号,即代付申请接口中的 t_MerchantTradeNo。
8.2 请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| t_MerchantId | string | 是 | 平台分配的商户号 |
| t_Sign | string | 是 | 签名 |
代付查询签名参数仅包含请求体或表单中的非空字段,不包含路径中的 merchantTradeNo。
8.3 请求示例
bash
curl -X POST 'https://{payment-api-domain}/agent/doGet/AP202609240001' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 't_MerchantId=10000001' \
--data-urlencode 't_Sign=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'8.4 成功响应示例
json
{
"code": 200,
"message": "success",
"timestamp": 1790179200000,
"data": {
"agentTradeNo": "2100000000000000001001",
"merchantTradeNo": "AP202609240001",
"merchantId": "10000001",
"receiveAmount": "100.00",
"receiverName": "John Doe",
"bankAccount": "6222000000000000000",
"status": "04",
"tranMsg": null,
"notifyStatus": 0,
"notifyTime": null,
"createTime": "2026-09-24T10:00:00.000+08:00",
"updateTime": "2026-09-24T10:00:00.000+08:00"
}
}8.5 data 字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
| agentTradeNo | string | 平台代付单号 |
| merchantTradeNo | string | 商户代付单号 |
| merchantId | string | 商户号 |
| receiveAmount | string | 收款金额,按该代付路由币种的主单位返回 |
| receiverName | string | 收款人姓名 |
| bankAccount | string | 收款账号 |
| status | string | 代付状态 |
| tranMsg | string | 通道或平台处理说明 |
| notifyStatus | number | 商户回调状态:0 未发送,2 商户未收到,3 商户返回失败,4 商户返回成功 |
| notifyTime | string | 最近一次商户回调通知时间 |
| createTime | string | 创建时间 |
| updateTime | string | 更新时间 |
8.6 代付状态
| status | 说明 |
|---|---|
| 00 | 代付受理成功 |
| 01 | 代付成功 |
| 03 | 代付失败 |
| 04 | 代付处理中 |
| 05 | 代付出错 |
8.7 失败响应示例
json
{
"code": 500,
"message": "代付记录不存在",
"timestamp": 1790179200000,
"data": null
}9. 代付余额查询接口
9.1 接口信息
text
POST /agent/balance该接口用于商户查询指定出金渠道下的平台统一账户余额。返回余额为平台本地统一账户余额,不直接代表上游服务商实时余额。
9.2 请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| t_MerchantId | string | 是 | 平台分配的商户号 |
| t_ChannelId | string | 是 | 平台为商户分配的不透明代付路由标识 |
| t_Sign | string | 是 | 签名 |
代付余额查询签名规则同第 2 节。签名参数包含所有非空请求字段,不包含 t_Sign 和 key。
9.3 请求示例
bash
curl -X POST 'https://{payment-api-domain}/agent/balance' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 't_MerchantId=10000001' \
--data-urlencode 't_ChannelId=TH_OUT_01' \
--data-urlencode 't_Sign=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'9.4 成功响应示例
json
{
"code": 200,
"message": "success",
"timestamp": 1790179200000,
"data": {
"merchantId": "10000001",
"availableAmount": "1000.00",
"frozenAmount": "200.00",
"pendingAmount": "0",
"reserveAmount": "50.00",
"totalAmount": "1250.00",
"updateTime": "2026-09-28T10:00:00.000+08:00"
}
}9.5 data 字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
| merchantId | string | 商户号 |
| availableAmount | string | 可用余额,按路由币种主单位返回 |
| frozenAmount | string | 冻结金额,按路由币种主单位返回 |
| pendingAmount | string | 在途金额,按路由币种主单位返回 |
| reserveAmount | string | 保证金金额,按路由币种主单位返回 |
| totalAmount | string | 账户总额,按路由币种主单位返回,计算方式为 availableAmount + frozenAmount + pendingAmount + reserveAmount |
| updateTime | string | 余额最近更新时间 |
9.6 失败响应示例
json
{
"code": 500,
"message": "当前商户该渠道统一账户不存在",
"timestamp": 1790179200000,
"data": null
}10. 代付结果回调通知
平台在代付结果变更为终态后,向代付申请时传入的 t_NotifyUrl 发起 HTTP POST 通知。终态包括代付成功和代付失败。
10.1 请求方式
text
POST {t_NotifyUrl}
Content-Type: application/x-www-form-urlencoded10.2 回调参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| n_MerchantId | string | 是 | 商户号 |
| n_TradeNo | string | 是 | 商户代付单号 |
| n_AllPayTradeNo | string | 是 | 平台代付单号 |
| n_TotalAmount | string | 是 | 代付金额,按代付路由币种主单位返回 |
| n_ReceiveAmount | string | 是 | 收款金额,按代付路由币种主单位返回 |
| n_Status | string | 是 | 代付状态,01 表示成功,03 表示失败 |
| n_ThirdTradeNo | string | 否 | 上游通道代付单号 |
| n_ChannelId | string | 否 | 商户代付路由标识 |
| n_TranMsg | string | 否 | 通道或平台处理说明 |
| n_NotifyTime | string | 是 | 通知时间,格式 yyyyMMddHHmmss |
| sign | string | 是 | 回调签名 |
10.3 回调签名验证
代付回调签名同样使用 MD5。
- 取所有回调参数。
- 移除
sign字段。 - 移除空值参数。
- 按参数名进行大小写不敏感排序。
- 按
key=value用&拼接。 - 追加
&key={md5Key}。 - MD5 后与回调中的
sign比对。
10.4 回调示例
text
n_AllPayTradeNo=2100000000000000001001
n_MerchantId=10000001
n_TradeNo=AP202609240001
n_TotalAmount=100.00
n_ReceiveAmount=100.00
n_Status=01
n_ThirdTradeNo=UP202609240001
n_ChannelId=TH_OUT_01
n_TranMsg=payout success
n_NotifyTime=20260924103000
sign=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx10.5 商户响应要求
商户接收并处理成功后,必须返回纯文本:
text
success平台只有在响应内容严格等于 success 时,才认为商户已成功接收通知。其他响应或请求异常均会被记录为通知失败,后台可在代付记录页手动补发通知。
10.6 幂等要求
商户必须以 n_AllPayTradeNo 或 n_TradeNo 做幂等处理。同一笔代付可能收到多次通知,商户不可重复出账或重复更新为冲突状态。
11. 支付结果回调通知
平台在支付结果变更后,向下单时传入的 t_NotifyUrl 发起 HTTP POST 通知。
11.1 请求方式
text
POST {t_NotifyUrl}
Content-Type: application/x-www-form-urlencoded11.2 回调参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| n_TradeNo | string | 是 | 商户订单号 |
| n_AllPayTradeNo | string | 是 | 平台订单号 |
| n_MerchantId | string | 是 | 商户号 |
| n_TotalAmount | string | 是 | 实际支付金额,按订单币种主单位返回 |
| n_OrderAmount | string | 是 | 原始订单金额,按订单币种主单位返回 |
| n_Status | string | 是 | 订单状态,4 表示支付成功,8 表示部分退款,6 表示全额退款 |
| n_ChannelId | string | 是 | 商户收单路由标识 |
| n_OriginOrderId | string | 否 | 上游原始订单号 |
| n_ThirdOrderId | string | 否 | 上游通道订单号 |
| n_FailReason | string | 否 | 支付失败原因;仅支付失败时返回 |
| n_Subject | string | 否 | 商品标题 |
| n_Body | string | 否 | 商品描述 |
| n_Attach | string | 否 | 商户附加数据 |
| n_NotifyTime | string | 是 | 通知时间,格式 yyyyMMddHHmmss |
| sign | string | 是 | 回调签名 |
11.3 回调签名验证
回调签名同样使用 MD5。
- 取所有回调参数。
- 移除
sign字段。 - 移除空值参数。
- 按参数名进行大小写不敏感排序。
- 按
key=value用&拼接。 - 追加
&key={md5Key}。 - MD5 后与回调中的
sign比对。
11.4 回调示例
text
n_AllPayTradeNo=1900000000000000001
n_MerchantId=10000001
n_TradeNo=M202609200001
n_TotalAmount=10.00
n_OrderAmount=10.00
n_Status=4
n_ChannelId=CH_70000016
n_OriginOrderId=TP202609200001
n_ThirdOrderId=TP202609200001
n_Subject=Test Order
n_Body=Test Goods
n_Attach=merchant attach
n_NotifyTime=20260920153000
sign=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx11.5 商户响应要求
商户接收并处理成功后,必须返回纯文本:
text
success平台只有在响应内容严格等于 success 时,才认为商户已成功接收通知。其他响应或请求异常均会被视为通知失败,平台会按重试策略再次通知。
11.6 幂等要求
商户必须以 n_AllPayTradeNo 或 n_TradeNo 做幂等处理。同一笔订单可能收到多次通知,商户不可重复入账。
12. 注意事项
- 收单、退款、代付的请求与商户侧响应金额均使用对应路由币种的主单位;平台内部按能力配置的
amount_scale转为最小单位整数存储。 - 金额精度必须与路由配置一致,例如 THB/USD/BRL 通常最多 2 位小数,IDR 当前为 0 位;平台不做静默截断。
- 商户只能通过平台分配的不透明
t_ChannelId选择业务路由,不得传入服务商、服务商账户、国家、币种、支付方式、金额精度、时区或旧数字通道字段。 - 商户订单号
t_OrderNo必须唯一。 - 商户退款单号
t_OutRefundNo必须唯一,同一退款单号重复请求会按幂等返回原退款结果。 - 商户代付单号
t_MerchantTradeNo必须唯一,同一代付单号重复提交会被拒绝。 - 下单接口返回的
orderNo是平台订单号,查单接口路径参数使用该值。 t_NotifyUrl必须为公网可访问地址。- 签名时不要对参数值做额外 URL 编码后再计算;以实际传输的业务值参与签名。
- 商户应保存平台订单号、商户订单号、订单状态和回调原文,便于对账和问题排查。
