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

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

Что проверить в первую очередь

  • Найдите id заказа, id платежа и точное время создания платежа.
  • Сохраните состав корзины на момент оплаты, а не текущие цены товаров.
  • Проверьте валюту, количество знаков после запятой и правила округления.
  • Сравните сумму в заказе, в платежном запросе и в webhook.

Основные причины

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

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

Пошаговая диагностика

  • Выведите подробный расчет суммы заказа по шагам.
  • Проверьте, какие поля отправляются в платежную систему.
  • Сравните округление на backend, frontend и стороне платежного провайдера.
  • Проверьте сценарии промокода, бонусов, частичной оплаты и доставки.
  • Убедитесь, что валюта заказа совпадает с валютой платежа.

Как исправить

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

  • Фиксируйте snapshot заказа на момент создания платежа.
  • Используйте целые минимальные единицы валюты: копейки, центы и т.п.
  • Сведите расчет суммы в одно место, чтобы frontend не считал итог по-своему.
  • Добавьте проверку перед оплатой: сумма заказа должна совпадать с суммой payload.
  • При изменении корзины отменяйте старый платеж и создавайте новый.

Безопасный план решения

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

Как проверить результат

  • Тестовые заказы с доставкой, скидкой, бонусами и НДС совпадают до копейки.
  • Webhook подтверждает ту же сумму, которую ожидал заказ.
  • Изменение цены после создания платежа не меняет уже созданный счет.
  • В админке виден расчет, по которому сформирована платежная сумма.

Чего не стоит делать

  • Не отключайте проверки, права, платежные статусы или защиту только ради быстрого исчезновения ошибки.
  • Не правьте рабочую базу массовым запросом без выборки, бэкапа и понимания последствий.
  • Не ориентируйтесь только на один успешный тест: проверьте повторный запуск, отмену, ошибку и нестандартные данные.
  • Не оставляйте временные ключи, токены, debug-режим и лишний вывод в публичном доступе.

Как не допустить повторения

  • Храните денежные значения в целых минимальных единицах.
  • Пишите тесты на округления и смешанные скидки.
  • Не пересчитывайте оплачиваемый заказ по текущему каталогу.
  • Логируйте payload платежной системы для спорных случаев.

Что подготовить перед исправлением

  • Ссылку на проблемную страницу, кабинет, заказ, интеграцию или API-метод.
  • Точное время ошибки и пример пользователя, товара, платежа или запроса.
  • Скриншот, текст ошибки, лог веб-сервера, приложения или webhook-события.
  • Краткое описание ожидаемого поведения: что должно было произойти вместо ошибки.

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

Почему расхождение всего в одну копейку важно?

Платежные системы часто отклоняют или спорно обрабатывают платежи с несовпадающей суммой. Кроме того, копейки показывают проблему в правилах округления.

Комиссию надо включать в сумму заказа?

Это зависит от бизнес-правил и платежного провайдера. Главное — не смешивать комиссию с ценой товаров без явного расчета.

Когда стоит обратиться за помощью

Для проверки нужны пример заказа, payload платежа, webhook и правила скидок/доставки.

Итог

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