MODx Evo и ReCaptcha v2

При разботке сайтов часто возникает необходимость защитить формы обратной связи от спамботов которые, обычно, сводятся к неудобному полю ввода цифр и букв. Google создал прекрасное решение этой проблемы - reCAPTCHA и для Modx Revo существуют готовые решения по ее установке, а вот для Modx Evo, к сожалению нет. Сейчас мы это исправим.

По порядку:

  1. Прежде всего нужно получить ключи для сайта (siteKey и secretKey) - здесь
  2. Скачиваем готовую PHP библиотеку каптчи здесь (GitHub – Clone or download, Download ZIP)
  3. Из архива, вытаскиваем папку src, закачиваем в папку /assets/snippets и переименовываем эту папку в recaptcha
  4. Создаем сниппет ReCaptcha и вставляем в него код указанный в конце статьи
  5. В темплейты eForm прописываем плейсхолдер [+ReCaptcha+] в том месте, где хотим ее (reCAPTCHA) видеть
    (если вы используете в темплейтах вызов veriword.php, закройте его комментарием или удалите)
Перед вызовом eForm ставим вызов сниппета ReCaptcha, а в вызов самого eForm добавляем параметры:
&eFormOnBeforeFormMerge=`setReCaptcha` &eFormOnValidate=`verifyReCaptcha` &vericode=`1`

Код сниппета ReCaptcha:

<?php
      if(!defined('MODX_BASE_PATH')) {die('What are you doing? Get out of here!');}
      include_once MODX_BASE_PATH.'assets/snippets/recaptcha/autoload.php';
      
      if(!defined('siteKey')) {define('siteKey', 'siteKeyCodestring');}
      if(!defined('secretKey')) {define('secretKey', 'secretKeyCodestring');}
      
      $lang = isset($lang) ? $lang : 'ru';
      $text = isset($text) ? $text : 'Вы не подтвердили, что вы не робот!';
      
      unset($_SESSION['veriword']);
      
      $script = '';
      $modx->regClientStartupScript($script);
      
      $Recaptcha = new \ReCaptcha\ReCaptcha(secretKey);
        if(isset($_REQUEST['g-recaptcha-response'])){
            $resp = $Recaptcha->verify($_REQUEST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);
            if ($resp->isSuccess()){
                $_SESSION['veriword'] = $_SESSION['eForm.VeriCode'];
                $_POST['vericode'] = $_SESSION['eForm.VeriCode'];
            } else {
                $response = $resp->getErrorCodes();        
                if (!empty($response))
                {
                    $codes='';
                    foreach ($resp->getErrorCodes() as $code) {
                        $codes.= $code;
                    }
                    $_SESSION['veriword'] = 'ReCaptchaErrors : '.$codes; 
                }
            }
        }
          
      if (!function_exists('setReCaptcha')) {
          function setReCaptcha(&$fields){
              
              $fields['ReCaptcha']= '<div class="g-recaptcha" data-sitekey="'.siteKey.'"></div>';
              return true;
              
          }
      }
      
      if (!function_exists('verifyReCaptcha')) {
          function verifyReCaptcha(&$fields,&$vMsg,&$rMsg,&$rClass){
              
               if($_SESSION['veriword'] !== $_SESSION['eForm.VeriCode']){
                  $vMsg[] = $text; 
               }
              return true;
          }
      }
?>

Оригинал статьи. Спасибо Вячеславу, программисту проекта WebArtIs

Комментарии

Популярные сообщения из этого блога

Анимация курсора в Атоме

Подключение тяжелых библиотек

Fontello