reCAPTCHA(v2) для Modx Evolution
Здраствуйте, меня зовут Вячеслав, я программист проекта WebArtIs.Ru и я расскажу вам как подключить reCAPTCHA (v2) от Google к сниппету eForm на Modx Evo.
При разработке сайтов часто возникает необходимость защитить формы обратной связи от спамботов которые, обычно, сводятся к неудобному полю ввода цифр и букв.
Google создал прекрасное решение этой проблемы - reCAPTCHA и для Modx Revo существуют готовые решения по ее установке, а вот для Modx Evo, к сожалению нет.
Сейчас мы это исправим.
По порядку:
- Прежде всего нужно получить ключи для сайта (siteKey и secretKey) - здесь
- Скачиваем готовую PHP библиотеку каптчи здесь: github (Clone or download, Download ZIP)
- Из архива, вытаскиваем папку src, закачиваем в папку /assets/snippets и переименовываем эту папку в recaptcha
- Создаем сниппет ReCaptcha и вставляем в него код указанный в конце статьи
- В темплейты 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 = '<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 ($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;
}
}
?>
Только и всего!