Настройка верификации клиента через SMS-код 1С-Битрикс
Форма регистрации с подтверждением по SMS снижает количество фиктивных аккаунтов и одноразовых email-адресов. Для интернет-магазина это ещё и защита программ лояльности от злоупотреблений. В 1С-Битрикс SMS-верификация не встроена в стандартный регистрационный поток — она настраивается через событийную модель и интеграцию с провайдером.
Выбор SMS-провайдера
Битрикс не имеет собственного SMS-шлюза. Интеграция строится через REST API провайдера. Популярные варианты для рынка РФ/СНГ:
- SMSC.ru — прямое API, хорошая документация
- SMS.ru — бесплатный тестовый режим
- МТС Exolve / Beeline — корпоративные тарифы
- Twilio — для международных проектов
Подключение провайдера оформляется как отдельный класс-обёртка, реализующий единый интерфейс. Это позволяет при необходимости сменить провайдера без переработки логики верификации.
Архитектура верификации
Верификация состоит из двух этапов: генерация кода и проверка. Код хранится не в сессии (уязвима к session fixation), а в отдельной таблице БД:
CREATE TABLE custom_sms_verification (
id INT AUTO_INCREMENT PRIMARY KEY,
phone VARCHAR(20) NOT NULL,
code VARCHAR(6) NOT NULL,
created_at DATETIME NOT NULL,
attempts INT DEFAULT 0,
verified TINYINT DEFAULT 0,
INDEX idx_phone (phone),
INDEX idx_created (created_at)
);
В Битрикс D7 — через \Bitrix\Main\ORM\Data\DataManager:
class SmsVerificationTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string
{
return 'custom_sms_verification';
}
public static function getMap(): array
{
return [
new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new \Bitrix\Main\ORM\Fields\StringField('PHONE'),
new \Bitrix\Main\ORM\Fields\StringField('CODE'),
new \Bitrix\Main\ORM\Fields\DatetimeField('CREATED_AT'),
new \Bitrix\Main\ORM\Fields\IntegerField('ATTEMPTS'),
new \Bitrix\Main\ORM\Fields\BooleanField('VERIFIED'),
];
}
}
Логика отправки и проверки
Отправка кода:
function sendVerificationCode(string $phone): bool {
$code = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT);
// Проверка лимита — не чаще 1 раза в 60 секунд
$recent = SmsVerificationTable::getList([
'filter' => [
'=PHONE' => $phone,
'>CREATED_AT' => new \Bitrix\Main\Type\DateTime(date('Y-m-d H:i:s', time() - 60))
]
])->fetch();
if ($recent) return false; // Too many requests
SmsVerificationTable::add([
'PHONE' => $phone,
'CODE' => $code,
'CREATED_AT' => new \Bitrix\Main\Type\DateTime(),
'ATTEMPTS' => 0,
'VERIFIED' => false,
]);
return SmsProvider::send($phone, "Ваш код подтверждения: $code");
}
Проверка кода включает защиту от брутфорса: после 3 неверных попыток код блокируется независимо от истечения времени. Срок жизни кода — 5–10 минут.
Интеграция с регистрацией и оформлением заказа
Верификация встраивается в два места:
-
Регистрация — через обработчик события
OnBeforeUserRegister. Если номер телефона не верифицирован — регистрация блокируется до прохождения SMS-проверки. -
Оформление заказа — через компонент
bitrix:sale.order.ajax. Шаг с верификацией добавляется перед финальным подтверждением заказа. Особенно важно для магазинов, принимающих заказы без регистрации.
Для AJAX-формы верификации используется контроллер:
class SmsVerifyController extends \Bitrix\Main\Engine\Controller {
public function sendAction(): array { ... }
public function checkAction(string $phone, string $code): array { ... }
}
Антифрод и ограничения
Обязательные меры защиты:
- Не более 3 кодов в час на один номер
- Не более 5 кодов в сутки на один IP
- CAPTCHA перед запросом кода при подозрительной активности
- Нормализация номера перед сохранением (привести к формату +7XXXXXXXXXX)
Сроки выполнения
| Объём работ | Срок |
|---|---|
| Отправка + проверка кода, базовый flow | 1–2 дня |
| Интеграция с регистрацией + оформлением заказа | 2–3 дня |
| Антифрод, лимиты, нормализация номеров | +1 день |
SMS-верификация — инвестиция в качество базы клиентов. Один чистый аккаунт ценнее десяти фиктивных.







