reCAPTCHA сейчас, это очень важный инструмент для того, чтобы отделить мух от котлет, ботов от людей. Гугл сильно причесал reCAPTCHA 2.0, и теперь вам не надо пол часа вбивать эти нудные символы, как это было раньше на первой версии. Тыкнул по флажку и готово.
Но в документации это полезной штуки, не показано как ее валидировать через PHP и JavaScript.
Итак, сперва првоерим капчу на заполненность через JavaScript, чтобы дать пользователю возможность не отправлять по несколько раз форму, если он еще не заполнил капчу. К примеру у нас есть такая форма.
<form id="sendForm" action="mail.php" method="post" enctype="multipart/form-data">
<input required name="sender_name" placeholder="Ваше имя..."/>
<input required name="sender_email" placeholder="Ваш email..."/>
<textarea required placeholder="Ваше сообщение" name="sender_message">
<div class="captcha_wrapper">
<script src='https://www.google.com/recaptcha/api.js'></script>
<div class="g-recaptcha" data-sitekey="YOUR__PUBLIC_KEY"></div>
</div>
<button type="submit" id="send_message">Отправить</button>
</form>
YOUR_PUBLIC_KEY вы возьмете отсюда https://www.google.com/recaptcha/intro/index.html, там же будет и YOUR_SECRET_KEY упомянутый ниже.
В ней будет выведена recapcha, но при нажатии на кнопку отправки, браузер попросит заполнить все поля, так как у них стоит атрибут required, но рекапча отправится не заполненной. Мы разумеется проверим ее на сервере, но и до этого лучше дать возможность юзеру не делать лишних движений, а сразу дать ему понять что он что-то забыл. Делается это при помощи метода grecaptcha.getResponse()
<script>
document.getElementById('sendForm').onsubmit = function () {
if (!grecaptcha.getResponse()) {
alert('Вы не заполнили поле Я не робот!');
return false; // возвращаем false и предотвращаем отправку формы
}
}
</script>
Теперь форма не отправится, пока пользователь не заполнит капчу.
Чтобы вы понимали, мы сейчас не проверили капчу а всего лишь слегка улучшили интерфейс для конечного пользователя. Это надо понимать. Любой бот легко отправит эту форму на сервер, и валидировать ее нужно именно там.
Првоеряем reCAPTCHA через PHP
При отправки формы, на сервер, помимо прочего, уходит поле “g-recaptcha-response”. Его и нужно проверить. Никаких дополнительных библиотек подключать не будем. Только голый php:
<?php
$response = $_POST["g-recaptcha-response"];
$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = [
'secret' => 'YOUR_SECRET',
'response' => $_POST["g-recaptcha-response"]
];
$options = [
'http' => [
'method' => 'POST',
'content' => http_build_query($data)
]
];
$context = stream_context_create($options);
$verify = file_get_contents($url, false, $context);
$captcha_success=json_decode($verify);
if ($captcha_success->success==false) {
echo "Ты робот! Не люблю тебя!";
} else if ($captcha_success->success==true) {
// сохраняем данные, отправляем письма, делаем другую работу. Пользователь не робот
}


Комментарии
http://phpjs.ru/2017/07/18/google-captcha-v2/