PAYATHON 2026

当面付支付接口白名单如何配置?

支付小周

结论

当面付接口通常无法使用一组长期固定的支付宝 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,建议:

  1. 向支付宝官方技术支持确认当前生产网关使用的 IP 或网段。
  2. 确认是否还需要放行备用节点和容灾网段。
  3. 设置变更通知,并定期核对配置。
  4. 不要只根据本地 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 清单,应通过支付宝开放平台工单或对应服务渠道索取最新清单,并确认清单是否包含生产网关、异步通知、备用节点和容灾网段。

备注:内容仅供参考。