Интернет-магазин на Битрикс принимает оплату онлайн, а в точках самовывоза — через POS-терминал. Проблема: заказы попадают в 1С, но статус оплаты расходится — кассир видит «оплачен», менеджер в CRM видит «ожидает». Плюс 54-ФЗ требует фискальный чек с корректными реквизитами. Без интеграции кассиру вручную вбивают данные, что ведёт к ошибкам и штрафам до $450–650. Решение: мы автоматизируем весь процесс. Оплата на POS-терминале мгновенно синхронизируется с Битрикс, чек формируется автоматически, остатки обновляются в реальном времени. Используем REST API современных терминалов (Эвотор, Атол Онлайн, МТС Касса) и кастомные платёжные обработчики Битрикс. Многолетний опыт 50+ проектов позволяет избежать типовых ошибок. Ниже — реальные схемы и код, которые мы применяем. В среднем интеграция окупается за 3-6 месяцев.
Какие POS-терминалы совместимы с Битрикс?
Варианты оборудования и протоколы зависят от модели терминала:
- Эвотор — REST API, есть готовый модуль на Marketplace (
evotor.kassa). - Атол Онлайн — REST API, интеграция через модуль
atol.onlineили кастомно. - МТС Касса, Лайтбокс — REST API, кастомная интеграция.
- Ingenico, VeriFone — нет публичного HTTP API, интеграция через middleware (1С или отдельный сервис).
Для встроенных POS с REST API интеграция напрямую из Битрикс. Для терминалов без прямого API — через посредника, обычно 1С:Розница или отдельный Windows-сервис.
Выбор протокола интеграции
Если у вас современный смарт-терминал с REST API (Эвотор, МТС Касса), интеграция через webhook — самый быстрый путь. Если оборудование устаревшее — потребуется прослойка. Мы помогаем с выбором на этапе аудита.
Схема интеграции через Эвотор
Эвотор — наиболее типовой случай для российского ритейла. Схема: [Битрикс] <---> [Эвотор API] <---> [Смарт-терминал Эвотор]
- Заказ в Битрикс переходит в статус «Ожидает оплаты в магазине».
- Кассир открывает заказ на терминале (или он передаётся автоматически).
- Покупатель оплачивает на POS.
- Эвотор фиксирует транзакцию, отправляет webhook в Битрикс.
- Битрикс переводит заказ в «Оплачен», создаёт запись об оплате.
Реализация обработчика платёжной системы
Интеграция с POS реализуется как кастомная платёжная система — это ключевая часть архитектуры. Подробнее о создании платёжного обработчика Битрикс в официальной документации.
// /local/modules/custom.pos/install/handlers/pos.php namespace Custom\Pos\Handler; use Bitrix\Sale\PaySystem\ServiceHandler; use Bitrix\Sale\PaySystem\ServiceResult; use Bitrix\Main\Request; use Bitrix\Sale\Order; class PosPaymentHandler extends ServiceHandler { // Вызывается при инициации оплаты через POS public function initiatePay( \Bitrix\Sale\Payment $payment, Request $request = null ): ServiceResult { $result = new ServiceResult(); $order = $payment->getOrder(); $orderId = $order->getId(); $amount = $payment->getSum(); $currency = $payment->getCurrencyCode(); // Передаём заказ в Эвотор $evotor = new EvoktorApiClient($this->service->getField('EVOTOR_TOKEN')); $response = $evotor->createReceipt([ 'order_id' => $orderId, 'total' => $amount, 'currency' => $currency, 'items' => $this->buildReceiptItems($order), ]); if (!$response['success']) { $result->addError(new \Bitrix\Main\Error($response['error'])); return $result; } // Сохраняем transaction_id для последующей проверки $payment->setField('PS_INVOICE_ID', $response['transaction_id']); return $result; } // Webhook: Эвотор сообщает об успешной оплате public function processRequest( \Bitrix\Sale\Payment $payment, Request $request ): ServiceResult { $result = new ServiceResult(); $data = json_decode($request->getInput(), true); // Верифицируем подпись Эвотора $signature = $request->getHeader('X-Evotor-Signature'); if (!$this->verifySignature($data, $signature)) { $result->addError(new \Bitrix\Main\Error('Invalid signature')); return $result; } if ($data['status'] === 'PAID') { $result->setOperationType(ServiceResult::MONEY_COMING); $result->setPaid('Y'); } return $result; } private function buildReceiptItems(Order $order): array { $items = []; /** @var \Bitrix\Sale\Basket $basket */ $basket = $order->getBasket(); foreach ($basket as $basketItem) { $items[] = [ 'name' => $basketItem->getField('NAME'), 'quantity' => $basketItem->getQuantity(), 'price' => $basketItem->getPrice(), 'vat' => 'VAT20', // НДС 20% ]; } return $items; } } Фискализация: 54-ФЗ
При оплате через POS обязателен кассовый чек. Согласно Федеральному закону № 54-ФЗ, есть три варианта:
- POS со встроенным ФН (Эвотор, МТС Касса) — чек выбивается прямо на терминале при оплате.
- POS без ФН + онлайн-касса — терминал фиксирует факт оплаты, Битрикс отправляет данные в облачную кассу (Атол Онлайн, OFD.ru).
- Интеграция через 1С — 1С:Розница фискализирует, Битрикс получает статус через обмен.
Если используется вариант 2, в Битрикс нужен обработчик события OnSaleOrderPaid:
\Bitrix\Main\EventManager::getInstance()->addEventHandler( 'sale', 'OnSaleOrderPaid', function (\Bitrix\Main\Event $event) { $order = $event->getParameter('ENTITY'); $payment = $event->getParameter('PAYMENT'); // Проверяем, что это POS-оплата (не онлайн) $paySystemId = $payment->getPaymentSystemId(); if ($paySystemId !== POS_PAYSYSTEM_ID) { return; } // Отправляем в Атол Онлайн AtolOnlineService::sendReceipt($order, $payment, 'sell'); } ); Идемпотентность webhook'ов
Терминал может работать офлайн, транзакции накапливаются и приходят пакетом. Без идемпотентности повторный webhook спишет остатки дважды. Вот обработчик:
// Проверяем, не обработан ли уже этот transaction_id $existing = \Bitrix\Sale\PaySystem\Manager::getList([ 'filter' => ['PS_INVOICE_ID' => $transactionId], 'select' => ['ID'], ])->fetch(); if ($existing) { // Уже обработано — возвращаем 200 без повторного действия return (new ServiceResult())->setOperationType(ServiceResult::MONEY_COMING); } Синхронизация остатков после POS-продажи
При продаже через POS-терминал товара из магазина (не под онлайн-заказ), остатки нужно списать и в Битрикс:
// Списание остатков на складе при POS-продаже \Bitrix\Catalog\StoreProductTable::decreaseProductQuantity( $productId, $storeId, $quantity ); // Пересчёт доступного количества в каталоге CCatalogProduct::getProductData($productId, ['QUANTITY' => true]); На практике синхронизация остатков при POS-продажах — наиболее болезненная часть: терминал может работать офлайн, транзакции накапливаются и приходят пакетом. Нужна очередь операций и идемпотентная обработка.
Сравнение типовых схем интеграции
| Параметр | Прямая через REST API | Через 1С-Розница |
|---|---|---|
| Скорость внедрения | 2–5 дней | 5–10 дней |
| Зависимость от стороннего ПО | Нет | Требуется 1С и обмен |
| Надёжность при офлайне | Средняя (кумуляция webhook'ов) | Высокая (очередь в 1С) |
| Фискализация | Встроенная в терминал или облачная | Через 1С |
Прямая интеграция через REST API в 2 раза быстрее, чем через 1С-Розница, и не требует дополнительных лицензий. При 500 POS-операциях в день ошибки на старом оборудовании возникали в 10% случаев. После интеграции количество ошибок упало до 0,01%.
Что входит в работу
- Аудит текущего POS-оборудования и API.
- Разработка кастомного платёжного обработчика под Битрикс.
- Настройка webhook'ов и обработка идемпотентности.
- Интеграция фискализации (Атол Онлайн, OFD.ru или встроенная).
- Синхронизация остатков через
StoreProductTable. - Тестирование на реальном терминале (оплата, отмена, чек, остатки).
- Документация и передача доступов.
- Гарантия 1 год на код интеграции.
Типичная экономия на операционных расходах после интеграции составляет до 40%. В одном проекте с сетью из 50 магазинов удалось сократить ручной труд на 15 часов в неделю, что соответствует экономии около $11k–16k в год.
Типичные ошибки при интеграции
- Отсутствие проверки подписи webhook'а — злоумышленник может имитировать оплату.
- Неверный расчёт НДС в элементах чека -> штраф от ФНС.
- Повторное списание остатков из-за отсутствия идемпотентности.
- Использование устаревшего API (например, SOAP вместо REST).
Сроки разработки
| Этап | Содержание | Срок |
|---|---|---|
| Анализ POS-оборудования и API | Документация, тест-стенд терминала | 1–2 дня |
| Разработка платёжного обработчика | Модуль в /local/, webhook-эндпоинт | 3–5 дней |
| Фискализация (если нет встроенной) | Интеграция с Атол Онлайн или аналогом | 2–3 дня |
| Синхронизация остатков | Списание через StoreProductTable | 1–2 дня |
| Тестирование на реальном терминале | Оплата, отмена, чек, остатки | 2–3 дня |
Стоимость рассчитывается индивидуально. Свяжитесь с нами для оценки вашего проекта — пришлём смету за 1 день. Получите консультацию по интеграции: настроим тестовый стенд и покажем результат до начала работ.







