如何查询支付宝支付服务回调通知的最新出口IP地址
明确结论
支付宝支付异步回调的出口 IP 可能发生变化,不要从第三方文章复制静态地址后长期使用。最新 IP 段应以支付宝开放平台发布的“支付宝 IP 地址库”或当前产品文档为准:
- 支付宝开放平台文档中心:https://opendocs.alipay.com/
- 支付宝支付异步通知说明:https://opendocs.alipay.com/open/203/105286
进入文档中心后,可搜索“支付宝 IP 地址库”“异步通知出口 IP”或“通知服务器 IP”,再根据文档公布的地址范围更新 WAF 白名单。如果文档没有列出具体网段,应通过支付宝开放平台工单向官方确认,不要采用来源不明的 IP 列表。
为什么不能只依赖 IP 白名单
支付宝的回调请求可能经过网关、负载均衡等基础设施,出口 IP 也可能新增或调整。如果 WAF 长期使用一份不更新的静态名单,支付宝增加出口节点后,合法回调可能被直接拦截。
来源 IP 只能用于网络层过滤,无法证明请求一定来自支付宝。应用还必须完成以下校验:
- 使用支付宝公钥验证回调签名。
- 检查
app_id是否属于当前应用。 - 检查
out_trade_no是否存在并属于当前商户。 - 核对
total_amount、币种和收款方信息。 - 根据
trade_status幂等更新订单状态。 - 必要时调用支付宝交易查询接口进行二次确认。
配置步骤
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 白名单导致支付通知丢失。
备注:内容仅供参考。
