Документация

Форма без капчи Битрикса

Статическая форма в шаблоне или свой компонент, которые капчу Битрикса не выводят, автоматической защиты не получают. Такую форму подключают руками — одним блоком в разметке и одной проверкой в обработчике.

Разметка формы

Там, где должна появиться проверка, выведите пустой блок с классом smartcaptcha:

html · form.php
<div class="smartcaptcha"></div>

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

Если у формы должны быть свои настройки виджета, их передают атрибутом data-params с объектом настроек. Без атрибута берутся настройки сайта — этого достаточно почти всегда.

Обработка отправки

В обработчике формы, до сохранения данных, спросите модуль о результате проверки:

php · handler.php
<?php
use DevBx\SmartCaptcha\Api;

if (\Bitrix\Main\Loader::includeModule('devbx.smartcaptcha')) {
    if (!Api::checkCaptcha()) {
        $error = Api::getLastError();
        // показать $error и не сохранять данные
        return;
    }
}

// сюда доходят только проверенные отправки

Api::checkCaptcha() сам берёт ответ из поля smart-token, подтверждает его у Яндекса и запоминает результат на время запроса — вызывать его в нескольких местах обработчика безопасно. Api::getLastError() возвращает текст для посетителя, getLastError(true) — тот же текст, подготовленный для вывода в разметку.

Чего делать не нужно

  • Проверять путь страницы. Правила показа к проверке отношения не имеют, и повторять их в своём коде значит ослабить защиту.
  • Отправлять ответ на проверку дважды. Ответ одноразовый: повторный запрос к Яндексу с тем же токеном вернёт отказ, и форма перестанет отправляться.
  • Хранить ключ сервера в шаблоне. Модуль берёт его из настроек сайта сам; в разметку попадает только ключ клиента.