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

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

Добавляем flash (swf) файлы в медиатеку сайта на Wordpress

Июнь 20, 2016 г.

Файлы Adobe Flash с расширением .swf нельзя загрузить в wordpress из коробки. Сделано так не без веских на то оснований. Но если вы осознаёте риски, то ...

Читать

Создание таблиц в статьях на Wordpress

Июнь 27, 2017 г.

WP из коробки хоть и содержит визуальный редактор HTML, но с минимальным набором инструментов. Таблицы вы создавать можете, только если напишите HTML код ...

Читать

Wordpress, Яндекс и другие. Штрихи SEO.

Март 29, 2010 г.

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

Читать

Настройка интеграции payler c woocommerce

Ноябрь 28, 2020 г.

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

Читать
 

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

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



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