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 комментариев

  • +5
    DemoLLC DemoLLC Эксперт Разработчик 20 декабря 2017 03:07 #

    ИМХО, это очень страшное решение.

    Cоздаёте файл config.php со следующим содержимым:

    <?php
    
    return array (
      'factories' =>
      array (
        'captcha' =>
        array (
          0 => 'waReCaptcha',
          1 =>
          array (
            'sitekey' => 'ваш_sitekey',
            'secret' => 'ваш_secret',
          ),
        ),
      ),
    );
    

    И кладёте этот файл в папки
    /wa-config/apps/blog/
    /wa-config/apps/site/

    И всё.

    • +1
      Игорь Игорь 8 февраля 2018 17:42 #

      Спасибо! Метод прост как 5 копеек и самое главное работает!

    • +1
      BestWebPro BestWebPro Эксперт 26 февраля 2018 11:58 #

      Спасибо!

    • +4
      Welldi.ru Welldi.ru Эксперт Разработчик 20 декабря 2017 14:35 #

      Может команда WA наконец порадует нас наитивной поддержкой гугел-капчи???? Ведь Новый Год?

      Не ради себя прошу, ради пользы :)

      • +1

        Написать тебе плагин? :-)

        • +1

          сам могу написать) спасибо)
          Тему создал, потому что на вопросы людей, в хаб поддерже, никто ответа не дал, как это всё дело реализовать в приложениях Сайт и Блог. В итоге уже есть какие-то решения)

        • +6

          Поставьте приложение "Дополнения" https://www.webasyst.ru/store/app/apps/ и плагин к нему https://www.webasyst.ru/store/app/apps/plugins/ и включайте reCaptcha для любых приложений фронтенда, использующих капчу

        • +1
          Мейд Юра Мейд Юра 20 марта 2018 11:56 #

          Круто, а в облаке как это сделать ?

          • +1
            Алексей Алексей 20 марта 2018 19:38 #

            Выше есть способ через плагин

            Поставьте приложение "Дополнения" https://www.webasyst.ru/store/app/apps/ и плагин к нему https://www.webasyst.ru/store/app/apps/plugins/ и включайте reCaptcha для любых приложений фронтенда, использующих капчу
            • +1
              Bostich Bostich 12 января 2019 16:58 #

              А куда делать reCaptcha? Сейчас какой-то другой способ?

            • +1
              Kas Andriy Kas Andriy 23 июля 2019 23:19 #

              PHP reCAPTCHA V3 class  простий клас для роботи з капчею: https://www.site4study.com/les...

              <?php
              include_once 'RecaptchaModule.php';
              
              if ($_SERVER['REQUEST_METHOD'] == 'POST') {
              
                  $recaptcha = new RecaptchaModule();
                  if ($recaptcha->isChecked()) {
                      echo 'HELLO PEOPLE';
                      echo '<br>' . $_POST['name'];
                  } else {
                      echo 'HELLO ROBOT';
                  }
              
              }
              
              ?>

              Добавление новых комментариев к этой теме отключено.