Ошибка формирования чека в 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 и накатывать автоматически при деплое.

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

Глючный фильтр shortcode_unautop в Wordpress

Июнь 25, 2010 г.

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

Читать

Добавляем в редактор Wordpress дополнительные поля загрузки картинок

Август 2, 2019 г.

WP позволяет подключить одно изображение к статье, и обычно этого достаточно, чтобы оформить статьи в списке и саму статью. Если требуются дополнительные ...

Читать

Вывод анонсов статей с картинкой, в Wordpress

Август 5, 2013 г.

Сформулируем задачу. Нужно вывести 3 (а в общем случае N) анонсов новостей, с картинкой, в шаблоне на главной странице сайта. Этот кусочек должен выглядеть ...

Читать

Как вывести категорию товаров Woocommerce в нужном месте?

Июль 14, 2017 г.

Woocommerce показывает каталог товаров (витрину) на странице - /shop/, которая создаётся автоматически при установке плагина. Здесь выводятся ...

Читать
 

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

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



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