无法使用PHP和cURL连接到reCAPTCHA的服务器

时间:2017-08-24 11:02:42

标签: 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_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),意思是&#34; cURL无法连接&#34;。

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

1 个答案:

答案 0 :(得分:0)

你的秘密和你的回复都不是urlencoded,所以如果它们包含任何特殊字符,服务器将收到错误的数据,修复它。此外,如果您发送客户端的IP地址,reCaptcha阻止垃圾邮件发送者的能力可能会得到改善,因此,虽然不是必需的,但我建议你发送ip。而不是多次调用urlencode,你可以给一个http_build_query调用一个数组,这通常会产生比多个urlencode()调用更漂亮的代码。试试这个:

$post_data=http_build_query ( array (
        'secret' => '???',
        'response' => $_POST ['g-recaptcha-response'],
        'remoteip' => $_SERVER ['REMOTE_ADDR']
) );

但这并不能解释为什么curl_exec失败..要调试它,添加CURLOPT_VERBOSE = 1 ...然后使用VERBOSE数据更新您的问题

另外,不要忽略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_exec失败,因为它无法验证签名