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

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

Payler для Woocommerce

Ноябрь 25, 2020 г.

Для blitzpet.ru занимался подключением платежной системы payler к woocommerce на WP. Обычно в таких случаях используются готовые "фирменные" плагины, разработанные dev team платежной системы для большинства популярных CMS. Но support со стороны payler ...

Читать

Contact Form 7 - добавим галочку на согласие по обработке персональных данных

Июль 21, 2017 г.

Вступившие в силу поправки (с 01.07.2017) федерального закона ФЗ 152 "О защите персональных данных" требуют, чтобы владельцы сайтов информировали пользователя ...

Читать

Отображение галереи в wordpress

Март 19, 2014 г.

Вордпресс позволяет вставлять изображения публикации в виде галереи, выполненной списком миниатюр. Для этого используется специальный тег (shortcode) - ...

Читать

Как добавить своё поле в попап медиафайла WordPress через class-плагин

Июнь 12, 2025 г.

Иногда стандартных полей WordPress для медиафайлов недостаточно. В этой статье я расскажу, как добавить собственное поле в окно редактирования вложения (attachment) — то самое, что появляется при открытии медиафайла в библиотеке. Мы не просто добавим ...

Читать
 

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

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



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