6

我在为特定页面使用 cURL 时遇到问题。

实时代码工作:http ://svgen.com/jupiter.php

这是我的代码:

    $url = 'https://uspdigital.usp.br/jupiterweb/autenticar';

    $data = array('codpes' => 'someLogin', 'senusu' => 'somePass', 'Submit' => '1');
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_COOKIEJAR, "FileHere");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "FileHere");
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);
    curl_exec($ch);
    curl_close($ch);

虽然我使用了相同的 url 和发布数据,但 file_get_contents 工作:

    $options = array('http' => array('method'  => 'POST','content' => http_build_query($data)));
    $context  = stream_context_create($options);
    $result = file_get_contents($url, false, $context);

    var_dump($result); 

有人可以帮助我吗?谢谢。

4

5 回答 5

14

很可能是 SSL 验证问题。

添加

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

此外,如果您使用CURLOPT_PROTOCOLS选项,它应该是HTTPS,因为您发布到一个安全的 url

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);    // you currently have http
于 2013-03-01T06:21:41.697 回答
6

使您的帖子数据为:

$data = array('codpes' => 'someLogin', 'senusu' => 'somePass', 'Submit' => '1');
$postData = "";
foreach( $data as $key => $val ) {
   $postData .=$key."=".$val."&";
}
$postData = rtrim($postData, "&");

并改变:

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
于 2013-03-01T06:24:48.717 回答
6
$data = array('codpes' => 'someLogin', 'senusu' => 'somePass', 'Submit' => '1');

本来应该

$data = http_build_query(array('codpes' => 'someLogin', 'senusu' => 'somePass', 'Submit' => '1'));

它还会自动对您的查询字符串进行 url 编码,并且比手动方法更安全。

于 2015-08-09T09:34:50.383 回答
2

试试这些:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_CAINFO, '/etc/pki/tls/cert.pem'); // path is valid for RHEL/CentOS

这可以确保您“卷曲”的资源具有有效的 SSL 证书。不建议将“CURLOPT_SSL_VERIFYPEER”设置为 false (0)。

于 2014-01-11T07:03:52.473 回答
1

您处于安全连接状态,为什么要使用:

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);

改用:

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
于 2013-03-01T06:24:13.393 回答