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_ipprimary_portconnect_timehttp_codessl_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,还会降低支付请求的安全性。
建议的排查顺序
- 在应用的实际运行环境中检查域名解析。
- 使用
nc测试 TCP2443。 - 使用
curl -4 -v排除 IPv6 和应用代码的影响。 - 检查云安全组、系统防火墙、容器网络和代理配置。
- 获取 live server 的公网出口 IP,请支付服务商确认白名单。
- 联系支付服务商,确认测试地址、端口和网络接入要求。
- TCP 连通后,再检查 TLS、客户端证书、接口路径和鉴权。
如果 live server 上的 nc 也无法连接,而本地可以连接,基本可以确认问题出在 live server 的网络出口、支付服务商白名单或两者之间的网络路径。反复调整支付请求代码无法解决这类问题。
备注:内容仅供参考。
