Google reCAPTCHA в приложениях Сайт и Блог

5

По умолчанию, в приложениях Сайт и Блог, капча от Google не предусмотрена. Но есть решение и сейчас я расскажу, как её добавить.

Для этого нам потребуется сначала сформировать ключи reCAPTHCA (site key и secret key), как это сделать подробно описано в этой статье https://www.shop-script.ru/help/18935/recaptcha/ и будем считать, что вы уже получили ключи.

Далее, для каждого приложения (Сайт и Блог) нам нужно создать классы и переопределить саму капчу, согласно мануалу https://developers.webasyst.ru/features/captcha/

ДЛЯ ПРИЛОЖЕНИЯ БЛОГ.

1. Создадим файл-класс blogMyReCaptcha.class.php по адресу: /wa-apps/blog/lib/classes/
полный путь получится: /wa-apps/blog/lib/classes/blogMyReCaptcha.class.php

2. В файл-класс добавим следующий код и вместо пометок КЛЮЧ и СЕКРЕТНЫЙ КЛЮЧ, вставить коды сформированных ключей reCAPTCHA (обязательно, чтобы они были в одинарных кавычках!):

<?php 
class blogMyReCaptcha extends waAbstractCaptcha
{
 const SITEKEY = 'КЛЮЧ';
 const SECRETKEY = 'СЕКРЕТНЫЙ КЛЮЧ';

 const SITE_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify';
    
    public function getHtml()
    {
        $sitekey = self::SITEKEY;
        $html = <<<HTML
<div class="wa-captcha wa-recaptcha">
    <script src='https://www.google.com/recaptcha/api.js' async></script>
    <div class="g-recaptcha" data-sitekey={$sitekey}></div>
</div>
HTML;
        return $html;
    }
    
    public function isValid($code = null, &$error = '')
    {
        $secretkey = self::SECRETKEY;
        if ($code === null) {
            $code = waRequest::post('g-recaptcha-response');
        }
        $handle = curl_init(self::SITE_VERIFY_URL);
        $options = array(
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => http_build_query(array(
                'secret' => $secretkey,
                'response' => $code,
                'remoteip' => waRequest::getIp(),
            )),
            CURLOPT_HTTPHEADER => array(
                'Content-Type: application/x-www-form-urlencoded'
            ),
            CURLINFO_HEADER_OUT => false,
            CURLOPT_HEADER => false,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => true
        );
        curl_setopt_array($handle, $options);
        $response = curl_exec($handle);
        curl_close($handle);
        if ($response) {
            $response = json_decode($response, true);
            if (isset($response['success']) && $response['success'] == true) {
                return true;
            } elseif (isset($response['error-codes'])) {
                $errors = array();
                foreach ($response['error-codes'] as $error_code) {
                    switch ($error_code) {
                        case 'missing-input-secret':
                            $errors[] = _ws('The secret parameter is missing.');
                        break;
                        case 'invalid-input-secret':
                            $errors[] = _ws('The secret parameter is invalid or malformed.');
                            break;
                        case 'missing-input-response':
                            $errors[] = _ws('The response parameter is missing.');
                            break;
                        case 'invalid-input-response':
                            $errors[] = _ws('The response parameter is invalid or malformed.');
                            break;
                        default:
                            $errors[] = $error_code;
                    }
                    $error = implode('<br>', $errors);
                }
            }
        }
        return false;
    }

    public function display()
    {

    }
}

3. Следующим этапом перейдем по адресу /wa-apps/blog/lib/config/ и изменим файл factories.php (если его нет, хотя для приложения Блог он обязан быть, тогда создадим) и приведем содержание файла в следующий вид (на этом этапе мы переопределяем капчу приложения Блог)

<?php

return array(
 'front_controller' => array('blogFrontController'),
 'captcha' => array('blogMyReCaptcha')
);

4. Чтобы наша новая капча (reCAPTCHA) отображалась в приложении Блог (в комментариях или в авторизации через приложение Блог, формы) обязательно в настройках Блога должна стоять галочка напротив "Защита формы добавления комментария капчей (CAPTCHA)" , так как мы переопределили капчу, то вместо обычной капчи будет reCAPTHA.

ДЛЯ ПРИЛОЖЕНИЯ САЙТ.

1. Создадим файл-класс siteMyReCaptcha.class.php по адресу: /wa-apps/site/lib/classes/
полный путь получится: /wa-apps/site/lib/classes/siteMyReCaptcha.class.php

2. В файл-класс добавим следующий код и вместо пометок КЛЮЧ и СЕКРЕТНЫЙ КЛЮЧ, вставить коды сформированных ключей reCAPTCHA (обязательно, чтобы они были в одинарных кавычках!):

<?php 
class siteMyReCaptcha extends waAbstractCaptcha
{
 const SITEKEY = 'КЛЮЧ';
 const SECRETKEY = 'СЕКРЕТНЫЙ КЛЮЧ';

 const SITE_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify';
    
    public function getHtml()
    {
        $sitekey = self::SITEKEY;
        $html = <<<HTML
<div class="wa-captcha wa-recaptcha">
    <script src='https://www.google.com/recaptcha/api.js' async></script>
    <div class="g-recaptcha" data-sitekey={$sitekey}></div>
</div>
HTML;
        return $html;
    }
    
    public function isValid($code = null, &$error = '')
    {
        $secretkey = self::SECRETKEY;
        if ($code === null) {
            $code = waRequest::post('g-recaptcha-response');
        }
        $handle = curl_init(self::SITE_VERIFY_URL);
        $options = array(
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => http_build_query(array(
                'secret' => $secretkey,
                'response' => $code,
                'remoteip' => waRequest::getIp(),
            )),
            CURLOPT_HTTPHEADER => array(
                'Content-Type: application/x-www-form-urlencoded'
            ),
            CURLINFO_HEADER_OUT => false,
            CURLOPT_HEADER => false,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => true
        );
        curl_setopt_array($handle, $options);
        $response = curl_exec($handle);
        curl_close($handle);
        if ($response) {
            $response = json_decode($response, true);
            if (isset($response['success']) && $response['success'] == true) {
                return true;
            } elseif (isset($response['error-codes'])) {
                $errors = array();
                foreach ($response['error-codes'] as $error_code) {
                    switch ($error_code) {
                        case 'missing-input-secret':
                            $errors[] = _ws('The secret parameter is missing.');
                        break;
                        case 'invalid-input-secret':
                            $errors[] = _ws('The secret parameter is invalid or malformed.');
                            break;
                        case 'missing-input-response':
                            $errors[] = _ws('The response parameter is missing.');
                            break;
                        case 'invalid-input-response':
                            $errors[] = _ws('The response parameter is invalid or malformed.');
                            break;
                        default:
                            $errors[] = $error_code;
                    }
                    $error = implode('<br>', $errors);
                }
            }
        }
        return false;
    }

    public function display()
    {

    }
}

3. Следующим этапом перейдем по адресу /wa-apps/site/lib/config/ и создадим файл factories.php (в приложении САЙТ этого файла по умолчанию нет, в отличии от приложения БЛОГ) и добавим следующий код (на этом этапе мы переопределяем капчу приложения САЙТ):

<?php

return array(
 'captcha' => array('siteMyReCaptcha')
);

4. Теперь , так как мы переопределили капчу, то вместо обычной капчи будет reCAPTHA от Google во всём приложении САЙТ.

Вот таким способом мы получаем возможность использовать капчу (reCAPTCHA) от Google.
Всем спасибо за внимание, если есть замечания и предложения, пишите, всегда рад)

11 комментариев

Добавить комментарий

Чтобы добавить комментарий, зарегистрируйтесь или войдите