使用CURL调用支付网关API遇连接失败问题求助
问题分析与解决方案
问题重现
近两日尝试用CURL调用返回JSON数据的支付网关API,每次调用均报错:
cURL Error #:Failed to connect to api.sandbox.vm.co.mz port 18352 after 813 ms: Couldn't connect to server
本地环境和Postman调用正常,但服务器上无法连接,使用的CURL代码如下:
$curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_PORT => "18352", CURLOPT_URL => "https://api.sandbox.vm.co.mz:18352/ipg/v1x/c2bPayment/singleStage/", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => json_encode($fields), CURLOPT_HTTPHEADER => array( 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $this->getToken(), 'origin' => 'developer.mpesa.vm.co.mz', 'Connection' => 'keep-alive' ) ) );
解决方案
1. 移除冗余的端口配置
你的URL已经明确指定了端口18352,同时设置CURLOPT_PORT会造成配置冲突,直接删除这一行:
// 删掉这行 CURLOPT_PORT => "18352",
2. 排查服务器网络连通性
登录你的服务器,执行以下命令测试网络是否能到达目标地址:
- 测试端口连通性:
telnet api.sandbox.vm.co.mz 18352 - 用curl直接测试:
curl -v https://api.sandbox.vm.co.mz:18352/ipg/v1x/c2bPayment/singleStage/
如果命令返回无法连接,说明服务器的防火墙/安全组出站规则屏蔽了18352端口,需要联系服务器管理员或者云服务商开放该端口的出站权限。
3. 验证DNS解析是否正常
在服务器上执行ping api.sandbox.vm.co.mz,对比本地环境解析出的IP地址,如果不一致,说明服务器DNS解析异常,可以尝试更换服务器的DNS服务器(比如用8.8.8.8)。
4. 临时跳过SSL证书验证(测试用)
部分服务器的curl可能不信任目标网关的SSL证书,可临时添加以下配置测试(生产环境请勿使用,建议安装对应CA证书):
CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false,
5. 调整超时与HTTP版本
尝试延长超时时间,或者切换HTTP版本测试:
CURLOPT_TIMEOUT => 60, // 延长至60秒 // 或者尝试HTTP/2(如果服务器支持) CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
内容的提问来源于stack exchange,提问作者Vasu_Sharma
相关产品推荐
相关产品推荐

