Подключаем Recaptcha 2 к Bitrix

Возврат к списку

nocaptcha.gif

Это уже вторая статья о том,как подключить reCaptcha к CMS Bitrix. Но время идет, уже вышла новая версия reCaptcha, с новыми алгоритмами и непробиваемостью от спам ботов.

Итак, поехали, первым делом, мы добавляем сайт в личном кабинете https://www.google.com/recaptcha/admin#list , на котором у нас будет стоять защита. После регистрации система выдаст 2 ключа, ключ генерации каптчи и секретный ключ, для проверки "верно введен код или нет". После скачиваем PHP библиотеку на гитхабе. В библиотеке, из папки src копируем файлы autoload.php и папку ReCaptcha в папку php_interface предварительно создав папку include (для удобства). В файле init.php инклудим библиотеку и в нем же задаем константы: RE_SITE_KEY и RE_SEC_KEY полученные при регистрации проекта в системе.

В шаблоне сайта или компонента подключаем JS библиотеку:

Библиотека подключена, константы определены, можем использовать recaptcha в своих компонентах. Все подключается  в 2 шага: Шаг 1 - в шаблоне компоненты, добавляем следующую конструкцию, где хотим вывести защитный код:

Шаг 2 - в компоненте добавляем проверку:

В 2 шага подключается проверка которая защитит ваш компонент от спам ботов.



29.03.2016 в 19:10
0
Все сделал как написано, при добавлении в компонент проверки
Вылазиет вот это. Хелп!

Ошибка! Проверка не пройдена.missing-input-response
ответная реплика
ZircoolZircool29.03.2016 в 23:46
0
Значит не прилетел ввод каптчи, параметр $_REQUEST['g-recaptcha-response']
Можно в коде компонента, через print_r вывести $_REQUEST и посмотреть какие данные на входе. Или можешь выложить пример компоненты или часть кода — вместе разберемся.
ответная реплика
30.03.2016 в 10:09
0
как от стоп фильтра избавиться то?
ответная реплика
30.03.2016 в 10:10
0
вот что написал: массив скобка регистер да 1
ответная реплика
ZircoolZircool30.03.2016 в 10:15
0
Я увидел комментарий.У тебя не прилетает g-recaptcha-response,посмотри HTML странички где стоит рекаптча,есть ли input с именем g-recaptcha-response
ответная реплика
30.03.2016 в 11:19
0
я удалил вообще включение стандартной битриксовской капчи кроме условия ее включения // CAPTCHA?> "> <div class="line buttons clearfix"> <input name="Register" class="btn btn1" type="submit" value="<?=GetMessage('AUTH_REGISTER')?>" /> // /CAPTCHA
ответная реплика
Развернуть
30.03.2016 в 11:20 Развернуть
30.03.2016 в 11:21 Развернуть
30.03.2016 в 11:21 Развернуть
30.03.2016 в 11:21 Развернуть
adminadmin01.04.2016 в 16:03
0
Скинь пример компонента,где используешь,так быстрее найдем баг
ответная реплика
МаксимМаксим27.04.2016 в 09:12
0
Шаг 2 — надо прописать в шаблон компонента или в сам компонент? То есть в моем случае bitrix/templates/info_light_blue/components/bitrix/system.auth.registration/.default/template.php или bitrix/components/bitrix/system.auth.registration/component.php?
ответная реплика
МаксимМаксим27.04.2016 в 09:26
0
Добавил вышеозначеннный код (шаг 2) в component.php.
На странице регистрации появилась ошибка Ошибка! Проверка не пройдена.missing-input-response
Сама форма регистрации не выводится
ответная реплика
МаксимМаксим27.04.2016 в 09:29
0
Вот полностью component.php со вставленным кодом из вашего примера:

GetCurPageParam("register=yes", $arParamsToDelete);
}

$arResult["BACKURL"] = $APPLICATION->GetCurPageParam("", $arParamsToDelete);

$arResult["AUTH_AUTH_URL"] = $APPLICATION->GetCurPageParam("login=yes", $arParamsToDelete);

foreach ($arResult as $key => $value)
{
if (!is_array($value)) $arResult[$key] = htmlspecialcharsbx($value);
}

$arRequestParams = array(
"USER_NAME",
"USER_LAST_NAME",
"USER_LOGIN",
"USER_PASSWORD",
"USER_CONFIRM_PASSWORD",
);

foreach ($arRequestParams as $param)
{
$arResult[$param] = strlen($_REQUEST[$param]) > 0 ? $_REQUEST[$param] : "";
$arResult[$param] = htmlspecialcharsbx($arResult[$param]);
}
// ********************* User properties ***************************************************
$arResult["USER_PROPERTIES"] = array("SHOW" => "N");
$arUserFields = $USER_FIELD_MANAGER->GetUserFields("USER", 0, LANGUAGE_ID);
if (is_array($arUserFields) && count($arUserFields) > 0)
{
foreach ($arUserFields as $FIELD_NAME => $arUserField)
{
if ($arUserField["MANDATORY"] != "Y")
continue;
$arUserField["EDIT_FORM_LABEL"] = strLen($arUserField["EDIT_FORM_LABEL"]) > 0 ? $arUserField["EDIT_FORM_LABEL"] : $arUserField["FIELD_NAME"];
$arUserField["EDIT_FORM_LABEL"] = htmlspecialcharsEx($arUserField["EDIT_FORM_LABEL"]);
$arUserField["~EDIT_FORM_LABEL"] = $arUserField["EDIT_FORM_LABEL"];
$arResult["USER_PROPERTIES"]["DATA"][$FIELD_NAME] = $arUserField;
}
}
if (!empty($arResult["USER_PROPERTIES"]["DATA"]))
$arResult["USER_PROPERTIES"]["SHOW"] = "Y";
$arResult["bVarsFromForm"] = (is_array($arParams['AUTH_RESULT']) || strlen($arParams["AUTH_RESULT"]) 0 ? $_REQUEST["sf_EMAIL"] : $_REQUEST["USER_EMAIL"]);

$arResult["USE_CAPTCHA"] = COption::GetOptionString("main", "captcha_registration", "N") == "Y" ? "Y" : "N";

if ($arResult["USE_CAPTCHA"])
{
//$arResult["CAPTCHA_CODE"] = htmlspecialcharsbx($APPLICATION->CaptchaGetCode());
$recaptcha = new \ReCaptcha\ReCaptcha(RE_SEC_KEY);
$resp = $recaptcha->verify($_REQUEST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);

if (!$resp->isSuccess()){
foreach ($resp->getErrorCodes() as $code) {
echo "Ошибка! Проверка не пройдена.";
echo $code;
return;
}
}
}

$arResult["USE_EMAIL_CONFIRMATION"] = COption::GetOptionString("main", "new_user_registration_email_confirmation", "N") == "Y" ? "Y" : "N";

$arResult["SECURE_AUTH"] = false;
if(!CMain::IshttpS() && COption::GetOptionString('main', 'use_encrypted_auth', 'N') == 'Y')
{
$sec = new CRsaSecurity();
if(($arKeys = $sec->LoadKeys()))
{
$sec->SetKeys($arKeys);
$sec->AddToForm('bform', array('USER_PASSWORD', 'USER_CONFIRM_PASSWORD'));
$arResult["SECURE_AUTH"] = true;
}
}

$this->IncludeComponentTemplate();
ответная реплика
ZircoolZircool27.04.2016 в 13:42
0
Из кода все вставлено верно.

RE_SITE_KEY и RE_SEC_KEY определили свои?
ответная реплика
МаксимМаксим27.04.2016 в 14:13
0
Да, определил, в файле init.php, как и написано в инструкции
ответная реплика
ZircoolZircool27.04.2016 в 14:27
0
Отправь компонент с шаблоном на zircool@inbox.ru

Посмотрю,отпишусь.
ответная реплика
bolegasbolegas09.01.2017 в 13:14
0
Привет. Столкнулся с такой же проблемой в system.auth.registration. Как-то решили эту проблему?
ответная реплика
adminadmin09.01.2017 в 13:54 Развернуть
05.12.2016 в 13:01
0
Все прекрасно, только зачем лезть в компонент, когда это можно сделать через событие OnBeforeUserRegister
ответная реплика
MrEnzoMrEnzo23.01.2017 в 14:56
0
Спасибо, все получилось!
ответная реплика
инкогнитоинкогнито24.01.2017 в 21:15
+1
Если заменяете стандартную капчу битрухи, то замените echo...return; из шага 2 на $arResult["ERROR_MESSAGE"][] = "Ошибка! Проверка не пройдена."; Это избавит от Ошибка! Проверка не пройдена.missing-input-response
ответная реплика
инкогнитоинкогнито24.01.2017 в 21:18
+1
это по сути заменит стандартное сообщение, что капча не правильная, вместо досрочного выхода из метода и ломания страницы.
ответная реплика


Возврат к списку