PAYATHON 2026

如何查询支付宝支付服务回调通知的最新出口IP地址

支付小周

明确结论

支付宝支付异步回调的出口 IP 可能发生变化,不要从第三方文章复制静态地址后长期使用。最新 IP 段应以支付宝开放平台发布的“支付宝 IP 地址库”或当前产品文档为准:

进入文档中心后,可搜索“支付宝 IP 地址库”“异步通知出口 IP”或“通知服务器 IP”,再根据文档公布的地址范围更新 WAF 白名单。如果文档没有列出具体网段,应通过支付宝开放平台工单向官方确认,不要采用来源不明的 IP 列表。

为什么不能只依赖 IP 白名单

支付宝的回调请求可能经过网关、负载均衡等基础设施,出口 IP 也可能新增或调整。如果 WAF 长期使用一份不更新的静态名单,支付宝增加出口节点后,合法回调可能被直接拦截。

来源 IP 只能用于网络层过滤,无法证明请求一定来自支付宝。应用还必须完成以下校验:

  1. 使用支付宝公钥验证回调签名。
  2. 检查 app_id 是否属于当前应用。
  3. 检查 out_trade_no 是否存在并属于当前商户。
  4. 核对 total_amount、币种和收款方信息。
  5. 根据 trade_status 幂等更新订单状态。
  6. 必要时调用支付宝交易查询接口进行二次确认。

配置步骤

1. 获取官方最新 IP 段

访问支付宝开放平台文档中心并搜索“支付宝 IP 地址库”。确认找到的文档适用于支付异步通知,而不是商户调用支付宝网关时使用的网关地址。

记录官方公布的 IPv4、IPv6 地址或 CIDR 网段,同时保存文档更新时间。不要只配置域名当前解析出的单个 IP,因为 DNS 解析结果不等于完整的回调出口范围。

2. 更新 WAF 白名单

只针对支付宝回调路径设置 WAF 规则,例如:

POST /api/payment/alipay/notify

不要直接把支付宝 IP 段加入全站白名单。可以同时限制以下条件:

请求方法为 POST
并且请求路径为 /api/payment/alipay/notify
并且来源地址属于支付宝官方 IP 地址库

下面是 Nginx 层的示意配置。配置中的网段必须替换为支付宝官方当前公布的实际值:

geo $alipay_source_allowed {
    default 0;

    # 示例占位符,不是真实支付宝 IP,请勿直接使用
    192.0.2.0/24 1;
    2001:db8::/32 1;
}

location = /api/payment/alipay/notify {
    if ($alipay_source_allowed = 0) {
        return 403;
    }

    proxy_pass http://payment_backend;
}

阿里云 WAF、Cloudflare、AWS WAF 等产品的具体配置方式不同,但规则都应尽量缩小放行范围,只允许指定路径接收来自官方 IP 段的请求。

3. 在应用层验证回调签名

以下是 Java SDK 的典型验签方式:

import com.alipay.api.internal.util.AlipaySignature;

import java.nio.charset.StandardCharsets;
import java.util.Map;

public boolean verifyAlipayNotify(Map<String, String> params) throws Exception {
    return AlipaySignature.rsaCheckV1(
        params,
        ALIPAY_PUBLIC_KEY,
        StandardCharsets.UTF_8.name(),
        "RSA2"
    );
}

ALIPAY_PUBLIC_KEY 必须与应用使用的密钥或证书模式匹配。如果使用支付宝公钥证书模式,应按照对应 SDK 的证书验签方式处理,不能把应用公钥当成支付宝公钥。

验签通过后,还需要核对订单内容:

if (!EXPECTED_APP_ID.equals(params.get("app_id"))) {
    throw new SecurityException("Unexpected app_id");
}

String outTradeNo = params.get("out_trade_no");
String tradeNo = params.get("trade_no");
String tradeStatus = params.get("trade_status");
String totalAmount = params.get("total_amount");

// 查询本地订单,并核对订单号、金额、收款方等信息。
// 更新订单时应使用 outTradeNo 或 tradeNo 做幂等控制。

业务处理成功后,按照支付宝异步通知协议返回以下纯文本:

success

如果返回其他内容,或者请求超时、连接失败,支付宝可能按照通知机制再次发送回调。因此,同一笔交易收到多次通知是正常情况,回调处理必须具备幂等性。

注意事项

  • 不要直接信任请求头中的 X-Forwarded-For。真实连接地址应由可信的反向代理或 WAF 提取,同时需要防止客户端伪造该请求头。
  • 配置白名单前,要先确认 WAF 看到的是支付宝出口地址,还是 CDN、负载均衡或上游代理地址。
  • 即使请求命中 IP 白名单,也不能跳过签名校验。
  • 回调处理过程中不宜执行耗时任务。完成必要校验和订单落库后,应尽快返回 success,后续业务可以通过消息队列异步执行。
  • 日志应记录回调时间、来源 IP、trade_no、out_trade_no、验签结果和处理结果,但不要保存私钥或完整的敏感参数。
  • 定期检查官方 IP 地址库的更新时间,并提前准备新增网段的变更和验证流程。
  • 如果官方文档没有承诺出口 IP 固定,应采用“WAF 基础防护+应用层验签+交易查询复核”的方案,避免过于严格的 IP 白名单导致支付通知丢失。

备注:内容仅供参考。