Curl https xml结果在PHP中返回空白(布尔值false)

时间:2013-01-29 19:28:38

标签: php xml curl

请你帮忙! 我使用cURL发送帖子,但响应为空(布尔值为false)。如果我在浏览器上发布数据,只需按下https://www.example.com/myaccount/transfer.php?username=usernamer&password=pass&deposit=5,浏览器就会显示以下结果:

  

1 0 success Your account has been deposited

当我看到浏览器源代码时,结果是:

<?xml version="1.0" encoding="utf-8"?>
<TransferResponse>
<version>1</version>
<result>0</result>
<resultstring>success</resultstring>
<description>Your account has been deposited</description>
</TransferResponse>

让我附上我的cURL代码:

<?php

$config = array
(
"url"        => "https://www.example.com/myaccount/",
"transfer"   => "transfer.php",
"browser"    => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16"
);

$postFields = "username=username&password=pass&deposit=5";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $config['url'] . $config['transfer']);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/cert/GeoTrustGlobalCA.crt");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $config['browser']);
curl_setopt($ch, CURLOPT_REFERER, $config['url']);
curl_setopt($ch, CURLOPT_HEADER, true);

$content = curl_exec($ch);

var_dump($content);
var_dump(curl_getinfo($ch));
curl_error($ch);

curl_close($ch);

echo $content;

?>

请帮助我在cURL中获得结果。我尝试了很多方法。我已经连续两天上网了。最后我决定问这里。有人能弄明白问题是什么吗?以下是:

  • 命令行将http (而不是https)的结果显示为xml。
  • 命令行返回https (非http)的结果如下:     失败:错误号码:60。原因:SSL证书问题,请验证CA证书是否正常。细节: 错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
  • http (非https)的cURL结果只是重定向www.example.com的警告页面
  • var_dump($content); and var_dump(curl_getinfo($ch));结果是:

    布尔值假 数组(大小= 26)   'url'=&gt;字符串'https://www.example.com/myaccount/transfer.php'(长度= 46)   'content_type'=&gt;空值   'http_code'=&gt; int 0   'header_size'=&gt; int 0   'request_size'=&gt; int 0   'filetime'=&gt; int -1   'ssl_verify_result'=&gt; int 0   'redirect_count'=&gt; int 0   'total_time'=&gt;漂浮1.451   'namelookup_time'=&gt;漂浮0   'connect_time'=&gt;漂浮0   'pretransfer_time'=&gt;漂浮0   'size_upload'=&gt;漂浮0   'size_download'=&gt;漂浮0   'speed_download'=&gt;漂浮0   'speed_upload'=&gt;漂浮0   'download_content_length'=&gt;浮点-1   'upload_content_length'=&gt;浮点-1   'starttransfer_time'=&gt;漂浮0   'redirect_time'=&gt;漂浮0   'certinfo'=&gt;     数组(大小= 0)       空   'primary_ip'=&gt;字符串'177.70.43.10'(长度= 11)   'primary_port'=&gt; int 443   'local_ip'=&gt;字符串'192.168.11.9'(长度= 0)   'local_port'=&gt; int 0   'redirect_url'=&gt;字符串''(长度= 0)

2 个答案:

答案 0 :(得分:1)

如果这个

  

SSL证书问题,验证CA证书是否正常。详细信息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败

是你的问题,curl_setopt() setting

CURLOPT_SSL_VERIFYPEER

可能适合你:

  

FALSE阻止cURL验证对等方的证书。备用   可以使用指定要验证的证书   可以使用CURLOPT_CAINFO选项或证书目录指定   CURLOPT_CAPATH选项。

所以设置

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

也可能

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

答案 1 :(得分:1)

将SSL验证设置为false会破坏SSL的目的。 一个合适的解决方案是为CURL设置CA证书。

解决方案1(对PHP.ini的更改):

  1. http://curl.haxx.se/docs/caextract.html
  2. 下载CA捆绑包(cacert.pem)
  3. 将其放在您的本地系统上(例如:C:\ xampp \ cacert.pem)
  4. 打开你的php.ini
  5. 将curl.ca_info选项设置为指向cacert.pem的位置

    Example: curl.ca_info="C:\xampp\cacert.pem"
    
  6. 重启Apache

  7. 解决方案2(在每次CURL调用之前设置选项)

    1. http://curl.haxx.se/docs/caextract.html
    2. 下载CA捆绑包(cacert.pem)
    3. 将其放在您的本地系统上(例如:C:\ xampp \ cacert.pem)
    4. 编写以下代码:

      curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
      curl_setopt ($ch, CURLOPT_CAINFO, "pathto\cacert.pem");
      
    5. 来源:http://tumblr.wehavefaces.net/post/52114563111/environment-windows-xampp-curl-library