reCAPTCHA для eForm

Привет всем!
Когда вышла новая версия reCAPTCHA от Google, я решил прикрутить ее к сниппету eForm.
Сделать это оказалось намного проще, чем я думал. Thank you Google! :-)

По порядку:
1) Прежде всего нужно получить ключи для сайта (siteKey и secretKey) — здесь
2) Скачиваем готовую PHP библиотеку каптчи здесь: github (Clone or download, Download ZIP)
3) Из архива, вытаскиваем папку src, закачиваем в папку /assets/snippets и переименовываем эту папку в recaptcha
4) Создаем сниппет 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 = '<script src="https://www.google.com/recaptcha/api.js?hl='.$lang.'"></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 ($response 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;
	}
}
?>


5) В темплейты eForm прописываем плейсхолдер [+ReCaptcha+] в том месте, где хотим ее видеть (если вы используете в темплейтах вызов veriword.php, закройте его комментарием или удалите)
6) Перед вызовом eForm ставим вызов сниппета ReCaptcha ([[ReCaptcha]]), а в вызов самого eForm добавляем параметры:
&eFormOnBeforeFormMerge=`setReCaptcha` &eFormOnValidate=`verifyReCaptcha` &vericode=`1`
Только и всего.

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

avatar
Подозреваю, что если на странице несколько форм, то работать не будет?
avatar
Да, у меня по одной форме на странице. Ща поправлю)
avatar
Поправил. И, к слову, если на странице больше одной формы, то вызов сниппета ReCaptcha все равно только один на страницу нужен.
avatar
хм… с одной формой всё норм. Вызов сниппета оставил один… но все равно показывается только рекпатча у первой формы, у второй она не показывается
avatar
Спасибо.
  • 1px
  • 0
avatar
Здравствуйте!
Извините, что не разобрался, вроде все легко и понятно.
Поставил все как описано, после включения страница перестает совсем отображаться, в консоли ошибку не показывает, пишет, что невозможно отобразить страницу.
Ключи в теле сниппета прописал в функции define/
Спасибо.
Комментарий отредактирован 2016-09-13 08:51:43 пользователем tmih
  • tmih
  • 0
avatar
Еще вот попробовал в отдельной странице вызвать сниппет капчи и еФорм — теперь видно, что ругается:
Fatal error: Can't use method return value in write context in /home/.../admin/includes/document.parser.class.inc.php(1120): eval()'d code on line 23
это var $documentMethod;
Очень хочется запустить, чтоб заработала.
avatar
Добрый день!
Ключики нужно вписывать вместо siteKeyCodestring и secretKeyCodestring.
Не будет лишним знать версию php, modx и eform.
Кстати, почему /admin/includes/, а не /manager/includes/?
Комментарий отредактирован 2016-09-13 10:00:21 пользователем DrMorro
avatar
PHP Version 5.4.16
eForm 1.4.6
адрес админки поменял- так можно?
ключи — так точно и вписал.
MODX 1.1 последняя официальная версия
Вернул адрес админки, но ошибка осталась
Fatal error: Can't use method return value in write context in /home/.../manager/includes/document.parser.class.inc.php(1120): eval()'d code on line 23
Комментарий отредактирован 2016-09-13 11:04:46 пользователем tmih
avatar
В php до версии 5.5 есть проблемы с empty.
Замените в коде сниппета строчки с empty

if (!empty($resp->getErrorCodes()))
{
$codes='';
foreach ($resp->getErrorCodes() as $code) {
$codes.= $code;
}
$_SESSION['veriword'] = 'ReCaptchaErrors: '.$codes;
}

на

$response = $resp->getErrorCodes();
if (!empty($response))
{
$codes='';
foreach ($response as $code) {
$codes.= $code;
}
$_SESSION['veriword'] = 'ReCaptchaErrors: '.$codes;
}
avatar
Спасибо!!! Заработало :-)
А еще вопрос(больше не буду) — так получается, что например в любой форме(вызов в модальном окне) нажимаешь отправить при пустом ли неправильно заполненном поле имя и тп, выскакивает сообщение о том, что такое-то поле незаполнено, а капчи уже нет, это в том случае, если форма в модальном окне.
А когда форма с этой капчей на странице, то все хорошо.
avatar
Пожалуйста.
Если форма в модальном окне, то капчу нужно принудительно перезагружать. Это уже методы самой reCaptcha (reset reCAPTCHA). Читайте здесь: developers.google.com/recaptcha/docs/display#config
avatar
tmih, вы нашли как после аякса запустить рекапчу?

grecaptcha.reset(), которую предлагает DrMorro не работает, рекапча не перезагружается.
Комментарий отредактирован 2016-10-05 21:35:16 пользователем gumoviy
avatar
Сам написал и сам решил.

Может кому-то пригодится. Как показать recaptcha 2.0 После ajax перезагрузки страницы.

1. Необходимо помимо api.js еще подключить:

<script src="https://www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script>

2. В функции ajax нужно снова перезапустить рекапчу:

На примере [[ajaxSubmit]] помещаем этот код сюда:

}else{
$("#modal_ajax").html(response);
//вставляем сюда
grecaptcha.render(document.getElementById('ID_ВАШЕГО_DIV'), {
'sitekey' : 'ВАШ_КОД_SITEKEY'
});
}


Все, пользуемся.
Комментарий отредактирован 2016-10-05 23:39:17 пользователем gumoviy
avatar
Спасибо, что добавили. Только увидел сообщение. Тогда не решил — немного изменили дизайн и поставили просто на странице, поэтому не писал сюда.
Удачи!
Комментарий отредактирован 2016-10-11 14:32:29 пользователем tmih
avatar
Не выводилась каптча при добавлении скрипта через php:
$script = '<script src="https://www.google.com/recaptcha/api.js?hl='.$lang.'"></script>';
$modx->regClientStartupScript($script);

Добавил ручками в head — заработало.
avatar
Добрый день!
Не могли бы вы подсказать в чем может быть проблема, при отправке письма постоянно происходит ошибка «Неверный код подтверждения.»?
  • Navin
  • 0
avatar
Добрый!
Вы не могли бы сообщить более существенные подробности?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.