回调
代付有结果、代收付款成功时,我们把结果 POST 到您给的回调地址。收到后先落库,再回 success。
回调只发往公网地址:回调地址写的是内网、本机这类 IP(127.0.0.1、10.x、192.168.x 等)的,提交时就拒;域名解析到这类地址的,到发的时候不发,按一次失败算、照常重试。
代付回调 std1
状态变成 SUCCESS、FAILED 时各发一次;冲正(REVERSED)不发回调,您靠查单看到。提代付时没给 notifyUrl 就不发,您靠查单。
| 项目 | 值 |
|---|---|
| 方法 | POST |
| Content-Type | application/x-www-form-urlencoded; charset=UTF-8 |
| 地址 | 您给的地址原样用;地址上自带的查询串留在地址里、不参与签名 |
| 超时 | 连接 5 秒,读取 15 秒 |
| 跳转 | 不跟随跳转:请直接给最终地址 |
| HTTPS 证书 | 不校验证书(自签证书也能收) |
| 判成功 | HTTP 200–299,正文去掉首尾空白后不分大小写等于 success(开头一个 BOM 会先去掉) |
| 没收到 success 时重发 | 首发之后隔 1、2、5、10、30、60 分钟各发一次,共 7 次;用完就停 |
| 新状态 | 同一笔有了新状态的回调,旧状态还没发完的重发就作废 |
字段
| 参数 | 什么时候有 | 说明 |
|---|---|---|
mchId | 总有 | 商户号 |
mchOrderNo | 总有 | 商户单号 |
payoutNo | 总有 | 本平台代付单号 |
amount | 总有 | 代付金额(最小单位) |
fee | 总有 | 手续费(最小单位),受理时定下 |
currency | 总有 | 币种 |
status | 总有 | 代付状态,见下面「状态」 |
createTime | 总有 | 受理时间,北京时间 |
finishTime | status 是 FAILED / SUCCESS 时有 | 进入当前状态的时间 |
failMsg | status 是 FAILED 时有 | 撤单原因 |
remark | 总有 | 申请时的备注 |
sign | 总有 | 签名 |
示例
示例密钥(假的):0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef;示例商户号:DEMO0001
回调正文
mchId=DEMO0001&mchOrderNo=ORDER-20260917-0001&payoutNo=P20260917120000000001&amount=10000&fee=200¤cy=CNY&status=SUCCESS&createTime=2026-09-17+12%3A00%3A00&finishTime=2026-09-17+12%3A05%3A30&remark=%E6%B5%8B%E8%AF%95&sign=f6b9b82e927528961584530bcd383b5dc360d3b453f7ba195fb41c986f519e61
签名串
amount=10000&createTime=2026-09-17 12:00:00¤cy=CNY&fee=200&finishTime=2026-09-17 12:05:30&mchId=DEMO0001&mchOrderNo=ORDER-20260917-0001&payoutNo=P20260917120000000001&remark=测试&status=SUCCESS
sign
f6b9b82e927528961584530bcd383b5dc360d3b453f7ba195fb41c986f519e61您要做的
- 只用 POST 正文验签。别用框架合并好的参数表(Java
getParameterMap、PHP$_POST/$_REQUEST、Gor.Form、ASP.NETRequest.Form、Flaskrequest.values、Expressexpress.urlencoded()),它们会把地址上的查询串混进来。 - 验签,再核
mchId是您自己的,然后按payoutNo+status去重。 - 同一笔只接受往后走的状态:
PROCESSING<SUCCESS=FAILED<REVERSED。回调可能晚到、重复到,以查单为准。 - 先落库,再回 HTTP 200、正文
success。PHP 文件别带 BOM,success前后别输出别的东西。
代收回调 compat1(老协议)
订单付款成功后发;运营补单成功后、您查单带 executeNotify=true 时也会再发。和原来老系统一样:
| 项目 | 值 |
|---|---|
| 方法 | POST |
| Content-Type | application/x-www-form-urlencoded |
| 超时 | 连接 5 秒,读取 15 秒 |
| 跳转 | 不跟随跳转:请直接给最终地址 |
| HTTPS 证书 | 不校验证书(自签证书也能收) |
| 判成功 | 正文去掉首尾空白后不分大小写等于 success;HTTP 400 及以上算失败 |
| 没收到 success 时重发 | 首发之后隔 1、2、3、4、5 分钟各发一次,共 6 次;用完就停 |
| 顺序 | 参数顺序固定(就是下表的顺序),不是按字母排 |
字段
| 顺序 | 参数 | 说明 |
|---|---|---|
| 1 | income | 实收金额(最小单位);通道重算过金额时和 amount 不同 |
| 2 | payOrderId | 商户单号 |
| 3 | amount | 下单金额(最小单位) |
| 4 | mchId | 商户号 |
| 5 | productId | 正式产品ID编码请联系客服提供 |
| 6 | mchOrderNo | 商户单号 |
| 7 | paySuccTime | 成功时间,毫秒数;没有时为空 |
| 8 | sign | 签名(MD5,空值不参与) |
| 9 | channelOrderNo | 上游单号 |
| 10 | backType | 固定 2 |
| 11 | param1 | 下单时的 param1 |
| 12 | param2 | 付款人姓名 |
| 13 | channelAttach | 上游附加数据 |
| 14 | status | 订单状态:2 支付成功,3 业务完成 |
示例
示例密钥(假的):demo-key-NOT-REAL-do-not-use-0001
您填的 notifyUrl
https://merchant.example.com/notify
发往的地址
https://merchant.example.com/notify
回调正文
income=10000&payOrderId=ORDER20260918001&amount=10000&mchId=20000001&productId=8001&mchOrderNo=ORDER20260918001&paySuccTime=1789704005000&sign=9447B44CF966CB47A625CADF63C539A8&channelOrderNo=UP20260918000123&backType=2¶m1=shop-7¶m2=%E5%BC%A0%E4%B8%89&channelAttach=&status=2
签名串
amount=10000&backType=2&channelOrderNo=UP20260918000123&income=10000&mchId=20000001&mchOrderNo=ORDER20260918001¶m1=shop-7¶m2=张三&payOrderId=ORDER20260918001&paySuccTime=1789704005000&productId=8001&status=2&key=demo-key-NOT-REAL-do-not-use-0001回调地址自带 ? 时,照老系统的拼法:您地址上的查询串挪到正文开头,我们的第一个参数紧跟在它后面(例如 shop=7?income=10000&…)。原来老系统就是这样发的,您原来能收,现在照样能收:
示例密钥(假的):demo-key-NOT-REAL-do-not-use-0001
您填的 notifyUrl
https://merchant.example.com/notify?shop=7
发往的地址
https://merchant.example.com/notify
回调正文
shop=7?income=10000&payOrderId=ORDER20260918001&amount=10000&mchId=20000001&productId=8001&mchOrderNo=ORDER20260918001&paySuccTime=1789704005000&sign=9447B44CF966CB47A625CADF63C539A8&channelOrderNo=UP20260918000123&backType=2¶m1=shop-7¶m2=%E5%BC%A0%E4%B8%89&channelAttach=&status=2您要做的
- 用收到的参数验签(MD5,见 签名)。
- 按商户单号去重:同一笔可能不止收到一次(补发、查单带
executeNotify=true触发的补发)。 - 先落库,再回
success。
回调来源 IP
我们从这些 IP 发回调:47.242.183.76。您对回调来源设了白名单的,把它们加进去。从老系统迁来的商户,老系统的 IP 先别删:切换前下的单还会从老系统回调。
回调请求头 User-Agent 固定是 WebhookClient/1.0(代付、代收回调都一样)。您的防火墙或 CDN 按 User-Agent 拦截的,请放行它。它只用来识别来源,验真伪以签名为准。