logo

Сайты / Разработка / 
reCaptcha от Google к любой форме

01 август, 2018 674 0
Для начала, необходимо зарегистрировать домен, на котором будет использоваться reСaptcha.
Заходим в Google reCaptcha Admin, заполняем нужные поля, выбираем вид капчи и соглашаемся на все условия. Для кириллических доменов домен указываем в punycode без https://.
После добавления сайта, попадаем на страницу с инструкциями по подключению. 

Добавляем скрипт обработки капчи перед закрывающимся тегом </head> (можно и в конец страницы, кому как нравится):
<script src='https://www.google.com/recaptcha/api.js'></script>

В форму, желательно рядом с кнопкой "Отправить", добавляем div с ключом капчи:
<div class="g-recaptcha" data-sitekey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"></div>

Внешний вид можно немного изменить и настроить дополнительными аттрибутами
светлая или тёмная — data-theme="light" или data-theme="dark"
нормальная или компактная — data-size="compact", data-size="normal"

Теперь необходимо настроить обработку формы таким образом, чтобы при отправке формы, код из капчи отправлялся гуглу на проверку, мы получали верификацию от гугла и данные из формы отправлялись нам. Можно заморочиться и написать велосипед самому, а можно взять готовый скрипт, который подключается к обработчику формы. Добрые люди поделились на Github. Содержимое библиотеки: 
<?php
/**
 * This is a PHP library that handles calling reCAPTCHA.
 *    - Documentation and latest version
 *          https://developers.google.com/recaptcha/docs/php
 *    - Get a reCAPTCHA API Key
 *          https://www.google.com/recaptcha/admin/create
 *    - Discussion group
 *          https://groups.google.com/group/recaptcha
 *
 * @copyright Copyright (c) 2014, Google Inc.
 * @link      https://www.google.com/recaptcha
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

/**
 * A ReCaptchaResponse is returned from checkAnswer().
 */
class ReCaptchaResponse
{
    public $success;
    public $errorCodes;
}

class ReCaptcha
{
    private static $_signupUrl = "https://www.google.com/recaptcha/admin";
    private static $_siteVerifyUrl =
        "https://www.google.com/recaptcha/api/siteverify?";
    private $_secret;
    private static $_version = "php_1.0";

    /**
     * Constructor.
     *
     * @param string $secret shared secret between site and ReCAPTCHA server.
     */
    function ReCaptcha($secret)
    {
        if ($secret == null || $secret == "") {
            die("To use reCAPTCHA you must get an API key from <a href='"
                . self::$_signupUrl . "'>" . self::$_signupUrl . "</a>");
        }
        $this->_secret=$secret;
    }

    /**
     * Encodes the given data into a query string format.
     *
     * @param array $data array of string elements to be encoded.
     *
     * @return string - encoded request.
     */
    private function _encodeQS($data)
    {
        $req = "";
        foreach ($data as $key => $value) {
            $req .= $key . '=' . urlencode(stripslashes($value)) . '&';
        }

        // Cut the last '&'
        $req=substr($req, 0, strlen($req)-1);
        return $req;
    }

    /**
     * Submits an HTTP GET to a reCAPTCHA server.
     *
     * @param string $path url path to recaptcha server.
     * @param array  $data array of parameters to be sent.
     *
     * @return array response
     */
    private function _submitHTTPGet($path, $data)
    {
        $req = $this->_encodeQS($data);
        $response = file_get_contents($path . $req);
        return $response;
    }

    /**
     * Calls the reCAPTCHA siteverify API to verify whether the user passes
     * CAPTCHA test.
     *
     * @param string $remoteIp   IP address of end user.
     * @param string $response   response string from recaptcha verification.
     *
     * @return ReCaptchaResponse
     */
    public function verifyResponse($remoteIp, $response)
    {
        // Discard empty solution submissions
        if ($response == null || strlen($response) == 0) {
            $recaptchaResponse = new ReCaptchaResponse();
            $recaptchaResponse->success = false;
            $recaptchaResponse->errorCodes = 'missing-input';
            return $recaptchaResponse;
        }

        $getResponse = $this->_submitHttpGet(
            self::$_siteVerifyUrl,
            array (
                'secret' => $this->_secret,
                'remoteip' => $remoteIp,
                'v' => self::$_version,
                'response' => $response
            )
        );
        $answers = json_decode($getResponse, true);
        $recaptchaResponse = new ReCaptchaResponse();

        if (trim($answers ['success']) == true) {
            $recaptchaResponse->success = true;
        } else {
            $recaptchaResponse->success = false;
            $recaptchaResponse->errorCodes = $answers [error-codes];
        }

        return $recaptchaResponse;
    }
}

?>

Добавляем библиотеку в начало нашего PHP обработчика формы (файлик recaptchalib.php закидываем туда, где лежит обработчик). Чуть ниже в файл добавляем секретный код из Шаг 2. от гугла и ещё несколько переменных.
require_once __DIR__ . '/recaptchalib.php';

$secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // наш секретный ключ
$response = null; // пустой ответ каптчи
$reCaptcha = new ReCaptcha($secret); // проверка нашего секретного ключа

if ($_POST["g-recaptcha-response"]) {
$response = $reCaptcha->verifyResponse(
$_SERVER["REMOTE_ADDR"],
$_POST["g-recaptcha-response"]
);
}

Также, добавляем проверку успешной проверки, как-то так)  laughing
if ($response != null && $response->success) {
//тут исполняемый код при успешной проверке
} else {
 echo 'Не пройдена каптча. Попробуйте еще раз.';
}

Проверяем почту получателя, тему сообщения, классы полей формы и получаем рабочую проверку роботов от гугла! :)

Полный HTML-код моей формы: 
<form id="contact-form" method="post" action="mailform.php">
    <div class="clint__comment__form">
        <div class="single__cl__form">
            <input name="name" id="name" type="text" placeholder="Ваше имя">
            <input name="tel" id="tel" type="text" placeholder="Телефон">
        </div>
        <div class="single__cl__message">
            <textarea name="message" id="message" placeholder="Сообщение"></textarea>
        </div>
        <div class="clint__submit__btn">
            <div style="float: left; margin-right: 42px;" class="g-recaptcha" data-sitekey="xxx СЕКРЕТНЫЙ КОД ИЗ ШАГА 1 ОТ GOOGLE xxx"></div>
            <button class="submit htc__btn" type="submit" style="margin-top:5px;">
                ОТПРАВИТЬ
            </button>
        </div>
    </div>
</form>

Полный PHP-код обработчика: 
<?php 
    require_once __DIR__ . '/recaptchalib.php';
		
    $secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // наш секретный ключ
    $response = null; // пустой ответ каптчи
    $reCaptcha = new ReCaptcha($secret); // проверка нашего секретного ключа

    $reCaptcha = new ReCaptcha($secret);
    if ($_POST["g-recaptcha-response"]) {
    $response = $reCaptcha->verifyResponse(
        $_SERVER["REMOTE_ADDR"],
        $_POST["g-recaptcha-response"]
    );
    }

    // Only process POST reqeusts.
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        if ($response != null && $response->success) {
            $charset = "utf-8";
            // Get the form fields and remove whitespace.
            $name = strip_tags(trim($_POST["name"]));
            $name = str_replace(array("\r","\n"),array(" "," "),$name);
            $tel = trim($_POST["tel"]);
            $message = trim($_POST["case-details"]);

            // Check that data was sent to the mailer.
            if ( empty($name) OR empty($tel) ) {
                // Set a 400 (bad request) response code and exit.
                http_response_code(400);
                echo "Пожалуйста, заполните необходимые поля.";
                exit;
            }

            // Set the recipient email address.
            $recipient = "вашemail@xxxx.xx";

            // Set the email subject.
            $subject = "Сообщение с сайта";

            // Build the email content.
            $email_content = "Имя: <b>$name</b><br>";
            $email_content .= "Телефон: <b>$tel</b><br>";
            $email_content .= "<br>Сообщение: <br>$message<br>";

            // Build the email headers.
            $email_headers = "Content-type: text/html; charset=$charset\r\n";
            $email_headers .= "From: вашemail@xxxx.xx <вашemail@xxxx.xx>";
            
            // Send the email.
            if (mail($recipient, $subject, $email_content, $email_headers)) {
                // Set a 200 (okay) response code.
                http_response_code(200);
                echo "Ваше сообщение отправлено.";
            } else {
                // Set a 500 (internal server error) response code.
                http_response_code(500);
                echo "Ошибка. Мы не смогли отправить Ваше сообщение.";
            }
        } else {
         echo 'Не пройдена каптча. Попробуйте еще раз.';
        }

    } else {
        // Not a POST request, set a 403 (forbidden) response code.
        http_response_code(403);
        echo "Ошибка сервера. Попробуйте ещё раз.";
    }

?>

Внешний вид формы (как сделать - можно почитать тут): 
Прокомментировать
Введите код с картинки:*
Кликните на изображение чтобы обновить код, если он неразборчив
все шаблоны для dle на сайте newtemplates.ru скачать