当面付支付接口白名单如何配置?
结论
当面付接口通常无法使用一组长期固定的支付宝 IP 作为完整白名单。生产服务器访问支付宝时,应优先按域名放行官方网关:
openapi.alipay.com
当面付的异步通知由支付宝主动请求商户设置的 notify_url。如果安全设备必须限制来源 IP,应通过支付宝开放平台或官方技术支持获取当前有效的通知出口 IP 段,并定期更新。不要把 DNS 临时解析出的地址作为固定白名单。
无论是否配置 IP 白名单,异步通知都必须通过 RSA2 验签。IP 白名单只是一项网络层辅助限制,不能代替验签。
出站访问如何配置
当面付涉及的接口包括:
alipay.trade.precreate
alipay.trade.pay
alipay.trade.query
alipay.trade.cancel
alipay.trade.refund
这些接口均通过支付宝开放平台网关调用。生产环境需要允许应用服务器访问:
协议:HTTPS
目标域名:openapi.alipay.com
目标端口:443
网关地址是:
https://openapi.alipay.com/gateway.do
如果防火墙支持基于 FQDN 或域名进行访问控制,建议直接放行 openapi.alipay.com:443。支付宝可能使用负载均衡、容灾和网络调度,因此域名对应的 IP 可能发生变化。
可以使用以下命令检查 DNS 解析和 HTTPS 连通性:
nslookup openapi.alipay.com
curl -v --connect-timeout 5 https://openapi.alipay.com/gateway.do
nslookup 的结果只适合排查当前的解析情况,不应直接复制到生产环境,作为长期固定的白名单。
如果安全设备只能配置目标 IP,建议:
- 向支付宝官方技术支持确认当前生产网关使用的 IP 或网段。
- 确认是否还需要放行备用节点和容灾网段。
- 设置变更通知,并定期核对配置。
- 不要只根据本地 DNS 的一次解析结果设置白名单。
入站访问如何配置
调用支付接口后的同步响应会复用已经建立的 HTTPS 出站连接,一般不需要额外开放公网入站端口。
需要接受公网入站请求的是异步通知地址,也就是调用支付接口时设置的 notify_url。例如:
https://pay.example.com/alipay/notify
生产环境需要满足以下条件:
notify_url可以从公网访问。- 使用有效的 HTTPS 证书。
- 允许支付宝通知节点访问该地址。
- 访问过程不要求登录、Cookie、验证码或浏览器跳转。
- 收到通知后先验签,再处理订单。
- 业务处理成功后返回纯文本
success。
如果必须配置入站 IP 白名单,应以支付宝官方当前公布或技术支持确认的通知 IP 段为准。如果能力中心页面没有明确列出固定 IP,不应自行推断,也不建议只放行 openapi.alipay.com 的解析地址。支付网关和异步通知节点不一定共用同一组出口地址。
异步通知处理示例
下面是 Java 处理逻辑示意。具体类名和初始化方式需要与项目实际使用的支付宝 Java SDK 版本保持一致:
@PostMapping("/alipay/notify")
@ResponseBody
public String handleAlipayNotify(HttpServletRequest request) throws Exception {
Map<String, String> params = new HashMap<>();
for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
params.put(entry.getKey(), String.join(",", entry.getValue()));
}
boolean verified = AlipaySignature.rsaCheckV1(
params,
alipayPublicKey,
"UTF-8",
"RSA2"
);
if (!verified) {
return "failure";
}
String outTradeNo = params.get("out_trade_no");
String tradeNo = params.get("trade_no");
String tradeStatus = params.get("trade_status");
String appId = params.get("app_id");
String totalAmount = params.get("total_amount");
// 继续核对 app_id、订单号、订单金额和商户身份。
// 使用 out_trade_no 做幂等处理,避免重复通知导致重复入账。
// 只有业务处理完成并持久化成功后,才返回 success。
if ("TRADE_SUCCESS".equals(tradeStatus)
|| "TRADE_FINISHED".equals(tradeStatus)) {
return "success";
}
return "failure";
}
验签必须使用支付宝公钥,或使用支付宝公钥证书对应的验签能力,不能使用商户应用公钥。通知参数应保留原始值,验签前不要修改字符编码、金额格式或参数内容。
防火墙配置建议
防火墙规则可以这样拆分:
出站规则:
应用服务器 -> openapi.alipay.com:443
入站规则:
支付宝通知节点 -> 商户 notify_url 对应的 HTTPS 地址:443
如果网络设备不支持域名白名单,可以通过企业统一的 HTTPS 出口代理访问支付宝网关,由代理负责域名解析和访问控制。对于异步通知,可以先在公网接入层限制来源并进行限流和验签,再把请求转发到内网业务服务。
不要直接采用下面这种临时配置:
allow <DNS 当前解析出的单个 IP>;
deny all;
单个解析地址切换后,可能造成支付请求或异步通知中断。
注意事项
- 沙箱网关和生产网关不同,生产环境不能用沙箱地址代替生产地址。
- 支付宝可能重复发送异步通知,订单处理必须保证幂等。
- 不能只凭来源 IP 判断通知是否可信,必须完成 RSA2 验签和业务参数核对。
- 还应核对
app_id、out_trade_no、total_amount、交易状态和收款方身份。 - 通知尚未成功持久化时,不要返回
success,否则支付宝可能不再重试。 - 如果公司制度要求提供精确的入站和出站 IP 清单,应通过支付宝开放平台工单或对应服务渠道索取最新清单,并确认清单是否包含生产网关、异步通知、备用节点和容灾网段。
备注:内容仅供参考。
