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

如何修复连接超时,cURL 错误 28?

curl错误码大全

API 不工作/http 错误 SocketException:在发布版本中主机查找失败(在调试模式下工作)对于 Flutter

如何在 facebook graph api 请求中使用 cURL

即使启用了CORS,Web Api仍会始终发生403错误