reCAPTCHA сейчас, это очень важный инструмент для того, чтобы отделить мух от котлет, ботов от людей. Гугл сильно причесал reCAPTCHA 2.0, и теперь вам не надо пол часа вбивать эти нудные символы, как это было раньше на первой версии. Тыкнул по флажку и готово.

Но в документации это полезной штуки, не показано как ее валидировать через PHP и JavaScript.

Итак, сперва првоерим капчу на заполненность через JavaScript, чтобы дать пользователю возможность не отправлять по несколько раз форму, если он еще не заполнил капчу. К примеру у нас есть такая форма.

1
2
3
4
5
6
7
8
9
10
<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()

1
2
3
4
5
6
7
8
<script>
document.getElementById('sendForm').onsubmit = function () {
    if (!grecaptcha.getResponse()) {
         alert('Вы не заполнили поле Я не робот!');
         return false; // возвращаем false и предотвращаем отправку формы
    }
}
</script>

Теперь форма не отправится, пока пользователь не заполнит капчу.

Чтобы вы понимали, мы сейчас не проверили капчу а всего лишь слегка улучшили интерфейс для конечного пользователя. Это надо понимать. Любой бот легко отправит эту форму на сервер, и валидировать ее нужно именно там.

Првоеряем reCAPTCHA через PHP

При отправки формы, на сервер, помимо прочего, уходит поле “g-recaptcha-response”. Его и нужно проверить. Никаких дополнительных библиотек подключать не будем. Только голый php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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"?