отсутствует-вход-ответ | Невидимая рекапча

Итак, я пытаюсь внедрить на каком-то веб-сайте новую невидимую reCaptcha от Google.

Я следую за шагами точно, но это постоянно дает мне ошибку отсутствия входного ответа.

HTML-код:

<form id="subscribe-form" class="form-inline" action="phpScripts/subscribe/subscribeHandler.php" method="post">
<div class="input-group">
<input type="email" name="email" class="form-control" size="50" placeholder="Email Address" required>
<div class="input-group-btn">
<button class="g-recaptcha btn btn-danger" data-sitekey="6LfoNhkUAAAAAEcQFx8vGHZKHXsZ_q0j2KDnmU9M" data-callback="submitForm">Subscribe</button>
</div>
</div>
</form>

PHP-код:

<?php
include 'databaseConnection.php';
if($_POST){
$secret = "MY SECRET KEY";
$captcha= $_POST['g-recaptcha-response'];
$ip = $_SERVER['REMOTE_ADDR'];
$url= file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=$secret&response=$captcha&remoteip=$ip");
print_r($url);
$decodedResponse = json_decode($url, TRUE);

if($decodedResponse['success'] == 1){//code here}

Итак, я думаю, что моя переменная $ captcha не может ничего «поймать» из POST g-recaptcha-response. Но почему, это именно так, как говорит Google, и точно так же, как старый reCaptcha v2.

Aswell, я включил <script src='https://www.google.com/recaptcha/api.js'></script>

2

Решение

Я сталкивался с одной и той же проблемой в течение нескольких часов, пока, наконец, не понял логику этой «невидимой капчи»!
причина, по которой вы не получаете ответ, заключается просто в том, что существует пустой элемент textarea с идентификатором и именем g-recaptcha-response

эта текстовая область заполняется только строкой ответа после вызов был выполнен (что обычно происходит в обычном recaptcha), но для «invisible-captcha» вы должны явно вызвать grecaptcha.execute(); с помощью кнопки «отправить», после чего заполняется текстовое поле, и ваша форма автоматически отправляется (при условии, что вы связали отправку с вашим callback функция).

В моем случае, у меня уже есть php, обрабатывающий форму и проверку recaptcha, поэтому я решил придерживаться старой версии «checkbox» (по крайней мере, до тех пор, пока она не улучшится), потому что я понял, что будет действительно раздражать менять все (отправка формы) логика, действие кнопок и код JavaScript) просто чтобы скрыть флажок! тем более что оба метода практически одинаковы!

4

Другие решения

Возможно, проблема в том, что вы привязываете функциональность к кнопке.

Попробуйте реализовать код, который они вам дают при создании ключей:

<form id="subscribe-form" class="form-inline" action="phpScripts/subscribe/subscribeHandler.php" method="post">
<div class="input-group">
<input type="email" name="email" class="form-control" size="50" placeholder="Email Address" required>
<div class="g-recaptcha" data-sitekey="{keyhere}"></div>
<div class="input-group-btn">
<button class="btn btn-danger" data-sitekey=" data-callback="submitForm">Subscribe</button>
</div>
</div>
</form>

Для проверки логики PHP:

if ( $_POST['g-recaptcha-response'] ) {
$secret = '{keyhere}';
$response = file_get_contents( "https://www.google.com/recaptcha/api/siteverify?secret=" . $secret . "&response=" . $_POST['g-recaptcha-response'] . "&remoteip=" . $_SERVER['REMOTE_ADDR'] );
$response = json_decode( $response );
if ( ! $response->success ) {
//return error
}

//code logic below
}

Код div, предоставляемый при создании ключей, должен правильно генерировать весь HTML-код с его конца, чтобы его можно было обработать с помощью проверки PHP при отправке формы.

1

Вот решение.

  • Сторона клиента
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>reCaptcha</title>

<!--api link-->
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<!--call back function-->
<script>
function onSubmit(token) {
document.getElementById('reCaptchaForm').submit();
}
</script>
</head>
<body>
<div class="container">
<form id="reCaptchaForm" action="signup.php" method="POST">
<input type="text" placeholder="type anything">
<!--Invisible reCaptcha configuration-->
<button class="g-recaptcha" data-sitekey="<your site key>" data-callback='onSubmit'>Submit</button>
<br/>
</form>
</div>
</body>
</html>
  • Проверка на стороне сервера: создайте signup.php файл
<?php
//only run when form is submitted
if(isset($_POST['g-recaptcha-response'])) {
$secretKey = '<your secret key>';
$response = $_POST['g-recaptcha-response'];
$remoteIp = $_SERVER['REMOTE_ADDR'];$reCaptchaValidationUrl = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=$secretKey&response=$response&remoteip=$remoteIp");
$result = json_decode($reCaptchaValidationUrl, TRUE);

//get response along side with all results
print_r($result);

if($result['success'] == 1) {
//True - What happens when user is verified
$userMessage = '<div>Success: you\'ve made it :)</div>';
} else {
//False - What happens when user is not verified
$userMessage = '<div>Fail: please try again :(</div>';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>reCAPTCHA Response</title>
</head>
<body>
<?php
if(!empty($userMessage)) {
echo $userMessage;
}
?>
</body>
</html>
1

Используйте grecaptcha.reset () для сброса recaptcha после каждого выполнения, и все должно работать нормально. следить эта ссылка Для получения дополнительной информации о grecaptcha.reset ().

0
По вопросам рекламы [email protected]