Налаштування верифікації клієнта через SMS-код у 1С-Bitrix
Форма реєстрації з підтвердженням по SMS зменшує кількість вигаданих облікових записів і одноразових email-адрес. Для інтернет-магазину це також захист програм лояльності від зловживань. У 1С-Bitrix SMS-верифікація не вбудована в стандартний потік реєстрації — вона налаштовується через модель подій і інтеграцію з постачальником SMS.
Вибір постачальника SMS
Bitrix не має власного 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)
);
У Bitrix 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)
Сроки виконання
| Обсяг робіт | Строк |
|---|---|
| Надсилання + перевірка коду, базовий потік | 1–2 дні |
| Інтеграція з реєстрацією + оформленням замовлення | 2–3 дні |
| Антифрод, обмеження, нормалізація номерів | +1 день |
SMS-верифікація — це інвестиція в якість бази клієнтів. Один чистий обліковий запис коштує більше, ніж десять вигаданих.







