Сайт с онлайн-кассой: интеграция платежей, ККТ

Автор: Александр Пылев, основатель «Интернет Касса».

Разработка сайта с онлайн-кассой — это не только платежная форма. Нужно связать заказ, интернет-эквайринг, ККТ, ОФД и доставку чека, а затем доказать тестами, что деньги и фискальные документы не теряются и не дублируются.

Ниже — маршрут для ИП и ООО, которые запускают интернет-магазин, продажу цифрового продукта или подписочный сервис. В конце вы получите структуру ТЗ, таблицу выбора, приемочные тесты и список данных для обсуждения интеграции.

Сначала выберите схему по сценарию бизнеса

Начните не с CMS и не с тарифа эквайринга, а с ответа на вопрос: где и когда происходит расчет с покупателем.

Сценарий Что выбрать на старте Что обязательно проверить
Интернет-магазин, оплата на сайте Готовый модуль CMS или API интернет-эквайринга и облачная либо локальная физическая ККТ для интернет-расчетов Предоплата, зачет при отгрузке, частичный возврат, передача состава заказа и электронного чека
Самовывоз с оплатой в магазине Отдельная схема для очной оплаты и ККТ в месте расчета Чтобы оплата на стойке не запускала повторное списание и повторный чек по интернет-заказу
Оплата курьеру ККТ и платежный способ, доступные курьеру в момент расчета Связь устройства с заказом, подтверждение списания, возврат и отправка чека
Цифровой товар или доступ к сервису Связка «подтвержденная оплата — выдача доступа — фискализация» Момент исполнения услуги, повторная выдача доступа и возврат
Подписка Интеграция с рекуррентными списаниями и отдельными событиями отмены и возврата Первый платеж, повторный платеж, неуспешное списание, отмена автопродления и возврат

Для интернет-эквайринга отдельно сравните способы оплаты, уведомления, возвраты и порядок сверки. Полезный ориентир — материал про подключение онлайн-эквайринга.

Как устроен контур сайта, платежей и фискализации

Разделите роли компонентов:

  • Сайт или CMS создает заказ и показывает его статус.
  • Платежный сервис авторизует или списывает деньги, сообщает о результате и обрабатывает возвраты.
  • ККТ формирует кассовый чек с реквизитами расчета.
  • ОФД передает фискальные данные и дает доступ к информации о чеках.

Банковская квитанция подтверждает платеж, но не заменяет кассовый чек, если для расчета требуется ККТ. До разработки зафиксируйте статус продавца, тип покупателя, способы оплаты, момент передачи товара или оказания услуги и основания для возможного неприменения кассы. Нормативную основу сверяйте по тексту 54-ФЗ в КонсультантПлюс и разъяснениям на сайте ФНС России.

Рабочая цепочка должна выглядеть так: создание заказа → подтверждение платежа → запрос на фискализацию → результат ККТ → отправка чека → сверка. Телефон или электронную почту покупателя собирайте до расчета, если чек отправляется электронно.

Платежный контур: что включить в ТЗ

Платежная интеграция должна подтверждать не сам факт перехода на страницу успеха, а результат операции на стороне провайдера. В ТЗ зафиксируйте следующие правила:

  • Проверяйте подпись webhook-уведомления по документации платежного сервиса до изменения статуса заказа.
  • Сверяйте на сервере order_id, сумму, валюту и итоговый статус операции с данными заказа. Не принимайте сумму из браузера без повторной проверки.
  • Используйте server-to-server-запрос статуса, если webhook задержался, пришел с ошибкой или завершился тайм-аутом.
  • Задайте идемпотентный ключ для платежа, чека и возврата. Повтор одного события должен вернуть прежний результат, а не создать новую операцию.
  • Обрабатывайте webhook в любом порядке: событие может прийти повторно или позже, чем ответ на запрос. Храните идентификатор события и журнал переходов.
  • Разделяйте авторизацию, списание, отмену авторизации и возврат. Отмена незавершенной операции не равна возврату уже списанных денег.
  • Не запускайте фискализацию по URL «оплата успешна». Запускайте ее после подтверждения операции на сервере и передавайте именно подтвержденный состав заказа.

Для каждого события задайте владельца: кто повторяет запрос, кто проверяет статус, кто разбирает расхождение суммы и кто сообщает покупателю об ошибке.

Сценарии чеков для разных продаж

Физический товар

Если покупатель сначала платит на сайте, а товар передается позже, в схеме может участвовать предоплата и ее последующий зачет. В ТЗ свяжите платеж с конкретным заказом, а событие передачи — с фактически отгруженными позициями. При частичной отгрузке не передавайте в документ товары, которые еще не переданы.

Если покупатель платит при самовывозе или курьеру, это отдельный расчет. Укажите место оплаты, устройство, способ подтверждения и отправку чека; не запускайте повторное списание по уже оплаченному интернет-заказу.

Цифровой товар

Опишите, что считается исполнением: выдача файла, активация лицензии, открытие доступа или другое событие. Свяжите подтвержденное списание, формирование чека и выдачу продукта так, чтобы сбой одного шага попадал в очередь на разбор, а не терялся.

Подписка

Разделите первый платеж, повторные списания, неуспешную попытку, оказание услуги и возврат. Отмена автопродления сама по себе не означает возврат: возврат оформляется только при фактическом возврате денег.

Готовый модуль или API: таблица выбора

Берите готовый модуль, если он поддерживает вашу версию CMS и все события расчетов. Выбирайте собственную интеграцию по API, если модуль не умеет работать с нужными платежными статусами, подписками, частичными возвратами или нестандартной логикой заказа.

Критерий Готовый модуль Собственный API Как принять
CMS и обновления Поддерживает установленную версию Код сопровождает разработчик Тест на копии сайта после обновления CMS
Webhook и статусы Настроены провайдером Проектируются в интеграции Проверить подпись, повторы, задержку и порядок событий
Предоплата и зачет Есть отдельные настройки События задаются в API Провести тест оплаты, отгрузки и частичной отгрузки
Возврат Поддерживает полный и частичный возврат Передает состав, сумму и идентификатор операции Сверить платеж, возврат и фискальный документ
Защита от дублей Есть идемпотентность Реализуется разработчиком Повторить один webhook и один запрос возврата
ККТ Подключается через поддерживаемый сервис Работает через API поставщика фискализации Проверить вид расчета, ФН, ОФД и сценарий места расчета
Сбои Есть журнал и уведомления Нужны очередь и мониторинг Отключить кассу в тесте и восстановить событие

Как выбрать физическую ККТ, облачную ККТ, ФН и ОФД

  1. Определите место расчета. Только сайт, магазин, самовывоз, курьер или несколько вариантов. От этого зависит схема ККТ и подключения.
  2. Выберите тип ККТ. Облачная ККТ подходит для интернет-расчетов без непосредственного взаимодействия с покупателем, если ее применение соответствует вашему сценарию. Локальная физическая ККТ нужна там, где расчет проводится через оборудование в магазине или у курьера.
  3. Сопоставьте модель и ФН. Проверьте, что модель ККТ и фискальный накопитель подходят для выбранных режимов расчетов, состава чеков и срока работы. Не выбирайте ФН только по цене.
  4. Подключите ОФД. Зафиксируйте, кто отвечает за подключение, контроль передачи данных и разбор ошибок.
  5. Проверьте интеграцию. Уточните, поддерживает ли провайдер нужные реквизиты, статусы, возвраты и повторную обработку. Для выбора самой ККТ используйте обзор онлайн-касс для бизнеса.

Что включить в ТЗ разработчику

  • Заказ: идентификатор, позиции, количество, цена, скидки, итог, налоговые параметры, признаки предмета и способа расчета, контакт покупателя.
  • Источники: для каждого поля укажите CMS, платежный сервис, склад или сотрудника, который передает значение.
  • Статусы: заказ создан, платеж авторизован, платеж списан, платеж отменен, возврат создан, чек сформирован, чек отправлен, ошибка.
  • Безопасность: проверка подписи webhook, секреты только на сервере, ограниченный доступ к журналам и защита персональных данных.
  • Идемпотентность: ключи для платежа, чека и возврата, запрос статуса после тайм-аута и запрет повторного создания операции при уже известном результате.
  • Сверка: ежедневное сопоставление заказов, платежей, возвратов и чеков по идентификаторам и суммам.
  • Сбои: очередь необработанных событий, уведомление ответственному, повтор с тем же ключом и инструкция для случая, когда платеж или чек уже создан.

Пошаговый запуск и приемка

  1. Опишите карту расчетов. Перечислите способы оплаты, места расчета, отгрузку, цифровую выдачу, подписки и возвраты.
  2. Распределите ответственность. Назначьте владельцев сайта, платежей, ККТ, ОФД, бухгалтерских настроек и обработки сбоев.
  3. Подготовьте ККТ. Выберите физическую или облачную ККТ, ФН и ОФД, затем оформите необходимые подключения и регистрацию с корректными параметрами. При необходимости используйте инструкцию по регистрации онлайн-кассы.
  4. Настройте платежи. Включите проверку webhook, сверку идентификатора заказа, суммы и валюты, server-to-server-проверку и идемпотентные ключи.
  5. Проведите тесты. Проверьте успешную и отклоненную оплату, задержанный и повторный webhook, тайм-аут, отмену, полный и частичный возврат, предоплату, зачет и недоступность ККТ.
  6. Проведите контролируемую покупку. В рабочем режиме сопоставьте заказ, платеж, чек, отправку чека и отгрузку. Фиктивные продажи в рабочую ККТ не отправляйте.
  7. Подпишите приемку. Передайте доступы, схему обмена, журнал тестов, инструкцию по сбоям и список ответственных. Назначьте регулярную сверку платежей и чеков.

Ошибки, которые ломают запуск

  • Чек создается по странице успеха. Замените этот триггер подтвержденным серверным статусом платежа.
  • Сумма берется из браузера. Сверяйте сумму, валюту и идентификатор заказа с данными платежного провайдера.
  • Повторный webhook создает второй чек. Храните идентификатор события и используйте идемпотентный ключ.
  • После тайм-аута запускается новый платеж или возврат. Сначала запросите статус исходной операции, затем повторяйте запрос только с тем же ключом и по заданному правилу.
  • Отмена подписки считается возвратом. Разделяйте отмену будущего списания и возврат уже полученных денег.
  • Зачет предоплаты не связан с отгрузкой. Передавайте событие передачи товара из склада, доставки или интерфейса сотрудника.
  • Нет владельца ошибки. Закрепите в договоре и ТЗ, кто восстанавливает платежный обмен, фискализацию и доставку чека.

Что можно получить от «Интернет Кассы»

Для магазина мы можем разобрать карту оплат, самовывоза, доставки и возвратов; для цифрового продукта — связать оплату, выдачу доступа и чек; для подписки — описать повторные списания, отмены и возвраты.

Результат работы зафиксируйте до разработки: аудит схемы расчетов, готовое ТЗ, подбор варианта ККТ и интеграции, сценарии приемочных тестов и помощь в запуске. Конкретный состав работ определите после получения данных о CMS, ассортименте, способах оплаты и местах расчета.

Частые вопросы

Заменяет ли интернет-эквайринг онлайн-кассу?

Нет, интернет-эквайринг принимает деньги, но не заменяет ККТ. Если для конкретного расчета нет предусмотренного освобождения, подключите фискализацию и проверьте отправку кассового чека.

Нужно ли писать интеграцию кассы с нуля?

Нет, сначала протестируйте готовый модуль для вашей CMS. Собственный API оправдан, если модуль не поддерживает нужные статусы, подписки, предоплату, частичные возвраты или защиту от дублей.

Можно ли подключить облачную кассу к интернет-магазину?

Да, облачная ККТ подходит для интернет-расчетов без непосредственного взаимодействия с покупателем. Для оплаты в магазине или у курьера нужна отдельная схема с учетом места и способа расчета.

Нужен ли отдельный чек при передаче предоплаченного товара?

Заложите в интеграцию событие зачета предоплаты при передаче товара, если расчет оформлен как аванс или предоплата. Состав и момент документа зависят от фактической схемы расчета, ранее сформированного чека и объема отгрузки, поэтому частичную передачу связывайте только с переданными позициями.

Как проверить работу кассы перед запуском?

Проведите сквозной тест от создания заказа до получения чека и сверки платежа. Включите отказ, задержанный и повторный webhook, тайм-аут, предоплату, зачет, полный и частичный возврат и недоступность ККТ.

Обсудите интеграцию до начала разработки

Подготовьте CMS и ее версию, ассортимент, способы оплаты, места расчета, порядок отгрузки, подписки и возвраты. Оставьте заявку в «Интернет Касса» — разберем схему, определим состав ТЗ, вариант фискализации и приемочные тесты.