Can';t连接到reCAPTCHA';s服务器使用PHP和cURL
我想将reCAPTCHA添加到我在SourceForge上托管的网站,但当我尝试在后端验证用户的响应时,它就是不起作用 这是我的密码: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
<?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)代码>-然后重试。现在有详细的信息吗?