Налаштування верифікації телефону при замовленні 1С‑Бітрікс

Налаштування верифікації телефону при замовленні 1С‑Бітрікс Кожне десяте замовлення в інтернет-магазині на Бітрікс містить фейковий номер телефону. Шахраї використовують одноразові віртуальні номери, щоб оформити замовлення з підставними даними — це призводить до збитків на логістиці та поверненн
Послуги, які ми пропонуємо
Показано 1 з 1Усі 1626 послуг
Налаштування верифікації телефону при замовленні 1С‑Бітрікс
Простий
~1 день

Наші компетенції:

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1460
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    1019
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    763
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    882
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    809
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1164

Налаштування верифікації телефону при замовленні 1С‑Бітрікс

Кожне десяте замовлення в інтернет-магазині на Бітрікс містить фейковий номер телефону. Шахраї використовують одноразові віртуальні номери, щоб оформити замовлення з підставними даними — це призводить до збитків на логістиці та поверненнях. В одному інтернет-магазині шахрайські замовлення становили 12% від загального обсягу, що призводило до збитків понад $2.7k–3.9kів на місяць на необґрунтованих доставках. Наше рішення знижує кількість шахрайських замовлень у 10 разів порівняно з базовим налаштуванням магазину. OTP-верифікація телефону на етапі оформлення замовлення вирішує цю проблему: покупець повинен підтвердити номер, ввівши код із SMS. Без підтвердження замовлення не проходить. Ми впроваджуємо такий захист під ключ, адаптуючи під будь-яку логіку замовлення. Замовте впровадження – і забудьте про фейкові замовлення.

OTP-верифікація допомагає відсікти не тільки шахраїв, а й випадкові помилки при введенні номера. Якщо клієнт помилився цифрою, він одразу помітить, що SMS не прийшла, і зможе виправити номер до оформлення замовлення. Це знижує кількість «втрачених» замовлень через некоректні контакти.

Як налаштувати верифікацію телефону при замовленні?

Верифікація через SMS блокує до 95% замовлень з віртуальними номерами. При цьому для реальних покупців процес займає не більше 20 секунд. Ключове — не допустити перебору кодів та спаму. У нашій реалізації:

  • Ліміт на відправку: не більше 3 SMS на один номер за 10 хвилин (лічильник у Bitrix\Main\Application::getInstance()->getManagedCache()).
  • Хешування коду: password_hash з PASSWORD_DEFAULT — навіть при витоку сесії код не відновити.
  • Автоматичне видалення даних після успішного замовлення або закінчення таймера (5 хвилин).
  • Для додаткового захисту реалізовано анти-брутфорс: блокування IP після 5 невдалих спроб за 15 хвилин (кешування в Memcached).

Ці заходи роблять перебір кодів практично неможливим: при трьох спробах кожні 10 хвилин ймовірність вгадати 6-значний код (1 000 000 комбінацій) становить 0.0003%. Наша кастомна реалізація в 5 разів надійніша за готові модулі за швидкістю реакції на підозрілу активність. Додатковий ефект — зниження операційних витрат на поверненнях до $1.8k–2.6kів на місяць.

Чому кастомна розробка вигідніша за готовий модуль?

Готові модулі OTP з Маркетплейсу часто мають надлишковий функціонал і не завжди враховують специфіку вашого магазину — наприклад, інтеграцію з 1С або роботу зі знижками. Кастомна розробка дає повний контроль над кодом і легку інтеграцію з існуючими подіями та бізнес-процесами. Ви отримуєте рівно те, що потрібно, без зайвих залежностей. Економія часу на доопрацюваннях порівняно з типовим модулем становить до 40%.

Параметр Без верифікації З OTP-верифікацією (наше рішення)
Частка шахрайських замовлень до 12% 0.5–1%
Час на перевірку номера 0 20 секунд
Ризик витоку коду Низький (хешування, ліміти)
Вартість впровадження (терміни) 2–6 днів
Залежність від зовнішніх сервісів SMS-провайдер (будь-який)

Технічна реалізація OTP-верифікації

Схема роботи OTP (покроково)

  1. Користувач заповнює номер телефону у формі замовлення.
  2. За подією blur відправляється AJAX-запит на /local/ajax/phone-otp-send.php.
  3. Сервер перевіряє CSRF-токен, формат номера та ліміт спроб.
  4. Генерується 6-значний код, хешується та зберігається в сесії (або Redis).
  5. SMS відправляється через \Bitrix\MessageService\Sender\MessageManager.
  6. Клієнт вводить код — AJAX-запит на /local/ajax/phone-otp-verify.php.
  7. Якщо код вірний і не закінчився, у сесії виставляється прапорець verified.
  8. При оформленні замовлення подія перевіряє прапорець і блокує замовлення без нього.

Код: відправка, перевірка та блокування замовлення

// /local/ajax/phone-otp-send.php \Bitrix\Main\Application::getInstance()->initializeExtended(); $phone = preg_replace('/\D/', '', $_POST['phone'] ?? ''); $csrfOk = check_bitrix_sessid(); if (!$csrfOk || strlen($phone) < 10 || strlen($phone) > 15) { http_response_code(400); echo json_encode(['error' => 'Invalid request']); exit; } // Лимит: не более 3 отправок на номер за 10 минут $cacheKey = 'otp_attempts_' . md5($phone); $attempts = (int)(\Bitrix\Main\Application::getInstance() ->getManagedCache()->get($cacheKey) ?? 0); if ($attempts >= 3) { echo json_encode(['error' => 'Слишком много попыток. Подождите 10 минут.']); exit; } // Генерируем 6-значный код $code = (string)random_int(100000, 999999); $expiresAt = time() + 300; // 5 минут // Сохраняем в сессии (или в Redis) \Bitrix\Main\Application::getInstance()->getSession()->set('otp_data', [ 'phone' => $phone, 'code' => password_hash($code, PASSWORD_DEFAULT), 'expires_at' => $expiresAt, 'verified' => false, ]); // Инкрементируем счётчик попыток \Bitrix\Main\Application::getInstance()->getManagedCache()->set($cacheKey, $attempts + 1, 600); // Отправляем SMS через модуль Битрикс (SMS-провайдер настраивается в административной части) $smsManager = new \Bitrix\MessageService\Sender\MessageManager('sms'); $result = $smsManager->enqueueMessage([ 'MESSAGE_TO' => '+' . $phone, 'MESSAGE_BODY' => "Ваш код подтверждения: {$code}. Действует 5 минут.", ]); echo json_encode([ 'success' => $result->isSuccess(), 'expires_at' => $expiresAt, 'masked_phone' => '+' . substr($phone, 0, 3) . '***' . substr($phone, -2), ]); 
// /local/ajax/phone-otp-verify.php \Bitrix\Main\Application::getInstance()->initializeExtended(); $inputCode = trim($_POST['code'] ?? ''); $session = \Bitrix\Main\Application::getInstance()->getSession(); $otpData = $session->get('otp_data'); if (!$otpData || time() > $otpData['expires_at']) { echo json_encode(['success' => false, 'error' => 'Код истёк. Запросите новый.']); exit; } if (!password_verify($inputCode, $otpData['code'])) { echo json_encode(['success' => false, 'error' => 'Неверный код.']); exit; } // Помечаем телефон как подтверждённый $otpData['verified'] = true; $session->set('otp_data', $otpData); echo json_encode(['success' => true]); 
AddEventHandler('sale', 'OnBeforeOrderFinalAction', function(\Bitrix\Sale\Order $order) { if ($order->getId() > 0) return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS); $otpData = \Bitrix\Main\Application::getInstance()->getSession()->get('otp_data'); $props = $order->getPropertyCollection(); $phone = preg_replace('/\D/', '', $props->getItemByOrderPropertyCode('PHONE')?->getValue() ?? ''); if (empty($otpData['verified']) || !$otpData['verified'] || $otpData['phone'] !== $phone) { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::ERROR, new \Bitrix\Main\Error('Пожалуйста, подтвердите номер телефона.') ); } // Сбрасываем OTP после использования \Bitrix\Main\Application::getInstance()->getSession()->delete('otp_data'); return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS); }); 
Фронтенд: класс PhoneVerification
class PhoneVerification { constructor(formSelector) { this.form = document.querySelector(formSelector); this.phoneInput = this.form?.querySelector('[name="PHONE"]'); this.otpBlock = document.createElement('div'); this.countdown = null; } init() { this.phoneInput?.addEventListener('blur', () => this.showOtpRequest()); } async sendOtp() { const phone = this.phoneInput.value; const res = await fetch('/local/ajax/phone-otp-send.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: `phone=${encodeURIComponent(phone)}&sessid=${BX.bitrix_sessid()}`, }).then(r => r.json()); if (res.success) { this.showCodeInput(res.expires_at, res.masked_phone); } else { this.showError(res.error); } } showCodeInput(expiresAt, maskedPhone) { this.otpBlock.innerHTML = ` <p>Код отправлен на ${maskedPhone}</p> <input type="text" id="otp-code" maxlength="6" inputmode="numeric" autocomplete="one-time-code" placeholder="_ _ _ _ _ _"> <button type="button" id="verify-btn">Подтвердить</button> <span id="otp-timer"></span> `; this.startCountdown(expiresAt); document.getElementById('verify-btn').addEventListener('click', () => this.verifyCode()); } async verifyCode() { const code = document.getElementById('otp-code').value; const res = await fetch('/local/ajax/phone-otp-verify.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: `code=${encodeURIComponent(code)}&sessid=${BX.bitrix_sessid()}`, }).then(r => r.json()); if (res.success) { this.otpBlock.innerHTML = '<p class="verified">✓ Телефон подтверждён</p>'; clearInterval(this.countdown); // Разблокируем кнопку оформления заказа document.querySelector('.btn-checkout-submit')?.removeAttribute('disabled'); } else { document.getElementById('otp-code').classList.add('is-error'); } } startCountdown(expiresAt) { const timer = document.getElementById('otp-timer'); this.countdown = setInterval(() => { const left = Math.max(0, expiresAt - Math.floor(Date.now() / 1000)); timer.textContent = `Код действителен ${left} сек`; if (left === 0) { clearInterval(this.countdown); timer.textContent = 'Код истёк. Запросите новый.'; } }, 1000); } } 

SMS-провайдери

Модуль messageservice з коробки підтримує SMS.ru, SMSC.ru, MessageBird. Якщо ваш провайдер відсутній у списку, ми можемо підключити кастомний — достатньо реалізувати інтерфейс \Bitrix\MessageService\Sender\Base. Налаштування через адміністративну частину: Налаштування → SMS-сервіси. Детальніше про модуль можна дізнатися в документації модуля MessageService.

Терміни реалізації

Конфігурація Термін
OTP (send + verify + блокування замовлення) 2–3 дні
+ фронтенд з таймером і зворотним зв'язком +1–2 дні
+ кастомний SMS-провайдер +1 день

Що входить у роботу

  • Документація з описом архітектури та інструкція з підключення SMS-провайдера.
  • Доступи до коду на тестовому стенді для приймання.
  • Проведення навчання для адміністраторів (1 година).
  • Підтримка протягом 30 днів після впровадження (відповіді на запитання, виправлення багів).

Що ви отримаєте в результаті

  • Повний комплект PHP-скриптів і JS-класів з коментарями.
  • Готовий до впровадження код, інтегрований у вашу збірку.
  • Інструкцію з підключення будь-якого SMS-провайдера.
  • Гарантію, що код не ламає існуючий функціонал (перевіряємо на тестовому стенді).
  • Більше 50 успішних впроваджень за плечима наших інженерів.
  • Наша компанія має 5 років досвіду в розробці на 1С-Бітрікс, виконали понад 50 проектів.

Вирішення проблем з доставкою SMS

Якщо клієнт не отримав SMS, можливі причини: блокування повідомлень оператором, неправильний номер або затримка доставки. У нашому рішенні передбачена кнопка «Запросити код повторно» через 60 секунд (таймер на фронтенді). При трьох невдалих спробах відправки номер тимчасово блокується. Якщо проблема системна, адміністратор бачить логи відправки в модулі messageservice. Зв'яжіться з нами для безкоштовної оцінки вашого проекту — ми розповімо, як швидко закрити вразливість шахрайських замовлень. Наші спеціалісти з досвідом 5+ років впровадять OTP-верифікацію під ключ.