支付

支付结果通知

订单付款成功后,平台向下单时传的 notify_url 发送通知。收到通知并验签通过后,按通知更新你的订单,再返回 success。

通知方式

HTTP GET,参数拼在 notify_url 后面(原地址已经带 ? 时用 & 连接),参数值经过 URL 编码,空格编码为 +。只在付款成功时发送。

通知参数

按下表顺序发送,每个参数都会出现,没有值的发送为空。

参数类型必填说明
pidInt必填商户号的数字部分,不带前缀
trade_noString必填站长单号
out_trade_noString必填商户单号,下单时传的商户单号
typeString必填支付方式的调用值,见「支付方式」
nameString必填商品名称,下单时传的商品名称
moneyString必填订单金额,单位元,两位小数
trade_statusString必填交易状态
paramString否扩展参数
api_trade_noString否三方单号
buyerString否付款人账号
timestampString必填时间戳
sign_typeString必填签名类型
signString必填签名,见下方「验签」
  • 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&param=&api_trade_no=2026092722001412345678901234&buyer=&timestamp=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&timestamp=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 要能从公网直接访问,不要放在需要登录或会跳转的地址上。