支付结果通知
订单付款成功后,平台向下单时传的 notify_url 发送通知。收到通知并验签通过后,按通知更新你的订单,再返回 success。
通知方式
HTTP GET,参数拼在 notify_url 后面(原地址已经带 ? 时用 & 连接),参数值经过 URL 编码,空格编码为 +。只在付款成功时发送。
通知参数
按下表顺序发送,每个参数都会出现,没有值的发送为空。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
pid | Int | 必填 | 商户号的数字部分,不带前缀 |
trade_no | String | 必填 | 站长单号 |
out_trade_no | String | 必填 | 商户单号,下单时传的商户单号 |
type | String | 必填 | 支付方式的调用值,见「支付方式」 |
name | String | 必填 | 商品名称,下单时传的商品名称 |
money | String | 必填 | 订单金额,单位元,两位小数 |
trade_status | String | 必填 | 交易状态 |
param | String | 否 | 扩展参数 |
api_trade_no | String | 否 | 三方单号 |
buyer | String | 否 | 付款人账号 |
timestamp | String | 必填 | 时间戳 |
sign_type | String | 必填 | 签名类型 |
sign | String | 必填 | 签名,见下方「验签」 |
trade_no:本站生成的订单号,19 位或 23~30 位(日期后接商户号),最长 32 位,按字符串处理,不要按定长存trade_status:固定为TRADE_SUCCESS,表示付款成功param:下单时传的param,原样返回;没传时为空api_trade_no:支付平台(微信、支付宝等)的订单号,可能为空buyer:付款人在支付平台的账号或标识,可能为空timestamp:发送时的 Unix 时间戳(秒),每次发送都会更新sign_type:用 RSA 签名下的单为RSA,其他为MD5
通知示例
GET /notify?pid=1001&trade_no=2026092712000012345&out_trade_no=20260927123456&type=alipay&name=%E4%BC%9A%E5%91%98%E5%85%85%E5%80%BC&money=1.00&trade_status=TRADE_SUCCESS¶m=&api_trade_no=2026092722001412345678901234&buyer=×tamp=1790481635&sign_type=MD5&sign=97f24885e52f474f7b6d6aa7276e8415 HTTP/1.1
Host: 你的域名这条通知的待签名串如下,MD5密钥取 你的MD5密钥 时,算出的 sign 就是上面的值,可以用来核对你的验签代码:
api_trade_no=2026092722001412345678901234&money=1.00&name=会员充值&out_trade_no=20260927123456&pid=1001×tamp=1790481635&trade_no=2026092712000012345&trade_status=TRADE_SUCCESS&type=alipay验签
sign_type为MD5:用 MD5密钥按「V1(MD5签名)」的方法计算,与收到的sign比对。sign_type为RSA:用平台公钥按「V2(RSA签名)」的方法验签。- 值为空的参数(如没传
param时)不参与签名。 - 用 URL 解码后的参数值计算。PHP 的
$_GET、多数框架取到的参数已经解码。
返回 success
验签通过并处理完订单后,响应内容输出 success 这七个小写字母(前后的空格、换行不影响)。输出其他任何内容,包括 SUCCESS、JSON、页面,都当作没收到,平台会重新发送。
返回示例
success重新发送
没有收到 success 时按下表重新发送,最多发送 6 次:
| 次数 | 发送时间 |
|---|---|
| 第 1 次 | 付款成功后立即发送 |
| 第 2 次 | 上一次失败后约 1 分钟 |
| 第 3 次 | 上一次失败后约 3 分钟 |
| 第 4 次 | 上一次失败后约 20 分钟 |
| 第 5 次 | 上一次失败后约 1 小时 |
| 第 6 次 | 上一次失败后约 2 小时 |
- 每次发送前会重新检查订单,订单已不是已支付状态(如已全额退款、已冻结)时不再发送。
- 连接超时 5 秒,整次请求超时 6 秒;不跟随跳转,
notify_url请填最终地址。 - 6 次都没有收到
success后不再自动发送,请用「查询订单」核对结果。
PHP 示例
<?php
// zpay_sign 见「V1(MD5签名)」
$params = $_GET;
if (!hash_equals(zpay_sign($params, '你的MD5密钥'), $params['sign'] ?? '')) {
exit('fail');
}
if (($params['trade_status'] ?? '') === 'TRADE_SUCCESS') {
// 1. 按 out_trade_no 找到你的订单,核对金额 money
// 2. 订单还没处理过才改成已付款,处理过就跳过
}
echo 'success';注意事项
- 同一笔订单可能收到多次通知,处理前先看订单是否已经处理过,避免重复发货。
- 核对通知里的
money与你订单的金额一致后再处理。 notify_url要能从公网直接访问,不要放在需要登录或会跳转的地址上。