Skip to content

MoneyWave 商户接入接口文档 ​

1. 接入约定 ​

1.1 基础地址 ​

由平台分配实际环境地址,本文以占位地址表示:

text
https://{payment-api-domain}

1.2 请求格式 ​

下单接口支持以下两种请求格式:

  • application/x-www-form-urlencoded
  • application/json

查单、退款、退款查询接口按当前实现从 request.getParameterMap() 读取参数,建议使用:

  • application/x-www-form-urlencoded

代付申请、代付查询接口支持以下两种请求格式:

  • application/x-www-form-urlencoded
  • application/json

1.3 通用返回格式 ​

json
{
  "code": "200",
  "message": "请求成功",
  "orderNo": "平台订单号",
  "data": {}
}
字段类型说明
codestring平台返回码,200 表示接口处理成功
messagestring返回说明
orderNostring平台订单号,查单时使用
dataobject/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_Signstring是MD5 签名值,32 位小写十六进制字符串

平台为每个商户分配 t_MerchantId 和 md5Key。md5Key 不参与接口明文传输。

2.2 签名生成步骤 ​

  1. 取所有请求参数。
  2. 移除签名字段 t_Sign。
  3. 移除字段名为 key 的参数。
  4. 移除值为空字符串或 null 的参数。
  5. 按参数名进行大小写不敏感排序。
  6. 按 key=value 用 & 拼接。
  7. 在末尾追加 &key={md5Key}。
  8. 对最终字符串做 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/doPay

3.2 请求参数 ​

字段类型必填说明
t_Versionstring是接口版本号,建议传 1.0
t_MerchantIdstring是平台分配的商户号
t_ChannelIdstring是平台为商户分配的不透明收单路由标识,例如 CH_70000016
t_OrderNostring是商户订单号,商户侧唯一
t_Subjectstring是商品标题
t_Bodystring是商品描述
t_Amountstring是订单金额,按该路由币种的主单位传入,例如 10.00;币种与精度由平台路由配置决定
t_NotifyUrlstring是商户异步通知地址
t_ReturnUrlstring否支付完成后的前端跳转地址
t_ClientIpstring否客户端 IP;不传时平台会尝试取请求 IP
t_DeviceIdstring否设备号
t_Attachstring否商户附加数据,回调时原样返回
t_PayExtrastring否JSON 字符串,扩展参数
t_Signstring是签名

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=4937241000101725
text
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"
}
字段说明
code200 表示平台接单成功
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_MerchantIdstring是平台分配的商户号
t_BeginTimestring否查询开始时间,格式 yyyy-MM-dd HH:mm:ss;不传默认近 3 天
t_EndTimestring否查询结束时间,格式 yyyy-MM-dd HH:mm:ss;不传默认当前时间
t_Signstring是签名

查单签名参数包含 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 字段说明 ​

字段类型说明
orderIdstring平台订单号
merchantOrderIdstring商户订单号
thirdOrderIdstring上游通道订单号
totalAmountstring实际支付金额,按订单币种主单位返回
orderAmountstring原始订单金额,按订单币种主单位返回
statusstring订单状态
failReasonstring支付失败原因;仅失败订单返回有效值
returnUrlstring商户前端返回地址

4.6 订单状态 ​

status说明
1预下单中
2下单成功,等待支付结果
3下单失败
4支付成功
5支付失败
6退款成功
7退款失败
8部分退款

5. 退款申请接口 ​

5.1 接口信息 ​

text
POST /payment/refund

5.2 请求参数 ​

字段类型必填说明
t_MerchantIdstring是平台分配的商户号
t_OutRefundNostring是商户退款单号;同一商户下唯一,用于幂等
t_OrderNostring条件必填平台订单号;与 t_OutOrderNo 至少传一个
t_OutOrderNostring条件必填商户订单号;与 t_OrderNo 至少传一个
t_RefundAmountstring否退款金额,按原订单币种主单位传入;不传时默认退当前剩余可退金额
t_RefundReasonstring否退款原因
t_FinishTimestring否原订单完成时间,格式 yyyyMMddHHmmss;不传默认按当前时间所在月份查询
t_Signstring是签名

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 字段说明 ​

字段类型说明
statusinteger退款状态:1 处理中,2 成功,3 失败,4 错误
refundAmountstring本次申请退款金额,按原订单币种主单位返回
actualRefundAmountstring本次实际退款金额,按原订单币种主单位返回
refundFeestring本次退款手续费,按原订单币种主单位返回
refundNostring平台退款单号
outRefundNostring商户退款单号
orderRefundedAmountstring当前订单累计成功退款金额,按原订单币种主单位返回
orderRefundingAmountstring当前订单退款中金额,按原订单币种主单位返回
orderRefundableAmountstring当前订单剩余可退金额,按原订单币种主单位返回
retMsgstring通道或平台返回说明

5.7 失败响应示例 ​

json
{
  "code": "412",
  "message": "可退金额不足,当前可退金额:7.00",
  "orderNo": null,
  "data": null
}

6. 退款查询接口 ​

6.1 接口信息 ​

text
POST /payment/refund/query

6.2 请求参数 ​

字段类型必填说明
t_MerchantIdstring是平台分配的商户号
t_OutRefundNostring是商户退款单号
t_OrderNostring否平台订单号
t_OutOrderNostring否商户订单号
t_Signstring是签名

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_MerchantIdstring是平台分配的商户号
t_MerchantTradeNostring是商户代付单号,商户侧唯一,用于幂等
t_ChannelIdstring是平台为商户分配的不透明代付路由标识,例如 TH_OUT_01
t_Amountstring是代付金额,按该路由币种的主单位传入,例如 100.00;精度由平台路由配置决定
t_HolderNamestring是收款人姓名
t_HolderPhonestring否收款人手机号
t_HolderIdNumstring否收款人证件号
t_BankNamestring否银行名称
t_SubbranchNamestring否支行名称
t_BankNostring否银行联行号或银行编码
t_Provincestring否银行省份编码或名称
t_Citystring否银行城市编码或名称
t_AccountTypestring否收款类型,按具体渠道要求传递
t_ReceiverAccountTypestring否收款账户类型,按具体渠道要求传递
t_CardNostring是收款银行卡号或收款账号
t_CardTypestring否银行卡类型,按具体渠道要求传递
t_NotifyUrlstring否商户代付结果异步通知地址;需要接收代付结果通知时必填
t_Remarkstring否商户备注
t_Signstring是签名

代付签名规则同第 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"
}
字段类型说明
codenumber200 表示平台已受理
messagestring受理说明
timestampnumber平台响应时间戳
datastring平台代付单号 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_MerchantIdstring是平台分配的商户号
t_Signstring是签名

代付查询签名参数仅包含请求体或表单中的非空字段,不包含路径中的 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 字段说明 ​

字段类型说明
agentTradeNostring平台代付单号
merchantTradeNostring商户代付单号
merchantIdstring商户号
receiveAmountstring收款金额,按该代付路由币种的主单位返回
receiverNamestring收款人姓名
bankAccountstring收款账号
statusstring代付状态
tranMsgstring通道或平台处理说明
notifyStatusnumber商户回调状态:0 未发送,2 商户未收到,3 商户返回失败,4 商户返回成功
notifyTimestring最近一次商户回调通知时间
createTimestring创建时间
updateTimestring更新时间

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_MerchantIdstring是平台分配的商户号
t_ChannelIdstring是平台为商户分配的不透明代付路由标识
t_Signstring是签名

代付余额查询签名规则同第 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 字段说明 ​

字段类型说明
merchantIdstring商户号
availableAmountstring可用余额,按路由币种主单位返回
frozenAmountstring冻结金额,按路由币种主单位返回
pendingAmountstring在途金额,按路由币种主单位返回
reserveAmountstring保证金金额,按路由币种主单位返回
totalAmountstring账户总额,按路由币种主单位返回,计算方式为 availableAmount + frozenAmount + pendingAmount + reserveAmount
updateTimestring余额最近更新时间

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-urlencoded

10.2 回调参数 ​

字段类型必填说明
n_MerchantIdstring是商户号
n_TradeNostring是商户代付单号
n_AllPayTradeNostring是平台代付单号
n_TotalAmountstring是代付金额,按代付路由币种主单位返回
n_ReceiveAmountstring是收款金额,按代付路由币种主单位返回
n_Statusstring是代付状态,01 表示成功,03 表示失败
n_ThirdTradeNostring否上游通道代付单号
n_ChannelIdstring否商户代付路由标识
n_TranMsgstring否通道或平台处理说明
n_NotifyTimestring是通知时间,格式 yyyyMMddHHmmss
signstring是回调签名

10.3 回调签名验证 ​

代付回调签名同样使用 MD5。

  1. 取所有回调参数。
  2. 移除 sign 字段。
  3. 移除空值参数。
  4. 按参数名进行大小写不敏感排序。
  5. 按 key=value 用 & 拼接。
  6. 追加 &key={md5Key}。
  7. 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=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

10.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-urlencoded

11.2 回调参数 ​

字段类型必填说明
n_TradeNostring是商户订单号
n_AllPayTradeNostring是平台订单号
n_MerchantIdstring是商户号
n_TotalAmountstring是实际支付金额,按订单币种主单位返回
n_OrderAmountstring是原始订单金额,按订单币种主单位返回
n_Statusstring是订单状态,4 表示支付成功,8 表示部分退款,6 表示全额退款
n_ChannelIdstring是商户收单路由标识
n_OriginOrderIdstring否上游原始订单号
n_ThirdOrderIdstring否上游通道订单号
n_FailReasonstring否支付失败原因;仅支付失败时返回
n_Subjectstring否商品标题
n_Bodystring否商品描述
n_Attachstring否商户附加数据
n_NotifyTimestring是通知时间,格式 yyyyMMddHHmmss
signstring是回调签名

11.3 回调签名验证 ​

回调签名同样使用 MD5。

  1. 取所有回调参数。
  2. 移除 sign 字段。
  3. 移除空值参数。
  4. 按参数名进行大小写不敏感排序。
  5. 按 key=value 用 & 拼接。
  6. 追加 &key={md5Key}。
  7. 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=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

11.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 编码后再计算;以实际传输的业务值参与签名。
  • 商户应保存平台订单号、商户订单号、订单状态和回调原文,便于对账和问题排查。