Настройка антифрода в 1С-Битрикс: защита от чарджбеков

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

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

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1428
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    1008
  • 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 Appointment Booking Widget for a Medical Center
    745
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    869
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    782
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1149

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

Недавний кейс: магазин электроники с 500 заказами в день терял 3% выручки из-за чарджбеков. После внедрения синхронной проверки на OnBeforeOrderFinalAction с двойной обработкой (IPQS + собственные правила) чарджбеки упали до 0,3%, а ложные срабатывания составили менее 2%. Экономия — около $1.4k–1.9k в месяц при среднем чеке $27–39. Мы, как команда с 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%. Получите консультацию по выбору провайдера и настройке правил.