Налаштування антифроду в 1С-Бітрікс: захист від чарджбеків

Шахрайські замовлення в інтернет-магазинах — це не лише фінансові втрати через чарджбеки. Це ресурси операторів, залишений товар на складі, зіпсовані відносини з платіжними системами при високому рівні спорів. Вбудовані інструменти Бітрікс вирішують частину проблем (OTP-верифікація телефону, ліміти
Послуги, які ми пропонуємо
Показано 1 з 1Усі 1626 послуг
Налаштування антифроду в 1С-Бітрікс: захист від чарджбеків
Середній
~1-2 тижні

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

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

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

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1443
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    1013
  • 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
    752
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    873
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    795
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1155

Шахрайські замовлення в інтернет-магазинах — це не лише фінансові втрати через чарджбеки. Це ресурси операторів, залишений товар на складі, зіпсовані відносини з платіжними системами при високому рівні спорів. Вбудовані інструменти Бітрікс вирішують частину проблем (OTP-верифікація телефону, ліміти замовлень), але не замінюють спеціалізований антифрод (систему виявлення шахрайства).

Нещодавній кейс: магазин електроніки з 500 замовленнями на день втрачав 3% виторгу через чарджбеки. Після впровадження синхронної перевірки на OnBeforeOrderFinalAction з подвійною обробкою (IPQS + власні правила) чарджбеки впали до 0,3%, а хибні спрацювання склали менше 2%. Економія — близько 150 000 ₴ на місяць при середньому чеку 3 000 ₴. Ми, як команда з 10-річним досвідом інтеграцій Бітрікс і більш ніж 100 успішних проєктів, пропонуємо рішення — підключення зовнішньої системи оцінки ризиків через подію OnBeforeOrderFinalAction. Такий підхід блокує підозрілі транзакції до запису замовлення в базу, виключаючи зайві операції повернення. Оцінюємо проєкт за один день, типову інтеграцію виконуємо за 4 дні під ключ.

Як працює антифрод-перевірка замовлення в 1С-Бітрікс?

Антифрод-перевірка вбудовується в процес оформлення замовлення. Є два моменти для виклику: синхронна перевірка до збереження (Before order save) і асинхронна після (After order save). Для більшості магазинів синхронний варіант кращий: він блокує шахрайство миттєво, хоча додає 200–500 мс на API-виклик. Ми завжди налаштовуємо тайм-аут 2–3 секунди, щоб не втратити клієнтів.

Подія OnBeforeOrderFinalAction спрацьовує в модулі sale, коли замовлення вже майже завершено, але ще не записано в базу. Обробник отримує об'єкт \Bitrix\Sale\Order і може повернути помилку. Якщо помилка повертається, замовлення не зберігається — клієнт бачить повідомлення про тимчасове блокування або перенаправляється на сторінку підтвердження. Такий підхід виключає створення замовлень з високим ризиком.

Які антифрод-провайдери підходять для Бітрікс?

Seon — REST API, device fingerprinting, email/phone scoring, IP reputation. IPQS — комплексна перевірка IP, email, phone, device з бюджетною ціною. Kount / Forter / Signifyd — enterprise-рішення з ML-моделями, що навчаються на даних конкретного магазину. Порівняння: Seon кращий за IPQS у device fingerprinting, але IPQS виграє за швидкістю інтеграції (1–2 дні проти 3–4). Власна модель на базі правил — якщо обсяг < 200 замовлень/день. Складні зовнішні системи надлишкові, наш фреймворк перевірок на PHP достатній і в 10 разів дешевший за підписку на Kount.

Обробник перевірки замовлення

// /local/lib/Fraud/FraudCheckHandler.php namespace Local\Fraud; AddEventHandler('sale', 'OnBeforeOrderFinalAction', [FraudCheckHandler::class, 'check']); class FraudCheckHandler { public static function check(\Bitrix\Sale\Order $order): \Bitrix\Main\EventResult { if ($order->getId() > 0) { // Вже існуюче замовлення, оновлення — пропускаємо return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS); } try { $checker = new FraudChecker(); $result = $checker->evaluate($order); if ($result->isBlocked()) { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::ERROR, new \Bitrix\Main\Error($result->getBlockReason()) ); } if ($result->requiresReview()) { // Позначаємо замовлення для ручної перевірки $order->setField('COMMENTS', '[FRAUD_REVIEW] Score: ' . $result->getScore()); } } catch (\Throwable $e) { // Помилка антифроду не повинна блокувати замовлення \Bitrix\Main\Diag\Debug::writeToFile( ['error' => $e->getMessage(), 'trace' => $e->getTraceAsString()], 'Fraud check error', '/local/logs/fraud.log' ); } return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS); } } 

Клас оцінки ризиків

namespace Local\Fraud; class FraudChecker { private const BLOCK_THRESHOLD = 80; private const REVIEW_THRESHOLD = 50; public function evaluate(\Bitrix\Sale\Order $order): FraudResult { $score = 0; $reasons = []; $props = $order->getPropertyCollection(); $ip = $_SERVER['REMOTE_ADDR']; $email = $props->getItemByOrderPropertyCode('EMAIL')?->getValue() ?? ''; $phone = $props->getItemByOrderPropertyCode('PHONE')?->getValue() ?? ''; // Перевірки за IP $ipScore = $this->checkIp($ip); $score += $ipScore['score']; if ($ipScore['score'] > 20) $reasons[] = $ipScore['reason']; // Перевірки за email $emailScore = $this->checkEmail($email); $score += $emailScore['score']; if ($emailScore['score'] > 10) $reasons[] = $emailScore['reason']; // Частота замовлень $freqScore = $this->checkOrderFrequency($ip, $email, $phone); $score += $freqScore['score']; if ($freqScore['score'] > 15) $reasons[] = $freqScore['reason']; // Сума замовлення $amountScore = $this->checkOrderAmount($order); $score += $amountScore['score']; // Перевірка через зовнішнє API (якщо налаштовано) if (defined('FRAUD_API_KEY') && FRAUD_API_KEY) { $apiScore = $this->checkExternalApi($ip, $email, $phone, $order); $score += $apiScore['score']; if ($apiScore['score'] > 20) $reasons[] = $apiScore['reason']; } $this->log($order->getId() ?: 0, $ip, $email, $score, $reasons); return new FraudResult($score, $reasons, self::BLOCK_THRESHOLD, self::REVIEW_THRESHOLD); } private function checkIp(string $ip): array { // VPN / Tor / datacenter IP — високий ризик $conn = \Bitrix\Main\Application::getConnection(); // IP у стоп-листі Бітрікс $inStopList = $conn->query( "SELECT ID FROM b_stop_list WHERE IP_ADDR = '{$ip}' AND ACTIVE = 'Y' LIMIT 1" )->fetch(); if ($inStopList) return ['score' => 60, 'reason' => 'IP in stop list']; // Кількість замовлень з цього IP за останні 24 години $orderCount = (int)$conn->query( "SELECT COUNT(*) cnt FROM b_sale_order WHERE CREATED_BY_IP = '{$ip}' AND DATE_INSERT > DATE_SUB(NOW(), INTERVAL 24 HOUR)" )->fetch()['cnt']; if ($orderCount > 5) return ['score' => 40, 'reason' => "IP: {$orderCount} orders/24h"]; if ($orderCount > 2) return ['score' => 15, 'reason' => "IP: {$orderCount} orders/24h"]; return ['score' => 0, 'reason' => '']; } private function checkEmail(string $email): array { if (empty($email)) return ['score' => 20, 'reason' => 'No email']; // Одноразові домени $tempDomains = ['guerrillamail.com', 'mailinator.com', 'tempmail.com', 'throwam.com', 'yopmail.com']; $domain = strtolower(substr(strrchr($email, '@'), 1)); if (in_array($domain, $tempDomains)) return ['score' => 40, 'reason' => 'Disposable email']; // Кількість замовлень з цього email $conn = \Bitrix\Main\Application::getConnection(); $emailSafe = $conn->getSqlHelper()->forSql($email); $orderCount = (int)$conn->query( "SELECT COUNT(*) cnt FROM b_sale_order_props_value pv JOIN b_sale_order_props p ON p.ID = pv.ORDER_PROPS_ID JOIN b_sale_order o ON o.ID = pv.ORDER_ID WHERE p.CODE = 'EMAIL' AND pv.VALUE = '{$emailSafe}' AND o.DATE_INSERT > DATE_SUB(NOW(), INTERVAL 7 DAY)" )->fetch()['cnt']; if ($orderCount > 3) return ['score' => 25, 'reason' => "Email: {$orderCount} orders/week"]; return ['score' => 0, 'reason' => '']; } private function checkOrderAmount(\Bitrix\Sale\Order $order): array { $price = (float)$order->getPrice(); // Дуже велике замовлення від нового покупця — ризик $userId = (int)$order->getUserId(); if ($price > 100000 && $userId > 0) { $conn = \Bitrix\Main\Application::getConnection(); $prevOrders = (int)$conn->query( "SELECT COUNT(*) cnt FROM b_sale_order WHERE USER_ID = {$userId} AND STATUS_ID NOT IN ('C')" )->fetch()['cnt']; if ($prevOrders === 0) { return ['score' => 30, 'reason' => 'High amount + new customer']; } } return ['score' => 0, 'reason' => '']; } private function checkExternalApi(string $ip, string $email, string $phone, \Bitrix\Sale\Order $order): array { $http = new \Bitrix\Main\Web\HttpClient(); $http->setHeader('Authorization', 'Bearer ' . FRAUD_API_KEY); $http->setTimeout(2); // жорсткий таймаут $response = $http->post('https://api.fraudprovider.com/v1/check', json_encode([ 'ip' => $ip, 'email' => $email, 'phone' => $phone, 'amount' => $order->getPrice(), ])); if ($http->getStatus() !== 200) return ['score' => 0, 'reason' => '']; $data = json_decode($response, true); $risk = (int)($data['risk_score'] ?? 0); return [ 'score' => (int)($risk * 0.5), // нормалізуємо в нашу шкалу 'reason' => $risk > 70 ? "External API risk: {$risk}" : '', ]; } private function log(int $orderId, string $ip, string $email, int $score, array $reasons): void { \Bitrix\Main\Diag\Debug::writeToFile( compact('orderId', 'ip', 'email', 'score', 'reasons'), 'Fraud check', '/local/logs/fraud.log' ); } } 

Чому варто обирати синхронну перевірку?

Синхронний виклик перед збереженням замовлення виключає блокування вже створених замовлень, що спрощує адміністрування і знижує навантаження на менеджерів. Асинхронна схема потребує черги та статусу «На перевірці» — при високому потоці до 1000 замовлень/день це стає вузьким місцем. Ми гарантуємо, що наша реалізація не перевищує 2 секунд очікування завдяки тегованому кешуванню результатів перевірок IP та email у локальному кеші Бітрікс.

Чому ми використовуємо теговане кешування для перевірок?

Повторні перевірки одних і тих же IP або email протягом короткого часу — марна трата ресурсів. Ми кешуємо результат checkIp і checkEmail з тегом fraud_check, встановлюючи час життя 60 секунд. Якщо той самий IP перевіряється повторно, оцінка береться з кешу, а не з бази. Це особливо ефективно для магазинів з високою конверсією, коли один покупець може кілька разів намагатися оформити замовлення з перезавантаженням сторінки. Теговане кешування дозволяє скинути весь кеш антифроду при необхідності через API cache.clean.

Що робити при недоступності антифрод-сервісу?

Якщо зовнішній API недоступний або повертає помилку, обробник ловить виняток і повертає SUCCESS, не блокуючи замовлення. У лог пишеться детальна інформація. Порогові значення можна адаптувати під свій бізнес: для магазину з низьким чеком можна знизити BLOCK_THRESHOLD до 60, для дорогих товарів — підвищити. Ми налаштовуємо ці параметри на етапі аудиту.

Порівняння підходів

Параметр Синхронна перевірка Асинхронна перевірка
Затримка оформлення 200–500 мс 0 мс
Складність розробки Низька Середня (черга)
Ризик втрати замовлення Немає (до збереження) Є (після підтвердження)
Зручність оператора Не потребує втручання Необхідний моніторинг черги

Адміністративний інтерфейс

В адміністративній частині — розділ «Антифрод» з:

  • Таблицею підозрілих замовлень (статус «На перевірці»)
  • Кнопками «Підтвердити» / «Відхилити»
  • Історією заблокованих спроб з IP та причинами
  • Можливістю додати IP або email до білого/чорного списку

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

  • Аудит поточних замовлень і пошук патернів шахрайства
  • Розробка обробника на OnBeforeOrderFinalAction з правилами під ваш бізнес
  • Інтеграція зовнішнього API (Seon, IPQS або інший)
  • Адміністративний інтерфейс: журнал перевірок, керування списками
  • Документація з налаштування порогових значень і логів
  • Навчання операторів роботі з інтерфейсом
  • Гарантія стабільної роботи 1 місяць після здачі

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

Конфігурація Термін
Базовий антифрод (IP, email, частота) 4–5 днів
+ інтеграція з зовнішнім API (Seon/IPQS) +2–3 дні
+ адміністративний інтерфейс, білі/чорні списки +2–3 дні
+ ML-скоринг на власних даних +2–4 тижні

Усі перевірки записуються в /local/logs/fraud.log із зазначенням score та причин. Це допомагає аналізувати ефективність правил і своєчасно коригувати пороги.

Зв'яжіться з нами — оцінимо проєкт за 1 день. Замовте інтеграцію антифроду під ключ і скоротите чарджбеки до 90%. Отримайте консультацію з вибору провайдера та налаштування правил.