google captcha v2

Гугл капча сейчас везде. Плюс ее в том что она заменяет CSRF-токен.

Регистрируем свой домен по ссылке https://www.google.com/recaptcha/admin#list . Получаем ключи. Гугл предоставляет свое мини-апи для запросов на проверку.   Скачать его можно тут https://github.com/vaajnur/recaptcha2

Кстати, если не любите ооп и композер, в конце статьи есть способ проверки капчи всего лишь 3мя строчками кода.

Размещаем на страничке HTML-код капчи с секретным ключом.

Подключаем javascript


<script src='https://www.google.com/recaptcha/api.js'></script>

обработка отправленной капчи


require_once __DIR__ . '/vendor/autoload.php';
// Register API keys at https://www.google.com/recaptcha/admin
$siteKey = '6LdISD0UAAAAAFUfApJZSRqBRuOcfiVdnT31234234';
$secret = '6LdISD0UAAAAAAkYRxJxMYahh70RCVcUn5675675';
// reCAPTCHA supported 40+ languages listed here: https://developers.google.com/recaptcha/docs/language
$lang = 'ru';
if (isset($_POST['g-recaptcha-response'])){
 $recaptcha = new \ReCaptcha\ReCaptcha($secret);
 $resp = $recaptcha->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);
 if ($resp->isSuccess()):
 ?>
 <h2>Success!</h2>
 <p>That's it. Everything is working. Go integrate this into your real project.</p>
 <p><a href="/">Try again</a></p>
 <?php
 else:
 ?>
 <h2>Something went wrong</h2>
 <?php
 endif;
}

Сама форма

  <form action="" method="post">
 <div class="g-recaptcha" data-sitekey="<?php echo $siteKey; ?>"></div>
 <script type="text/javascript"
 src="https://www.google.com/recaptcha/api.js?hl=<?php echo $lang; ?>">
 </script>
 <br/>
 <input type="submit" value="submit" />
 </form>


Полный код здесь https://github.com/vaajnur/recaptcha2/blob/master/index.php

И пример http://recaptcha.dev10.ru/

Invisible recaptcha

Для этой капчи тоже нужны бэкенд обработчики. Проверка проходит по переменной g-recaptcha-response, которая попадает в post массив , или тот же token в параметрах колбека.

Регаем невидимую капчу по новой. Класс и атрибуты переносим на кнопку сабмита и навешиваем элементарный обработчик на эту кнопку. Форме присваиваем id. Внизу справа должно появиться мод. окно капчи


<form action="" method="post" id="id_of_form">

  <button
  class="g-recaptcha"
  data-sitekey="<?php echo $siteKey;?>"
  data-callback="onSubmit">
  Submit
</button>


       var onSubmit = function(token) {
         grecaptcha.reset()
       document.getElementById("id_of_form").submit();

     }
</form>

Для ajax капчи добавляем


grecaptcha.reset();
// или 
grecaptcha.render('id_of_recaptcha_el');

Ошибки при работе с капчей.

Uncaught Error: reCAPTCHA placeholder element must be empty

Тег капчи не должен содержать вложенных тегов.

ReCAPTCHA couldn’t find user-provided function:

Бывает, что колбек существует, но не биндиться. Решение простое — вынести колбек за $(function), или прочие функции. Колбек должен быть виден напрямую.

recaptcha__ru.js:255 Uncaught (in promise) null 

Здесь ошибка колбека. Попробуйте вызвать grecaptcha.reset() в колбеке.

Uncaught Error: No reCAPTCHA clients exist.

Указанный выше способ — перегенерите капчу. grecaptcha.reset()

А также возможны ошибки бэка

OPENSSL file_get_contents(): Failed to enable crypto

file_get_contents() returns “failed to open stream:

что означает надо включить директивы пхп

allow_url_fopen
allow_url_include

Есть и более простая форма проверки recaptcha.
$recaptcha_secret = '6Leao28UAAAfgfgfMR-6OKq9HBRgfsdkyIBdfXnFA7';
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$recaptcha_secret."&response=".$_POST['g-recaptcha-response']);  
$result = json_decode($response, true); 

Leave a comment

Your email address will not be published.


*