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) на одной странице.