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) {
            // сохраняем данные, отправляем письма, делаем другую работу. Пользователь не робот
	}

Оставлять комментарии могут только зарегистрированные пользователи

Комментарии  

хакер
# хакер 14.09.2018 08:08
интересная статья. есть еще полезный материал по ссылке
http://phpjs.ru/2017/07/18/google-captcha-v2/
111111111111
# 111111111111 25.10.2019 08:23
Здравствуйте обязательно поле не заработало
Gigatator
# Gigatator 26.04.2020 11:22
Работает только в HTML 5, у вас в директиве аргумент "html"?