Я хочу добавить 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 не может подключиться.
Кто-нибудь может мне помочь с этой проблемой? Большое спасибо.
ни ваш секрет, ни ваш ответ не закодированы в urlen-коде, поэтому, если они содержат какие-либо специальные символы, сервер получит неверные данные, исправьте это. Кроме того, способность reCaptcha блокировать спамеров, вероятно, будет улучшена, если вы отправите IP-адрес клиента тоже, поэтому, хотя это и не требуется, я предлагаю вам отправить 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 терпит неудачу, потому что он не может проверить подпись
Других решений пока нет …