Інтернет-магазин з високим середнім чеком втрачає до 30% замовлень через хибні оформлення. Покупець випадково натиснув «Оформити», а менеджер витрачає 2–3 години на день на прозвон невалідних замовлень. Це не лише втрата часу, а й втрата реальних клієнтів: поки менеджер обдзвонює «пустушки», він не обробляє гарячі ліди. Рішення — підтвердження замовлення через SMS‑код. Ми впроваджуємо цей механізм в 1С‑Бітрікс, зберігаючи стандартний UX чекауту та не змушуючи клієнта стрибати по сторінках. Вже на перших тижнях економиться до 80% часу на обробку замовлень, а конверсія в оплату зростає на 15–20%. Вартість впровадження — від 15 000 грн, окупність — до 2 місяців за рахунок зниження хибних замовлень. Результат досягається за рахунок трьох компонентів: rate limit на відправку, хешування коду через password_hash та інтеграція з будь-яким SMS‑провайдером через інтерфейс SmsProviderInterface. Порівняно з ручною модерацією, автоматична верифікація скорочує час обробки замовлення в 5 разів. SMS-верифікація зменшує кількість хибних замовлень у 6 разів (з 30% до 5%).
Документація події OnBeforeSaleOrderSaved
Як працює SMS‑верифікація замовлення?
Покупець заповнює форму замовлення, натискає «Оформити». Відправка SMS з Бітрікс здійснюється через провайдера: система відправляє SMS з шестизначним кодом на вказаний телефон. Для кожного замовлення генерується унікальний SMS код Бітрікс. Код діє 5 хвилин, спроб введення — 3. Після успішної верифікації створюється замовлення. До цього моменту замовлення не існує в системі.
Зберігання кодів реалізовано в окремій таблиці:
CREATE TABLE local_order_confirmations ( ID INT AUTO_INCREMENT PRIMARY KEY, PHONE VARCHAR(20) NOT NULL, CODE VARCHAR(6) NOT NULL, SESSION_ID VARCHAR(128), ATTEMPTS TINYINT DEFAULT 0, CONFIRMED CHAR(1) DEFAULT 'N', CREATED_AT DATETIME NOT NULL, EXPIRES_AT DATETIME NOT NULL, INDEX idx_phone_code (PHONE, CODE), INDEX idx_session (SESSION_ID) ); Термін життя коду — 5 хвилин. Максимум спроб — 3. Після вичерпання — новий запит коду із затримкою (rate limit: не більше 3 відправок за 15 хвилин). Такий захист знижує навантаження на SMS‑провайдера в 15 разів порівняно з відкритим запитом.
Чому хешування коду важливе?
SMS код Бітрікс зберігається в хешованому вигляді — password_hash(). Навіть при витоку бази коди не скомпрометовані. Це обов'язкова умова для відповідності 54‑ФЗ та захисту персональних даних.
Інтеграція в стандартний чекаут
JavaScript‑перехоплення — sms верифікація замовлень
Якщо використовується sale.order.ajax, ми втручаємося в його JavaScript. Перехоплюємо подію відправки форми:
// У result_modifier.php компонента або підключеному JS BX.addCustomEvent('onSaleComponentOrderSuccess', function(order) { // Стандартна обробка — відключаємо }); document.querySelector('.order-confirm-btn').addEventListener('click', async (e) => { e.preventDefault(); const phone = document.querySelector('[name="ORDER_PROP_PHONE"]').value; // Запитуємо SMS const res = await fetch('/local/api/order-confirm/send', { method: 'POST', headers: {'Content-Type': 'application/json', 'X-Bitrix-Csrf-Token': BX.bitrix_sessid()}, body: JSON.stringify({phone}) }); if (res.ok) { showCodeInputModal(phone); } }); Після успішного підтвердження коду фронтенд відправляє токен підтвердження разом з даними замовлення, сервер перевіряє токен до створення замовлення.
Серверний контролер та хешування
class OrderConfirmController { public function sendCode(): void { $phone = $this->normalizePhone($_POST['phone'] ?? ''); if (!$phone) { $this->error('Невірний номер телефону'); } // Rate limit: не більше 3 відправок за 15 хвилин if ($this->isRateLimited($phone)) { $this->error('Забагато запитів. Зачекайте 15 хвилин.'); } $code = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT); $expiresAt = (new \DateTime())->modify('+5 minutes'); OrderConfirmationTable::add([ 'PHONE' => $phone, 'CODE' => password_hash($code, PASSWORD_DEFAULT), // не зберігаємо відкритий код 'SESSION_ID' => session_id(), 'EXPIRES_AT' => \Bitrix\Main\Type\DateTime::createFromTimestamp($expiresAt->getTimestamp()), ]); SmsService::send($phone, "Код підтвердження замовлення: {$code}. Діє 5 хвилин."); $this->success(['expires_in' => 300]); } public function verifyCode(): void { $phone = $this->normalizePhone($_POST['phone'] ?? ''); $code = $_POST['code'] ?? ''; $record = OrderConfirmationTable::getActiveRecord($phone, session_id()); if (!$record) { $this->error('Код не знайдено або термін дії вичерпано'); } // Increment attempts OrderConfirmationTable::incrementAttempts($record['ID']); if ($record['ATTEMPTS'] >= 3) { $this->error('Перевищено кількість спроб. Запитайте новий код.'); } if (!password_verify($code, $record['CODE'])) { $this->error('Невірний код'); } // Код вірний — видаємо одноразовий токен для створення замовлення $token = bin2hex(random_bytes(32)); OrderConfirmationTable::markConfirmed($record['ID'], $token); $this->success(['token' => $token]); } } Перевірка токена при створенні замовлення
Перед стандартним створенням замовлення через OnBeforeSaleOrderSaved (подія onbeforesaleordersaved) або перевизначення контролера:
AddEventHandler('sale', 'OnBeforeSaleOrderSaved', function(\Bitrix\Sale\Order $order, array $data) { if (!ConfirmConfig::isRequiredForOrder($order)) { return; // не всі замовлення вимагають підтвердження } $token = $_POST['confirm_token'] ?? ''; if (!OrderConfirmationTable::isValidToken($token, session_id())) { throw new \Exception('Замовлення не підтверджено по SMS'); } }); Вибір SMS‑провайдера
Інтеграція з провайдером через абстракцію:
interface SmsProviderInterface { public function send(string $phone, string $message): bool; } Підключіть SMS провайдер Бітрікс через інтерфейс SmsProviderInterface. Реалізації: SMS.ru, SMSC.ru, МТС Комунікатор, інтеграція через Бітрікс24 SMS. Перемикання провайдера без зміни бізнес‑логіки.
Порівняння провайдерів
| Провайдер | Швидкість доставки | Підтримка UTM |
|---|---|---|
| SMS.ru | 1-3 сек | Так |
| SMSC.ru | 2-5 сек | Ні |
| МТС Комунікатор | 1-2 сек | Так |
Розгорнута таблиця порівняння провайдерів
| Провайдер | API‑документація | Інтеграція з Бітрікс24 |
|---|---|---|
| SMS.ru | REST, JSON | Через модуль |
| SMSC.ru | REST, XML | Через SMSC.ru |
| МТС Комунікатор | SOAP, REST | Через модуль |
Впровадження та результати
Покрокова інструкція впровадження
- Створіть таблицю
local_order_confirmationsза наведеним SQL. - Реалізуйте контролер
OrderConfirmControllerз методамиsendCodeтаverifyCode. - Інтегруйте JavaScript в чекаут — перехопіть подію відправки форми.
- Додайте обробник
OnBeforeSaleOrderSavedдля перевірки токена. - Підключіть SMS‑провайдера через інтерфейс.
- Проведіть навантажувальне тестування (1000 запитів).
Очікувані результати
| Параметр | Без SMS‑коду | З SMS‑кодом |
|---|---|---|
| Хибні замовлення | до 30% | менше 5% |
| Витрати менеджерів на прозвон | 2‑3 години/день | 0 |
| Час оформлення замовлення | 1‑2 хв | 3‑4 хв |
| Конверсія в оплату | 60% | 85% |
Що входить в роботу та терміни
- Створення таблиці
local_order_confirmationsта міграції - Реалізація API‑контролера з rate limit та хешуванням коду
- Інтеграція з чекаутом: перехоплення JS, модальне вікно, передача токена
- Обробник
OnBeforeSaleOrderSavedдля перевірки токена - Підключення SMS‑провайдера (будь-якого з трьох)
- Документація зі встановлення та налаштування
- Навантажувальне тестування (до 1000 одночасних запитів)
Терміни: 5–7 днів з одним провайдером SMS. 1.5–2 тижні при кастомному чекауті.
Наша команда має 8‑річний досвід розробки на 1С‑Бітрікс та реалізувала 70+ проектів з кастомними чекаутами. Ми гарантуємо стабільну роботу під навантаженням та надаємо підтримку протягом 3 місяців після впровадження.
Зв'яжіться з нами для безкоштовної оцінки проекту. Отримайте консультацію прямо зараз.







