Универсальный класс reCaptcha v2

Готовый сниппет с инструкцией о том как быстро добавить google каптчу на сайт. В данном примере используется язык программирования PHP, но инструкция легко воспроизводится и на других языках программирования, включая Javascript и Python.

Универсальный класс для установки reCaptcha на сайт. Простое использование: - Вывод капчи ReCaptcha::render() - Валидация каптчи ReCaptcha::validate()

Для создания reCaptcha нужно - создать проект в console.cloud.google.com - создать ключ капчи, выбрать параметры - v2, checkbox - создать секретный API ключ для запросов на сервер

Создание API ключа

Создание ключа доступа в console.cloud.google.com

Создание reCaptcha

Можно создать несколько ключей на проект. Для тестирования в процессе разработки, можно отключить проверку домена. Создание ключа reCAPTCHA

Внимание!

Ссылка в константе RECAPTCHA_APIURL содержит \<your-project>. При создании ключа, будет сгенерирована ссылка, в которую нужно подставить API ключ. Ключ подставлять не нужно, в это происходит автоматически.

Заменить константы в классе ReCaptcha

После этапа регистрации, в инструкциях по установке ключа будут данные, которые необходимо добавить в статические константы класса ReCaptcha.

Ключ интеграции

Фрагмент кода где произвести замену.

    const RECAPTCHA_SITEKEY = '<RECAPTCHA_SITEKEY>'; // sitekey
    const RECAPTCHA_ACTION = '<ACTION>'; // optional 
    const RECAPTCHA_APIKEY = '<APIKEY>'; // need create credentials in 
    const RECAPTCHA_APIURL = 'https://recaptchaenterprise.googleapis.com/v1/projects/<your-project>/assessments?key='; // # Key details Verify the reCAPTCHA token
<?php

class ReCaptcha {
    const RECAPTCHA_SITEKEY = '<RECAPTCHA_SITEKEY>'; // sitekey
    const RECAPTCHA_ACTION = '<ACTION>'; // optional 
    const RECAPTCHA_APIKEY = '<APIKEY>'; // need create credentials in 
    const RECAPTCHA_APIURL = 'https://recaptchaenterprise.googleapis.com/v1/projects/<your-project>/assessments?key='; // # Key details Verify the reCAPTCHA token

    public static function validate() {
        if (empty($_POST['g-recaptcha-response'])) {
            return false;
        }

        $sitekey = self::RECAPTCHA_SITEKEY;
        $apikey = self::RECAPTCHA_APIKEY;
        $apiurl = self::RECAPTCHA_APIURL;
        $url = $apiurl.$apikey;
        $action = self::RECAPTCHA_ACTION;
        $body = [
            'event' => [
                'token' => $_POST['g-recaptcha-response'],
                'expectedAction' => $action,
                'siteKey' => $sitekey
            ],
        ];

        $oCurl = curl_init();
        curl_setopt($oCurl, CURLOPT_URL, $url);
        curl_setopt($oCurl, CURLOPT_POST, true);
        curl_setopt($oCurl, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
        ]);
        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($oCurl, CURLOPT_POSTFIELDS, json_encode($body));
        $result = curl_exec($oCurl);
        curl_close($oCurl);

        $result = json_decode($result); // object
        if ($result->tokenProperties->valid) {
            return true;
        }

        return false;
    }

    public static function render() {
        echo "<style>.g-recaptcha {margin: 10px;}</style>";
        echo '<script src="https://www.google.com/recaptcha/enterprise.js" async defer></script>';
        echo "<div class='g-recaptcha' 
                data-sitekey=". self::RECAPTCHA_SITEKEY ." 
                data-action=". self::RECAPTCHA_ACTION .">
            </div>";
    }
}