Google reCAPTCHA в приложениях Сайт и Блог
По умолчанию, в приложениях Сайт и Блог, капча от 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 комментариев
ИМХО, это очень страшное решение.
Cоздаёте файл config.php со следующим содержимым:
И кладёте этот файл в папки
/wa-config/apps/blog/
/wa-config/apps/site/
И всё.
Спасибо! Метод прост как 5 копеек и самое главное работает!
Спасибо!
Может команда WA наконец порадует нас наитивной поддержкой гугел-капчи???? Ведь Новый Год?
Не ради себя прошу, ради пользы :)
Написать тебе плагин? :-)
сам могу написать) спасибо)
Тему создал, потому что на вопросы людей, в хаб поддерже, никто ответа не дал, как это всё дело реализовать в приложениях Сайт и Блог. В итоге уже есть какие-то решения)
Поставьте приложение "Дополнения" https://www.webasyst.ru/store/app/apps/ и плагин к нему https://www.webasyst.ru/store/app/apps/plugins/ и включайте reCaptcha для любых приложений фронтенда, использующих капчу
Круто, а в облаке как это сделать ?
Выше есть способ через плагин
А куда делать reCaptcha? Сейчас какой-то другой способ?
PHP reCAPTCHA V3 class простий клас для роботи з капчею: https://www.site4study.com/les...