【问题标题】:cURL post not working PHPcURL 帖子不工作 PHP
【发布时间】:2026-01-05 08:00:01
【问题描述】:

我在为特定页面使用 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); 

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

【问题讨论】:

  • 你遇到了什么错误?
  • 你得到回报了吗?
  • 我无法使用 cURL 进行身份验证
  • @MaurícioGiordano 您的服务器 SSL 端口已启用。

标签: php post curl


【解决方案1】:
$data = array('codpes' => 'someLogin', 'senusu' => 'somePass', 'Submit' => '1');

应该是

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

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

【讨论】:

    【解决方案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)。

    【讨论】:

      【解决方案3】:

      将您的帖子数据设为:

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

      【讨论】:

      • 为什么不使用 http_build_query() 呢?检查我的答案。
      • 谢谢你——出于某种原因 http_build_query() 在一台服务器上为我工作,但在另一台服务器上失败了。您的解决方案帮助我创建了适用于两台服务器的解决方法。
      【解决方案4】:

      你的连接是安全的,你为什么要使用:

      curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);
      

      改用:

      curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
      

      【讨论】:

      • 这两种方法都试过了,但都不起作用...注意:file_get_contents 使用 HTTP 而不是 HTTPS 并且可以工作...
      • 然后保留HTTPS,这样会少一个错误:-) curlfile_get_contents 工作方式不同。
      【解决方案5】:

      很可能是 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
      

      【讨论】:

      • @MaurícioGiordano 抱歉,我的错误是 0 而不是 false
      • 如果你的 curl-request 在你的 Laravel 应用程序中奇怪地不起作用,这会有所帮助