我在使用特定页面的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);
虽然我使用了相同的网址并发布数据,但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 :(得分:9)
最有可能是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
答案 1 :(得分: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);
答案 2 :(得分:6)
$data = array('codpes' => 'someLogin', 'senusu' => 'somePass', 'Submit' => '1');
应该是
$data = http_build_query(array('codpes' => 'someLogin', 'senusu' => 'somePass', 'Submit' => '1'));
它会自动对您的查询字符串进行url编码,并且比手动方法更安全。
答案 3 :(得分: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)。
答案 4 :(得分:1)
您正在使用安全连接,为什么使用:
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);
改为使用:
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);