PAYATHON 2026

live server 无法连接 Payment Method 服务器

支付老李

结论

cURL error 7 表示 live server 在建立 TCP 连接时就失败了。此时,请求还没有进入支付接口的 HTTP、TLS、证书或业务鉴权流程。

本地可以访问,但 live server 无法访问,常见原因包括:

  • live server 的出站防火墙或云安全策略禁止访问 TCP 2443
  • 支付服务商设置了 IP 白名单,而 live server 的公网出口 IP 不在白名单中
  • 支付服务器没有监听该端口,或仅允许特定网络访问
  • 域名在 live server 上解析到了错误或无法访问的 IP
  • 服务器使用了代理、NAT、容器或 IPv6,实际网络路径与本地不同

排查时,应先验证 live server 到 demo-ipg.ctdev.comtrust.ae:2443 的 TCP 连通性,不要急着修改 PHP 或 cURL 参数。

1. 在 live server 上检查 DNS 解析

执行:

getent hosts demo-ipg.ctdev.comtrust.ae

也可以使用:

dig +short demo-ipg.ctdev.comtrust.ae
nslookup demo-ipg.ctdev.comtrust.ae

需要确认:

  • 域名能否正常解析
  • 解析结果是否与本地环境一致
  • 是否同时返回 IPv4 和 IPv6 地址
  • 返回的 IP 是否为支付服务商提供的有效地址

如果 live server 优先使用 IPv6,但目标服务的 IPv6 路径不可用,可以暂时强制 cURL 使用 IPv4,确认问题是否与 IPv6 有关:

<?php

$ch = curl_init('https://demo-ipg.ctdev.comtrust.ae:2443/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
]);

$response = curl_exec($ch);

if ($response === false) {
    printf(
        "cURL error %d: %s\n",
        curl_errno($ch),
        curl_error($ch)
    );
}

curl_close($ch);

强制使用 IPv4 只适合定位问题。如果原因是 IPv6 配置异常,最终仍需修复服务器的 DNS 或网络路由配置。

2. 测试 TCP 2443 端口

测试必须在实际运行应用的服务器或容器内执行:

nc -vz -w 10 demo-ipg.ctdev.comtrust.ae 2443

如果没有 nc,可以尝试:

telnet demo-ipg.ctdev.comtrust.ae 2443

也可以让 cURL 直接输出连接过程:

curl -4 -v --connect-timeout 10 \
  https://demo-ipg.ctdev.comtrust.ae:2443/

可以根据结果做初步判断:

  • Connection refused:请求已经到达目标主机,但端口没有监听,或中间设备主动拒绝了连接。
  • Connection timed out:连接通常被防火墙、安全组、白名单或路由丢弃。
  • 已建立连接但出现 TLS 错误:TCP 端口已经连通,接下来应检查 TLS 版本、证书和 SNI。
  • 返回 401、403、404 或其他 HTTP 状态码:网络连接已经成功,问题已经转到接口路径、权限或请求参数层面。

错误信息中的 after 549 ms 只表示这次连接尝试经过多长时间后失败,无法单独用来判断是防火墙拦截还是目标端口关闭。

3. 检查 live server 的出站规则

确认服务器允许向目标地址发起 TCP 2443 出站连接,并逐层检查:

  • 云平台 Security Group、NSG 或防火墙
  • 操作系统的 iptables、nftables 或 firewalld
  • 主机商的出站端口限制
  • 公司网络防火墙
  • Kubernetes NetworkPolicy
  • Docker 或其他容器网络规则
  • HTTP/HTTPS 代理配置

例如,可以使用以下命令查看 Linux 防火墙规则,具体使用哪条命令取决于系统:

sudo iptables -S
sudo nft list ruleset
sudo firewall-cmd --list-all

如果没有权限修改网络策略,可以将以下信息交给服务器或网络管理员:

Destination: demo-ipg.ctdev.comtrust.ae
Protocol: TCP
Destination port: 2443
Direction: Outbound

目标域名背后可能有多个 IP,地址也可能动态变化。除非支付服务商明确提供了固定地址段,否则不要只放行当前解析出的单个 IP。

4. 确认支付服务商的 IP 白名单

很多支付网关会限制调用方的公网出口 IP。本地网络的出口 IP 可能已经获准访问,但 live server 使用的是另一个出口 IP。

可以在 live server 上查询实际的公网出口 IP:

curl -4 https://api.ipify.org

然后向支付服务商确认:

  • demo-ipg.ctdev.comtrust.ae:2443 是否允许从公网访问
  • 是否需要登记服务器的公网出口 IP
  • 测试环境是否使用独立白名单
  • 是否要求通过 VPN、专线或指定代理访问
  • 2443 是否仍是测试环境的正确端口

如果服务器位于 NAT、负载均衡器或企业代理之后,需要提交真实的出口 IP。这个地址不一定是服务器网卡上显示的内网 IP。

5. 从应用的真实运行环境测试

如果应用运行在 Docker、Kubernetes、托管 PHP 或受限主机中,宿主机能够连接,不代表应用进程也能连接。

在 Docker 环境中,可以先进入容器:

docker exec -it <container_name> sh

然后在容器内执行:

getent hosts demo-ipg.ctdev.comtrust.ae
nc -vz -w 10 demo-ipg.ctdev.comtrust.ae 2443

还要检查 Web 进程与命令行环境是否使用了不同的代理或安全配置:

env | grep -i proxy

常见的相关变量有:

HTTP_PROXY
HTTPS_PROXY
ALL_PROXY
NO_PROXY

如果连接必须经过代理,需要确认代理允许通过 CONNECT 方法访问 2443。如果支付域名应当直接连接,则可能需要将它加入 NO_PROXY。

6. 使用最小 PHP 请求定位问题

可以先绕过框架、支付 SDK 和业务代码,使用最小请求进行测试:

<?php

$url = 'https://demo-ipg.ctdev.comtrust.ae:2443/';

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_VERBOSE => true,
    CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
]);

$response = curl_exec($ch);
$info = curl_getinfo($ch);

if ($response === false) {
    echo 'errno: ' . curl_errno($ch) . PHP_EOL;
    echo 'error: ' . curl_error($ch) . PHP_EOL;
}

print_r($info);
curl_close($ch);

重点查看:

  • primary_ip
  • primary_port
  • connect_time
  • http_code
  • ssl_verify_result

如果仍然出现错误 7,问题通常不在请求正文、API 密钥或支付参数,因为 TCP 连接尚未建立。

7. 连接成功后再检查 TLS

只有确认 TCP 2443 已经连通,才需要继续检查:

  • 系统 CA 证书是否完整
  • PHP cURL 使用的 OpenSSL 和 TLS 版本
  • 服务器时间是否准确
  • 支付服务是否要求客户端证书
  • 客户端证书和私钥是否正确加载
  • SNI 是否正常发送

可以使用以下命令检查 TLS 握手:

openssl s_client \
  -connect demo-ipg.ctdev.comtrust.ae:2443 \
  -servername demo-ipg.ctdev.comtrust.ae

不要试图通过关闭证书校验来解决连接问题:

CURLOPT_SSL_VERIFYPEER => false

这个设置无法修复 cURL error 7,还会降低支付请求的安全性。

建议的排查顺序

  1. 在应用的实际运行环境中检查域名解析。
  2. 使用 nc 测试 TCP 2443。
  3. 使用 curl -4 -v 排除 IPv6 和应用代码的影响。
  4. 检查云安全组、系统防火墙、容器网络和代理配置。
  5. 获取 live server 的公网出口 IP,请支付服务商确认白名单。
  6. 联系支付服务商,确认测试地址、端口和网络接入要求。
  7. TCP 连通后,再检查 TLS、客户端证书、接口路径和鉴权。

如果 live server 上的 nc 也无法连接,而本地可以连接,基本可以确认问题出在 live server 的网络出口、支付服务商白名单或两者之间的网络路径。反复调整支付请求代码无法解决这类问题。

备注:内容仅供参考。