cURL post不起作用 PHP

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和POST数据,但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); 

有人可以帮我吗? 谢谢。


你遇到了什么错误? - Michael Day
你有收到任何返回吗? - Vinod Kumar
我无法使用cURL进行身份验证。 - Maurício Giordano
@MaurícioGiordano 您的服务器SSL端口已启用。 - Tony Stark
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

@MaurícioGiordano 抱歉,我把0写成了false,是我的错误。 - Hanky Panky
如果您的工作curl请求在Laravel应用程序内部奇怪地无法正常工作,这将有所帮助。 - Michael Käfer

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

应该已经完成。
$data = http_build_query(array('codpes' => 'someLogin', 'senusu' => 'somePass', 'Submit' => '1'));

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


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);

to

curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

2
为什么不使用http_build_query()呢?请查看我的答案。 - Zeeshan
谢谢你--不知道为什么http_build_query()在一个服务器上可以工作,但在另一个服务器上失败了。你的解决方案帮助我创建了一个可以在两个服务器上都工作的解决方法。 - Richard

2

尝试以下方法:

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

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


1

您正在使用安全连接,为什么要使用“:”?

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);

使用以下代码代替:

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);

尝试了两种方法都不行...注意:file_get_contents使用HTTP而不是HTTPS,但可以工作... - Maurício Giordano
然后保持HTTPS,这样就少了一个错误 :-) curlfile_get_contents的工作方式不同。 - Alain Tiemblo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接