cURL 错误 28 即使 API 端工作,主机不接收数据?
Posted
技术标签:
【中文标题】cURL 错误 28 即使 API 端工作,主机不接收数据?【英文标题】:cURL error 28 even though API side works, host not receiving data? 【发布时间】:2020-09-27 18:29:57 【问题描述】:我在将 OpenCart 集成到 PayPal API 时遇到了一个奇怪的问题。我正在通过 OpenCart 使用与 PayPal Pro 脚本的直接集成,我收到错误 28,这是我的服务器端超时,但在 paypal 仪表板中,它显示授权成功。我的服务器似乎无法从 PayPal 正确获得回复。
我尝试过的步骤:
-
Telnet 到 api-3t.paypal.com 端口 443,能够访问主机,但没有验证或运行示例查询
将 php 版本更新到 7.4
从 CURL 打印所有调试信息
这是奇怪的部分,但是,CURL Info 告诉我,我实际上以某种方式从服务器获得了回复,并且它正在解析 url。即使值存在,CURL 也没有返回错误消息。但有些东西不能正常工作。
2020-06-08 17:18:10 - CURL INFO: Array
(
[url] => https://api-3t.paypal.com/nvp
[content_type] => text/plain; charset=utf-8
[http_code] => 200
[header_size] => 497
[request_size] => 822
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 2.919995
[namelookup_time] => 0.001446
[connect_time] => 0.057641
[pretransfer_time] => 0.190467
[size_upload] => 692
[size_download] => 191
[speed_download] => 65
[speed_upload] => 237
[download_content_length] => 191
[upload_content_length] => 692
[starttransfer_time] => 2.919881
[redirect_time] => 0
[redirect_url] =>
[primary_ip] => 173.0.88.69
[certinfo] => Array
(
)
[primary_port] => 443
[local_ip] => [redacted]
[local_port] => 41214
[http_version] => 2
[protocol] => 2
[ssl_verifyresult] => 0
[scheme] => HTTPS
[appconnect_time_us] => 190395
[connect_time_us] => 57641
[namelookup_time_us] => 1446
[pretransfer_time_us] => 190467
[redirect_time_us] => 0
[starttransfer_time_us] => 2919881
[total_time_us] => 2919995
)
2020-06-08 17:18:10 - CURL Error: 28
2020-06-08 17:18:10 - CURL Error:
选择驱动脚本来获取此信息(curl 已正确初始化并在上面填充了标题):
if (!$this->config->get('pp_pro_test'))
$curl = curl_init('https://api-3t.paypal.com/nvp');
else
$curl = curl_init('https://api-3t.sandbox.paypal.com/nvp');
curl_setopt($curl, CURLOPT_PORT, 443);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($curl, CURLOPT_FAILONERROR, 1);
curl_setopt($curl, CURLOPT_FORBID_REUSE, 1);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $request);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 100);
curl_setopt($curl, CURLOPT_TIMEOUT, 30000);
$response = curl_exec($curl);
if (curl_errno($curl))
$info = curl_getinfo($curl);
$this->log->write("CURL INFO: " . print_r($info,1));
$this->log->write("CURL Error: " . curl_errno($curl));
$this->log->write("CURL Error: " . curl_error($curl));
$this->log->write("Request: " . print_r($request,1));
$this->log->write("Response: " . var_dump($response,1));
curl_close($curl);
$response_info = array();
parse_str($response, $response_info);
$json = array();
if (($response_info['ACK'] == 'Success') || ($response_info['ACK'] == 'SuccessWithWarning'))
对此的任何帮助将不胜感激。太感谢了。
【问题讨论】:
【参考方案1】:我也有同样的问题。 你在服务器上有什么版本的 libcurl? 7.69.1? 由于 CURL 版本,我不确定这是否可行。
我尝试调试 curl 请求(使用“CURLOPT_VERBOSE”)并看到 curl 接收到响应标头(使用代码 200) - 但卡在接收响应正文中。然后出现超时错误。
临时解决方案是使用套接字向 api 发送请求。
$fp = fsockopen('ssl://api-3t.sandbox.paypal.com', 443, $errno, $errstr);
$send = "";
$send .= "POST /nvp HTTP/1.1\r\n";
$send .= "Host: api-3t.sandbox.paypal.com\r\n";
$send .= "Content-length: ".strlen($request)."\r\n";
$send .= "Content-type: application/x-www-form-urlencoded\r\n";
$send .= "Connection: close\r\n";
$send .= "\r\n";
$send .= $request."\r\n\r\n";
fputs($fp, $send);
$result = fread($fp, 1000000);
$result .= fread($fp, 1000000);
$result .= fread($fp, 1000000);
$result .= fread($fp, 1000000);
fclose($fp);
【讨论】:
以上是关于cURL 错误 28 即使 API 端工作,主机不接收数据?的主要内容,如果未能解决你的问题,请参考以下文章
curl 使用 POST 方法工作,但获取 API 返回错误 503
API 不工作/http 错误 SocketException:在发布版本中主机查找失败(在调试模式下工作)对于 Flutter