WAPP
Expertise12 мин чтения

Интеграция оплаты на сайт и в приложение: ЮKassa, чеки по 54-ФЗ, ОФД

Максим

Максим

Основатель / CTO

LinkedIn
Интеграция оплаты на сайт и в приложение: ЮKassa, чеки по 54-ФЗ, ОФД

Мы в WAPP восемь лет делаем веб-сервисы и мобильные приложения, и почти в каждом проекте есть оплата. Интеграций платёжных систем за это время было больше двадцати. Вывод из них простой: подключить оплату — это дни, а вот сделать так, чтобы платёж, заказ, чек и доставка не расходились между собой, — недели. Ниже то, на чём мы сами спотыкались, и что советуем клиентам до старта.

С чего мы начинали: 54-ФЗ и онлайн-кассы

Когда мы открыли студию, требования 54-ФЗ к онлайн-кассам уже действовали: каждый, кто принимает оплату через интернет, обязан выдавать покупателю электронный чек. Первые интеграции мы делали на LIFE PAY — я до WAPP работал в этой компании и хорошо знал их кассу изнутри. С тех пор фискализация чеков для нас — не отдельная задача, а обязательная часть любой интеграции оплаты.

Цепочка выглядит так: клиент платит → система меняет статус заказа → формируется чек по 54-ФЗ → данные уходят в ОФД → покупатель получает электронный чек. Сам платёж почти никогда не ломается. Ломается всё, что после него.

Сам платёж проходит почти всегда. Сбои — между статусом заказа и отправкой чека в ОФД.

По закону расчёт без чека грозит штрафом до 100% от суммы расчёта (КоАП 14.5 ч. 2), а ошибки в реквизитах чека — предупреждением или штрафом до 10 000 ₽ для юрлица (ч. 4). Ошибки в чеках обычно не видны сразу: они копятся месяцами и всплывают при проверке.

Если продаж мало: не делайте интеграцию

Владельцу небольшого бизнеса, который хочет «просто кнопку оплаты за три дня», я обычно советую вообще не интегрировать оплату в сайт. Достаточно формы заявки и ссылки на оплату. Интернет-эквайринг банка (например, Т-Банка) или ЮKassa позволяют сгенерировать ссылку и отправить её клиенту. Подключение согласуют быстро, а у ЮKassa есть свои электронные чеки: она фискализирует платёж как агент, и отдельная касса не нужна.

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

Как выбрать провайдера: агрегатор или эквайринг банка

Мой совет — начинать с того, что дешевле. Чаще всего это прямой интернет-эквайринг банка с хорошим API и понятной документацией. Агрегаторы вроде ЮKassa и CloudPayments дороже по комиссии, но подключаются быстро и сразу дают карты, СБП, кошельки, Яндекс Пэй и оплату частями.

По нашему опыту внедрения:

  • ЮKassa — внедряется легко, есть встроенная фискализация.
  • Т-Банк — тоже легко, быстро согласовывают подключение.
  • CloudPayments — удобно внедрять.
  • LIFE PAY — интегрируется просто, но комиссия высокая.
  • Сбер — с документацией сложнее всего. В одном проекте мы начали интеграцию со Сбером и в итоге перешли на ЮKassa.

Актуальные тарифы проверяйте на сайтах провайдеров: они зависят от оборота и способа оплаты, по СБП комиссия обычно ниже, чем по картам.

Главное правило: два независимых эквайринга. Если у вас больше пяти продаж в день, подключайте две платёжные системы, которые не зависят друг от друга. Мы поняли это на Xstreet. По выбору клиента там стоял эквайринг Райффайзенбанка, и в какой-то момент он начал падать. Пришлось срочно подключать второй, резервный — эквайринг Тинькофф (сейчас Т-Банк). Пока работает только один провайдер, его сбой — это остановка продаж.

Резервный эквайринг подключается заранее, а не в день, когда основной перестал отвечать.

Способы подключения: ссылка, виджет, API, SDK

Ссылка или платёжная страница. Клиент переходит к провайдеру, платит и возвращается. Подходит для старта и небольших объёмов.

Встраиваемый виджет. Оплата не уводит с сайта, но виджет — ещё одно звено, которое может сломаться. В сети коворкингов, с которой мы работаем, кнопка «Оплатить онлайн» на сайте в какой-то момент перестала открывать окно ЮKassa: клиент выбирал переговорную, нажимал оплату — и ничего не происходило. Чеки при этом формировались корректно, проблема была в связке виджета с платёжным шлюзом. Заодно мы убрали из клиентского интерфейса оплату по счёту и оставили только карту, а у администраторов этот способ остался. Способы оплаты должны настраиваться по ролям.

Интеграция через API. Своя платёжная форма, полный контроль над статусами, возвратами и чеками из кода. Нужна, когда оплату надо связывать с личными кабинетами, 1С и доставкой.

SDK для мобильных приложений. Оплата в мобильном приложении идёт через платёжный SDK провайдера для iOS и Android. Помните про правила сторов: за цифровые товары и услуги Apple и Google берут комиссию до 30% и требуют свою систему оплаты. Физические товары и офлайн-услуги можно проводить через сторонний SDK. Подробнее о выборе стека для платёжных сценариев — в статье React Native или натив.

Фискализация чеков: 54-ФЗ и ОФД

Есть два сценария. Если вы используете электронные чеки ЮKassa, провайдер сам формирует чек и передаёт его в ОФД, а договор с оператором фискальных данных вам не нужен. Если работаете со своей облачной кассой, договор с ОФД заключаете сами, а чек формирует касса по данным из вашей системы.

Частая ошибка — ставка НДС в чеке не совпадает с налоговым режимом. С 2025 года ИП и компании на упрощённой системе налогообложения с доходом свыше 60 млн ₽ в год платят НДС (5%, 7% или 20%), ниже порога ставка — «без НДС». Проверьте ставку в настройках кассы до запуска.

При предоплате формируется чек с признаком предоплаты, при передаче товара — второй чек с полным расчётом. Возврат тоже оформляется отдельным чеком. Тестовый режим провайдера не отправляет данные в реальный ОФД, поэтому после запуска сделайте пару реальных покупок на минимальную сумму и проверьте, что чек дошёл покупателю.

Подписки, тарифы и оплата частями

В Future Volleyball School ученики покупают тарифы на период. Оплата идёт через ЮKassa, она же фискализирует платежи, а все оплаченные периоды видны администратору в админке. В Glinka Digital оплачиваются и отдельные уроки по модели pay-as-you-go, и подписка, тоже через ЮKassa. Для рекуррентных платежей помните: чек формируется при каждом списании.

Тарифы школы в админке: подписки на 1, 3, 6 месяцев и год.
Подписки учеников: видно, кто оплатил период, кто на пробном доступе, а у кого просрочен платёж.

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

Оплату частями через «Долями» мы подключали в Xstreet. Клиент хотел дать покупателям рассрочку на дорогие кроссовки, но сервисы рассрочки раз за разом отказывали ему в подключении, пока с «Долями» наконец не удалось договориться. Закладывайте время на согласование с провайдером: техническая часть здесь не самая долгая.

Оплата в приложении Xstreet

Итог заказа, комиссия сервиса, доставка и выбор способа оплаты — карта, Apple Pay, QR.

Экран оплаты в мобильном приложении
Экран оплаты в мобильном приложении

Связка оплаты с доставкой и статусами заказа

Xstreet — проект, на котором сошлось всё сразу. Вся цепочка «оплата → касса → доставка» заняла около двух месяцев. Само подключение оплаты и фискализации укладывается в месяц. Остальное время ушло на то, что клиенту нужно было управлять чеками: отправлять, отменять, собирать отчёты для бухгалтерии. Всё это пришлось разрабатывать. К тому же Xstreet работает как кассовый агент: после оплаты формируется не два, а три чека — один для реселлера и два для покупателя, а бухгалтерия выгружает отчёты агента.

Админка Xstreet: платежи, заказы и чеки в одном месте.

С доставкой было ещё веселее. Сначала работали со СДЭК, а когда СДЭК взломали и сервис лёг, пришлось в срочном порядке подключать Яндекс Доставку. С ней мы получили новую проблему: посылка регистрировалась в системе Яндекса, курьер приезжал на отправку, а ему говорили, что в их системе такого заказа нет. Вывод: статусы заказа у вас, у платёжки и у службы доставки — три разные модели, и их согласование — отдельная работа, а не «подключение API».

Ещё одно слабое место — уведомление о платеже (вебхук). Если бэкенд ответил провайдеру «200 OK» до того, как обработал платёж, а потом упал, платёж может потеряться: провайдер повторяет уведомление, только если не получил успешный ответ. Отвечайте только после записи в базу и проверяйте идентификатор платежа, чтобы повторное уведомление не создало дубль заказа.

Типичные проблемы, которые мы видели

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

Автоотмена неоплаченных заказов. Неоплаченные заказы клиента разумно отменять автоматически: в сети коворкингов это 15 минут. Но то же правило задело заказы, которые администратор создавал вручную для юрлиц: такой заказ мог неделю ждать оплаты по счёту и отменялся. Правило пришлось разделить по тому, кто создал заказ.

Чек и учёт — разные звенья. В том же проекте фискализация работала без ошибок, но заказ уходил в 1С только после оплаты, а при создании иностранной организации интеграция с 1С плодила дубли клиентов. Связку с 1С тестируйте отдельно от кассы.

Сбой на стороне провайдера. Однажды ошибка оплаты оказалась сбоем в API ЮKassa, а не в нашем коде. Логи запросов к платёжке экономят часы поиска виноватого.

С чем мы работали

ЮKassa — Future Volleyball School, Glinka Digital, сеть коворкингов. Эквайринг Райффайзенбанка и Тинькофф, «Долями», касса LIFE PAY, СДЭК и Яндекс Доставка — Xstreet. Эквайринг Сбербанка в Казахстане — Fiftyfour: клиент сам выбрал Сбер. Платёжный SDK для iOS — Beeline Kazakhstan.

Чек-лист перед запуском

  • Решите, нужна ли интеграция или хватит ссылки на оплату
  • Если продаж больше пяти в день — подключите два независимых эквайринга
  • Выберите сценарий фискализации: чеки провайдера или своя касса с договором ОФД
  • Проверьте ставку НДС под ваш налоговый режим
  • Настройте вебхуки: ответ только после записи в базу, проверка идентификатора платежа
  • Разведите правила автоотмены для заказов клиента и администратора
  • Проверьте связку с 1С и службой доставки отдельно от оплаты
  • Проведите реальные покупки на минимальную сумму всеми способами оплаты и проверьте чеки
  • Объясните менеджерам, почему счета нельзя выставлять мимо системы

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

Выводы

Интеграция оплаты — это не кнопка, а цепочка «платёж → статус → чек → доставка → учёт». Для маленького проекта достаточно ссылки на оплату от банка или ЮKassa. Когда платежей много, нужны интеграция, два независимых эквайринга и время на согласование статусов между всеми сервисами. По нашему опыту больше всего проблем создают не платёжные системы, а звенья вокруг них и процессы людей.

Если нужно подключить оплату к сайту или приложению и выстроить надёжную цепочку от платежа до чека, обсудите задачу с WAPP.

Обсуждение

Комментарии скоро появятся здесь — мы готовим модерацию и уведомления.