Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t连接到reCAPTCHA';s服务器使用PHP和cURL_Php_Curl_Recaptcha_Sourceforge - Fatal编程技术网

Can';t连接到reCAPTCHA';s服务器使用PHP和cURL

Can';t连接到reCAPTCHA';s服务器使用PHP和cURL,php,curl,recaptcha,sourceforge,Php,Curl,Recaptcha,Sourceforge,我想将reCAPTCHA添加到我在SourceForge上托管的网站,但当我尝试在后端验证用户的响应时,它就是不起作用 这是我的密码: <?php $secret = '****'; $recaptcha_response = $_POST["recaptcha_response"]; $url = 'https://www.google.com/recaptcha/api/siteverify'; $post_data = "secret=".$secret."&response

我想将reCAPTCHA添加到我在SourceForge上托管的网站,但当我尝试在后端验证用户的响应时,它就是不起作用

这是我的密码:

<?php
$secret = '****';
$recaptcha_response = $_POST["recaptcha_response"];
$url = 'https://www.google.com/recaptcha/api/siteverify';
$post_data = "secret=".$secret."&response=".$recaptcha_response;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_CAINFO, '****/GeoTrust.cer');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$response_json = curl_exec($ch);
if (curl_errno($ch)) {
    var_dump(curl_errno($ch));
}
curl_close($ch);
......
?>

结果是int(7),表示“cURL无法连接”


有人能帮我解决这个问题吗?非常感谢。

您的密码和响应都不是URL编码的,因此如果它们包含任何特殊字符,服务器将接收错误的数据,请修复。此外,如果您也发送客户端的ip地址,reCaptcha阻止垃圾邮件发送者的能力可能会得到提高,因此,虽然不是必需的,但我建议您发送ip地址。您可以为单个http_build_查询调用提供一个数组,而不是多次调用urlencode,这通常会产生比多次urlencode()调用更漂亮的代码。试试这个:

$post_data=http_build_query ( array (
        'secret' => '???',
        'response' => $_POST ['g-recaptcha-response'],
        'remoteip' => $_SERVER ['REMOTE_ADDR']
) );
但这并不能解释为什么curl_exec会失败。。要调试它,请添加CURLOPT_VERBOSE=1。。。然后用详细的数据更新你的问题

另外,不要忽略curl_setopt的返回值,如果设置选项时出现问题,curl_setopt将返回bool(false),您可以忽略它。。使用类似

function ecurl_setopt ( /*resource*/$ch , int $option , /*mixed*/ $value ){
    $ret=curl_setopt($ch,$option,$value);
    if($ret!==true){
        //option should be obvious by stack trace
        throw new RuntimeException ( 'curl_setopt() failed. curl_errno: ' .  curl_errno ($ch) .'. curl_error: '.curl_error($ch) );
    }
}
例如,如果
curl_setopt($ch,CURLOPT_CAINFO,“…/GeoTrust.cer”);

失败,它返回bool(false),而您的curl\u exec失败,因为它无法验证签名

您的机密和响应都不是URL编码的,因此如果它们包含任何特殊字符,服务器将接收错误的数据,请修复。此外,如果您也发送客户端的ip地址,reCaptcha阻止垃圾邮件发送者的能力可能会得到提高,因此,虽然不是必需的,但我建议您发送ip地址。您可以为单个http_build_查询调用提供一个数组,而不是多次调用urlencode,这通常会产生比多次urlencode()调用更漂亮的代码。试试这个:

$post_data=http_build_query ( array (
        'secret' => '???',
        'response' => $_POST ['g-recaptcha-response'],
        'remoteip' => $_SERVER ['REMOTE_ADDR']
) );
但这并不能解释为什么curl_exec会失败。。要调试它,请添加CURLOPT_VERBOSE=1。。。然后用详细的数据更新你的问题

另外,不要忽略curl_setopt的返回值,如果设置选项时出现问题,curl_setopt将返回bool(false),您可以忽略它。。使用类似

function ecurl_setopt ( /*resource*/$ch , int $option , /*mixed*/ $value ){
    $ret=curl_setopt($ch,$option,$value);
    if($ret!==true){
        //option should be obvious by stack trace
        throw new RuntimeException ( 'curl_setopt() failed. curl_errno: ' .  curl_errno ($ch) .'. curl_error: '.curl_error($ch) );
    }
}
例如,如果
curl_setopt($ch,CURLOPT_CAINFO,“…/GeoTrust.cer”);

失败,它返回bool(false),您的curl\u exec失败,因为它无法验证签名

请尝试在没有证书的情况下验证主机。也不确定是否有问题,但post字段可能需要是数组而不是字符串。它不应该是
。/../../../../GeoTrust.cer
而不是
…/GeoTrust.cer
?@Justinas我想它只是被审查了一下,他可能考虑过这条路confidential@TheFallen我试图将CURLOPT_SSL_VERIFYPEER设置为false,但它不起作用。@Justinas是的,我只是不想显示路径,很抱歉出现歧义。请在没有证书的情况下尝试并验证主机。也不确定是否有问题,但post字段可能需要是数组而不是字符串。它不应该是
。/../../../../GeoTrust.cer
而不是
…/GeoTrust.cer
?@Justinas我想它只是被审查了一下,他可能考虑过这条路confidential@TheFallen我试图将CURLOPT_SSL_VERIFYPEER设置为false,但不起作用。@Justinas是的,我只是不想显示路径,很抱歉出现了歧义。谢谢,我已将CURLOPT_VERBOSE设置为true,但没有从中获得任何信息。问题是什么?似乎所有的curl_setopt()都返回了true。那么您没有看到STDERR,只有STDOUT,因为默认情况下curl_VERBOSE打印到STDERR。不过,它可能是打印到php错误日志的打印机。无论如何,要将curl的详细信息重定向到stdout/browser,请执行
ecurl_setopt($ch,CURLOPT_STDERR,stdout)-然后重试。现在有来自CURLOPT_VERBOSE的任何信息吗?谢谢,我已将CURLOPT_VERBOSE设置为true,但没有从中获得任何信息。问题是什么?似乎所有的curl_setopt()都返回了true。那么您没有看到STDERR,只有STDOUT,因为默认情况下curl_VERBOSE打印到STDERR。不过,它可能是打印到php错误日志的打印机。无论如何,要将curl的详细信息重定向到stdout/browser,请执行
ecurl_setopt($ch,CURLOPT_STDERR,stdout)-然后重试。现在有详细的信息吗?