【问题标题】:CURL Request problemCURL 请求问题
【发布时间】:2011-11-08 21:47:08
【问题描述】:

我正在尝试验证 paypal pdt 信息。

我生成了我的模型表单并提交了它。 IT 部门也工作并返回了信息。

我尝试了同样的事情来提出 curl 请求。但是我的当前请求返回空白。

我的模型表格:

<form method="post" action="https://sandbox.paypal.com/cgi-bin/webscr">
    <input type="hidden" name="cmd" value="_notify-synch"/>
    <input type="hidden" name="at" value="-----"/>
    <input type="hidden" name="tx" value="-----"/>
    <input type="submit" value="Test"/>
</form>

我的 CURL 请求代码:

$arrData = array(
    'tx'    => '----',
    'cmd'   => '_notify-synch',
    'at'    => '-----'
);
    $ch = curl_init( 'https://sandbox.paypal.com/cgi-bin/webscr' );
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1) ;
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $arrData);
    $strCurlResult = curl_exec($ch);
    curl_close( $ch );
    return $strCurlResult;

编辑:

在跟踪 curl 错误时我发现以下消息:

SSL:证书主题名称“www.sandbox.paypal.com”不匹配 目标主机名 'sandbox.paypal.com'

【问题讨论】:

标签: php curl paypal


【解决方案1】:

实际上,您可以禁用对等 HOST 验证。在某些 PHP/cURL 版本中,仅禁用 PEER 是不够的:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

来自文档:

CURLOPT_SSL_VERIFYHOST: 1 检查公共名称是否存在 SSL 对等证书。 2 检查是否存在通用名称 并验证它是否与提供的主机名匹配。生产中 环境中,此选项的值应保持为 2(默认 值)。

【讨论】:

    【解决方案2】:

    更改: $ch = curl_init( 'https://sandbox.paypal.com/cgi-bin/webscr' );
    收件人: $ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');

    原因:www.sandbox.paypal.com 的证书对 sandbox.paypal.com 无效。
    顺便说一下,对表单的“操作”也进行相同的更改。

    【讨论】:

      【解决方案3】:

      您需要告诉 cURL 不要验证 SSL 证书。这可以通过设置 cURL 选项来完成:

      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
      

      更多信息在这里:

      http://php.net/manual/en/function.curl-setopt.php

      【讨论】:

      • 这并不总是足够的。在某些环境中,您还必须禁用 CURLOPT_SSL_VERIFYHOST。
      【解决方案4】:

      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

      虽然上述方法有效,但不推荐。

      正如罗伯特所说的

      更改:

      $ch = curl_init('https://sandbox.paypal.com/cgi-bin/webscr');

      收件人:

      $ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');

      【讨论】:

        【解决方案5】:

        以字符串形式发送:

        $arrData = array(
            'tx'    => '----',
            'cmd'   => '_notify-synch',
            'at'    => '-----'
        );
        
        $fields_string = "";
        
        foreach($arrData as $key=>$value) 
            $fields_string .= $key.'='.$value.'&';
        
        rtrim($fields_string,'&');
        
        $ch = curl_init( 'https://sandbox.paypal.com/cgi-bin/webscr' );
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1) ;
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
        $strCurlResult = curl_exec($ch);
        curl_close( $ch );
        return $strCurlResult;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-31
          • 2018-09-24
          相关资源
          最近更新 更多