Invisible reCAPTCHA защищает ваш сайт от спама и других видов автоматических злоупотреблений, например массовые регистрации на форуме и т.д. В этой статье рассмотрим, как добавить reCAPTCHA на ваш сайт или приложение. 

Чтобы начать использовать Invisible reCAPTCHA, вам необходимо зарегистрироваться в службах Google. Далее получить ключевую пару для вашего сайта. Ключевая пара состоит из ключа сайта и секретного ключа. Ключ сайта используется для вызова службы Invisible reCAPTCHA на вашем сайте или мобильном приложении.

Секретный ключ используется для связи между вашим сервером приложений и сервером reCAPTCHA для проверки ответа пользователя. Для обеспечения безопасности секретный ключ не должен хранится в доступном для всех файле на сервере.

Полученный после регистрации ключ сайта необходимо вставить вместо <you site key> в клиентской части скрипта. А секретный ключ в серверной части вместо <your secret key>

Пример реализации функционала невидимой reCaptcha на стороне клиента + серверная часть (php):

Пример работы Google's reCaptcha

Сторона клиента, файл index.php или index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Invisible reCaptcha Demo</title>

    <!-- Подгружаем API Invisible reCAPTCHA -->
    <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, здесь вставляем ключ сайта -->
        <button class="g-recaptcha" data-sitekey="<your site key>" data-callback='onSubmit'>Отправить</button>
        <br/>
    </form>
</div>
</body>
</html>

Серверная часть, файл signup.php

<?php
//Выполняем проверку после отправки формы
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);

    //выводим полученный ответ от сервера
    print_r($result);

    if($result['success'] == 1) {
        //Проверка пройдена - здесь выполняем нужный нам код
        $userMessage = '<div>Успешно: проверка пройдена :)</div>';
    } else {
        //Проверка не пройдена - Здесь мы сообщаем клиенту что он спамер
        $userMessage = '<div>Упс: попробуйте позже :(</div>';
    }
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Invisible reCAPTCHA - Ответ сервера</title>
    </head>
    <body>
        <?php
            if(!empty($userMessage)) {
                echo $userMessage;
            }
        ?>
    </body>
</html>

Ответ от API сервера будет выглядеть так:

{
  "success": true|false,
  "challenge_ts": timestamp,
  "hostname": string,
  "error-codes": [...]
}

Важнейшей частью ответа является параметр «success», который дает вам необходимую информацию о принятии или отклонении проверки. Что касается другой информации в ответе, «challenge_ts» - это время, когда была запрошена проверка Invisible reCaptcha (формат ISO yyyy-MM-dd'T'HH: mm: ssZZ), а «hostname» показывает веб-сайт, на котором была выполнена проверка reCaptcha.