2013-03-01 54 views
4

我在使用cURL特定页面时遇到问题。cURL帖子无法运行PHP

一个活生生的代码工作: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); 

有人可以帮助我? 谢谢。

+0

你得到什么错误? – 2013-03-01 06:21:32

+0

你有没有得到任何回报? – uvinod 2013-03-01 06:21:40

+0

我无法使用cURL进行身份验证 – 2013-03-01 06:21:51

回答

5

让您的文章数据:

$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); 
+0

加载需要很长时间,但工作! – 2013-03-01 06:29:27

+0

这个答案在你的原始代码中也是一个错误。 – 2013-03-01 06:31:49

+0

为什么不使用http_build_query()来代替?检查我的答案。 – Zeeshan 2015-08-09 09:35:35

7

很可能是SSL验证问题。

添加

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

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

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS); // you currently have http 
+0

没有工作.. – 2013-03-01 06:22:45

+0

@MaurícioGiordano对不起,0代替错误,我的错误 – 2013-03-01 06:23:09

+0

仍然不工作.. – 2013-03-01 06:24:06

1

你是一个安全的连接上,为什么您使用:

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP); 

使用instea d:

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS); 
+0

它试过并且不工作...注意:file_get_contents使用HTTP而不是HTTPS并且工作... – 2013-03-01 06:25:11

+0

然后保留'HTTPS',这是一个错误:-)'curl'和'file_get_contents'的工作方式不一样。 – 2013-03-01 06:26:19

3

尝试这些:

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

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

应该已经

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

它会自动URL编码的查询字符串,以及,比手工方法更安全..