Двухстадийная оплата и частичный возврат

Михаил Ушенин

В версии 1.13 фреймворка Webasyst и в Shop-Script 8.6 мы добавили новые возможности обработки заказов:

  • двухстадийная оплата;
  • частичный возврат.

Ознакомительная обновлённая версия фреймворка для разработчиков выгружена на GitHub в ветку dev. Также в ветке dev обновлён и репозиторий Shop-Script.

Двухстадийная оплата

Такой способ оплаты выполняется в 2 шага:

  1. При оплате заказа денежные средства сразу не перечисляются на счёт продавца, а сначала только блокируются платёжным шлюзом. Заказ при этом получает статус auth.
  2. Когда нужно завершить оплату, т. е. перечислить заблокированные средства на счёт продавца, с заказом должно выполниться действие capture.

    Это действие может выполнить либо сам продавец в бекенде Webasyst, либо платёжный шлюз путём отправки запроса (callback) к фреймворку. Доступность каждого из этих вариантов зависит от реализации конкретного платёжного плагина.

    Некоторые платёжные шлюзы допускают отличие суммы фактического списания от суммы, которая была заблокирована. Во фреймворке Webasyst эта возможность пока недоступна.

Если вместо завершения оплаты заблокированные средства нужно вернуть покупателю, то с заказом нужно выполнить действие cancel. Способ его выполнения продавцом либо платёжным шлюзом также зависит от реализации плагина.

Частичный возврат

С помощью частичного возврата покупателю можно вернуть часть средств, перечисленных продавцу при оплате заказа. Эта возможность доступна при использовании плагинов:

  • явно поддерживающих частичный возврат;
  • вообще не поддерживающих возвраты — в этом случае возврат выполняется вручную в личном кабинете на сайте платёжного шлюза.

Использование частичного возврата в Shop-Script

Во время выполнения частичного возврата администратор магазина выбирает товары, которые нужно вернуть покупателю. Сумма частичного возврата вычисляется автоматически из стоимости возвращаемых товаров с учётом применённых скидок.

При выполнении возврата заказа срабатывает событие order_action.refund. В случае частичного возврата в обработчик события передаются следующие параметры:

  • refund_amount — сумма возврата в валюте заказа;
  • refund_items — возвращаемые позиции заказа.

При выполнении возврата и при удалении заказа теперь можно указать склады, на которых должны быть восстановлены остатки возвращаемых товаров. При этом в обработчики событий order_action.refund и order_action.delete также передаётся параметр return_stock с идентификаторами указанных складов.

Скидки

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

  • скидку, применённую к отдельному товару в составе заказа;
  • скидку, рассчитанную для всего заказа и распределённую по всем его товарам.

Стоимость доставки

Стоимость доставки, которая была рассчитана при оформлении заказа, остаётся без изменений после выполнения частичного возврата.

Пример реализации плагина оплаты

Двухстадийная оплата и частичный возврат заказов реализованы в новом плагине «Яндекс.Касса» (yandexkassa), который использует современную версию API платёжного сервиса. Мы выгрузили код нового плагина на GitHub. Используйте его в качестве примера для реализации этих возможностей в ваших платёжных плагинах.

8 ноября 2019
  • Syrnik.com 8 ноября 2019 17:41

    вот тут непонятно.

    в каком состоянии оказывается заказ с частичным возвратом. В refund или в completed?

    что со статистикой продаж и выполненных заказов происходит?

  • В текущей реализации при частичном возврате статус заказа не изменяется. С точки зрения логистики товаров не всё так однозначно, особенно, если уже задействована доставка.

    Статистика продаж должна пересчитаться на основе обновленных данных заказа.



Чтобы добавить комментарий, зарегистрируйтесь или войдите