Статьи и новости

Статьи и новости о веб-разработке

reCAPTCHA(v2) для Modx Evolution (продолжение)

reCAPTCHA(v2) для Modx Evolution (продолжение)

Уже больше года миновало со времени написания первой статьи о reCAPTCHA(v2) для Modx Evolution.

Мне казалось, что я очень подробно освятил процесс установки, но многочисленные вопросы на которые приходилось отвечать сначала бесплатно, а потом и за деньги (потому, что одними вопросами дело не ограничивалось) убедили меня в обратном.

Поэтому в данной статье, я постараюсь ответить на самые распространенные вопросы по установке и настройке recaptcha от google.

Начну с исправления ошибки в коде, (на которую, к слову, никто не указал), а именно сообщение об ошибке:


  $text = isset($text) ? $text : 'Вы не подтвердили, что вы не робот!';
 

Конечно, в виде переменной в изолированной функции она видна не будет. Разумеется, это должно выглядеть так:


if(!defined('errorText')) {define('errorText', 'Подтвердите, что вы не робот!');}

И так будет выглядеть вызов функции verifyReCaptcha:


      if (!function_exists('verifyReCaptcha')) {
          function verifyReCaptcha(&$fields,&$vMsg,&$rMsg,&$rClass){
              
               if($_SESSION['veriword'] !== $_SESSION['eForm.VeriCode']){
		  $VeriCodeErrorText = array_pop($vMsg);
                  $vMsg[] = errorText;
		  $rClass['captcha']='has-error';
               }
              return true;
          }
      }

Помимо этого, оказалось, что у многих пользователей на сервере отключена возможность POST запросов (allow_url_fopen Off) и они не потрудились посмотреть, что PHP библиотека от Google поддерживает не только их, но и Curl и даже Sockets.

Вот обновленный код вызова reCAPTCHA(v2) для eForm Modx Evolution:

  
      <?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');}
      if(!defined('errorText')) {define('errorText', 'Вы не подтвердили, что вы не робот!');}
      
      $lang = isset($lang) ? $lang : 'ru';
      
      unset($_SESSION['veriword']);
      
      $script = '<script src="https://www.google.com/recaptcha/api.js?hl='.$lang.'"></script>';
      $modx->regClientStartupScript($script);
      
        $Recaptcha = new \ReCaptcha\ReCaptcha(secretKey,RequestMethod\Post()); //это Post запрос
	//$Recaptcha = new \ReCaptcha\ReCaptcha(secretKey, new \ReCaptcha\RequestMethod\CurlPost()); // это Curl запрос если отключен Post
	//$Recaptcha = new \ReCaptcha\ReCaptcha(secretKey, new \ReCaptcha\RequestMethod\SocketPost()); // это Socket запрос если отключен и Post и Curl 
        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']){
		  $VeriCodeErrorText = array_pop($vMsg); //а это здесь для чего?!
                  $vMsg[] = errorText;
		  $rClass['captcha']='has-error';
               }
              return true;
          }
      }
 

Сама форма как и прежде вызывается с этими параметрами  и я продолжу настаивать, что этот вызов является самым правильным:

&eFormOnBeforeFormMerge=`setReCaptcha` &eFormOnValidate=`verifyReCaptcha` &vericode=`1`

В следующей статье я отвечу на второй самый популярный вопрос: как подключить несколько форм с reCAPTCHA(v2) на одной странице.