Ошибка формирования чека в 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 мне делает "козью морду", и какой из его фильтров делает не то что надо. Проявления "бага" таковы - при вставке некоторого количества миниатюр картинок ...

Читать

Обработка шоткодов в Contact Form 7

Июль 22, 2017 г.

Плагин Contact Form 7 позволяет конструировать формы, создавая их шаблоны в специальном конструкторе. Это (+CSS) позволяет придать форме любой внешний ...

Читать

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

Август 7, 2017 г.

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

Читать

Настройка ЧПУ в CMS

Август 3, 2015 г.

Как я напишу позднее, ЧПУ - один из факторов учитываемых в SEO. А пока как программист подскажу специалистам в SEO, где искать настройки ЧПУ в популярных CMS. Начну с рассказа о двух хорошо мне знакомых CMS, потом буду по мере возможности дополнять ...

Читать
 

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

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



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