Если сумма в платежной системе отличается от суммы заказа, ошибка может быть как в копейках из-за округления, так и в серьезном расхождении из-за скидки, доставки, валюты или повторного пересчета корзины.
Разберите заказ на составляющие: товары, скидки, промокод, доставка, налоги, бонусы, комиссия, валюта и итог. Затем сравните тот же набор с payload, который ушел в платежную систему.
Что проверить в первую очередь
- Найдите id заказа, id платежа и точное время создания платежа.
- Сохраните состав корзины на момент оплаты, а не текущие цены товаров.
- Проверьте валюту, количество знаков после запятой и правила округления.
- Сравните сумму в заказе, в платежном запросе и в webhook.
Основные причины
Такая проблема редко появляется сама по себе. Обычно ломается связка из нескольких настроек: данные уходят не туда, событие приходит не в том порядке, старая логика остается в кеше или права проверяются не на том уровне. Поэтому сначала нужно отделить симптом от причины.
- Корзина пересчитывается после создания платежа по новым ценам.
- Доставка или скидка добавляется в заказ, но не попадает в платеж.
- Округление выполняется отдельно по позициям и по итоговой сумме.
- Платежная система ожидает сумму в копейках, а код передает рубли.
Пошаговая диагностика
- Выведите подробный расчет суммы заказа по шагам.
- Проверьте, какие поля отправляются в платежную систему.
- Сравните округление на backend, frontend и стороне платежного провайдера.
- Проверьте сценарии промокода, бонусов, частичной оплаты и доставки.
- Убедитесь, что валюта заказа совпадает с валютой платежа.
Как исправить
Исправление лучше делать небольшими шагами. Сначала зафиксируйте текущее поведение, затем внесите одну правку, проверьте контрольный сценарий и только после этого переходите к следующему месту. Так проще понять, какая именно правка решила проблему.
- Фиксируйте snapshot заказа на момент создания платежа.
- Используйте целые минимальные единицы валюты: копейки, центы и т.п.
- Сведите расчет суммы в одно место, чтобы frontend не считал итог по-своему.
- Добавьте проверку перед оплатой: сумма заказа должна совпадать с суммой payload.
- При изменении корзины отменяйте старый платеж и создавайте новый.
Безопасный план решения
- Сделайте резервную копию файлов, базы или конфигурации, если правка затрагивает рабочий проект.
- Повторите ошибку на тестовом пользователе, заказе, заявке или окружении, чтобы не работать вслепую.
- Внесите минимальное изменение и сохраните возможность быстрого отката.
- Проверьте основной сценарий, крайние случаи и права доступа для разных ролей.
- После выкладки посмотрите логи и реальные события за первые часы работы.
Как проверить результат
- Тестовые заказы с доставкой, скидкой, бонусами и НДС совпадают до копейки.
- Webhook подтверждает ту же сумму, которую ожидал заказ.
- Изменение цены после создания платежа не меняет уже созданный счет.
- В админке виден расчет, по которому сформирована платежная сумма.
Чего не стоит делать
- Не отключайте проверки, права, платежные статусы или защиту только ради быстрого исчезновения ошибки.
- Не правьте рабочую базу массовым запросом без выборки, бэкапа и понимания последствий.
- Не ориентируйтесь только на один успешный тест: проверьте повторный запуск, отмену, ошибку и нестандартные данные.
- Не оставляйте временные ключи, токены, debug-режим и лишний вывод в публичном доступе.
Как не допустить повторения
- Храните денежные значения в целых минимальных единицах.
- Пишите тесты на округления и смешанные скидки.
- Не пересчитывайте оплачиваемый заказ по текущему каталогу.
- Логируйте payload платежной системы для спорных случаев.
Что подготовить перед исправлением
- Ссылку на проблемную страницу, кабинет, заказ, интеграцию или API-метод.
- Точное время ошибки и пример пользователя, товара, платежа или запроса.
- Скриншот, текст ошибки, лог веб-сервера, приложения или webhook-события.
- Краткое описание ожидаемого поведения: что должно было произойти вместо ошибки.
Частые вопросы
Почему расхождение всего в одну копейку важно?
Платежные системы часто отклоняют или спорно обрабатывают платежи с несовпадающей суммой. Кроме того, копейки показывают проблему в правилах округления.
Комиссию надо включать в сумму заказа?
Это зависит от бизнес-правил и платежного провайдера. Главное — не смешивать комиссию с ценой товаров без явного расчета.
Когда стоит обратиться за помощью
Для проверки нужны пример заказа, payload платежа, webhook и правила скидок/доставки.
Итог
Сумма оплаты должна быть воспроизводимой формулой, а не результатом нескольких разрозненных расчетов. Я могу найти расхождение и привести оплату к стабильной логике.