Ошибка формирования чека в best2pay для WooCommerce при использовании купонов — разбор и решение

В одном из проектов столкнулся с проблемой формирования фискального чека в модуле оплаты best2pay для WooCommerce. Ошибка проявлялась не всегда, а только при использовании промокодов и нескольких товаров в корзине. Формально платеж проходил, но строки в чеке формировались некорректно: вместо скидки появлялась строка с «авансовым платежом».

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

Как best2pay формирует строки чека

В модуле best2pay строки фискального чека собираются на основе данных товара, а не фактической строки корзины. Используется примерно такой подход:

  • берётся get_price() у товара
  • умножается на количество
  • суммируется в итог чека

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

В результате возникает расхождение:

  • сумма по строкам ≠ итог заказа
  • best2pay добавляет отдельную корректирующую строку
  • и эта строка в чеке выглядит не как скидка, а как отдельный платёжный тип (фискальная система трактует его как — «аванс»)

Вот фрагмент кода модуля, который добавляет такую «компенсационную» строку:

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

Исправление: брать цену из строки корзины

Правильнее считать цену позиции не из товара, а из фактических данных строки корзины — там уже учтены:

  • купоны
  • скидки
  • динамическое ценообразование
  • модификаторы

Я сделал патч, который заменяет получение цены товара на вычисление цены из суммы строки корзины.

Теперь цена позиции берётся из total строки корзины — то есть уже с учётом купона.

После этого «строка со скидкой» перестаёт появляться — потому что суммы сходятся.

Но тут появляется вторая проблема.

Проблема дробных копеек на единицу товара

Если купон применён к строке с несколькими товарами, WooCommerce спокойно оперирует дробными значениями. Например:

  • было: 120 ₽
  • стало: 100 ₽ после купона
  • количество: 3

Цена за единицу = 33.3333…

WooCommerce это допускает.
Фискальный чек — нет.

best2pay отклоняет такие позиции, потому что цена единицы должна иметь ровно 2 знака после запятой.

Значит, нужно гарантировать, что эффективная цена за единицу после скидки всегда округляется до копеек.

Коррекция скидки через фильтр WooCommerce

Решение — немного увеличить размер скидки так, чтобы итоговая цена за единицу товара стала корректной с точки зрения фискализации.

Это можно сделать через фильтр:

Я добавил такой обработчик:

Что здесь происходит:

  • мы берём итог строки после скидки
  • считаем цену за единицу
  • обрезаем её до копеек вниз
  • считаем расхождение
  • добавляем это расхождение к скидке

Итог

Проблема оказалась не в best2pay как таковом, а в несовпадении моделей расчёта:

WooCommerce считает строками корзины
модуль — базовыми ценами товара
фискальный чек требует точных цен за единицу

Комбинация патча в модуле и фильтра WooCommerce позволяет:

  • убрать лишнюю строку «скидки/аванса»
  • синхронизировать суммы
  • избежать дробных копеек
  • стабильно формировать фискальные чеки

Если модуль обновляется — патч лучше хранить в виде git-patch и накатывать автоматически при деплое.

Мало букафф? Читайте есчо !

Брендовый сайт премиум корма марки Blitz

Август 15, 2016 г.

Этот проект на Wordpress мне достался на доработку. Я не часто занимаюсь сайтами на WP, есть тому причины, но рынок диктует свои правила. Огромное число ...

Читать

Добавление поля с картинкой в редактор таксономии WP

Июль 4, 2017 г.

Таксономия (словари) Wordpress может быть модифицирована под любые нужды проекта. Для этого CMS предоставляет мощное API, благодаря которому есть готовые ...

Читать

Модуль для WP Counter Integration

Октябрь 30, 2015 г.

На днях собрал модуль для подключения счетчиков на сайт под WP. Он позволяет добавить код Метрики Яши и Аналитики Гоши. Сегодня я его уже записал в репозиторий wordpress.org. Он решает задачу по размещению кода счетчика на страницах сайта, но не ...

Читать

Создаем WP администратора через доступ к базе

Январь 25, 2019 г.

Данные инструкции могут быть полезны, если у вас есть только доступ к базе сайта на WP, и вам срочно надо добавить аккаунт админа. Администратор ...

Читать
 

Комментарии к «Ошибка формирования чека в best2pay для WooCommerce при использовании купонов — разбор и решение»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: