В обновлённом ядре Bitrix D7 функционал работы с заказами был существенно изменён. Немного ранее мы рассматривали работу со свойствами заказа посредством использования возможностей обновленного ядра D7. В данном посту мы поговорим про работу с функционалом оплаты заказов через API.
Об этом уже говорилось на нашем сайте, и не будет лишним повторить, что в ядре D7 реализована концепция ORM, свойственная для объектно-ориентированных языков программирования. Эта концепция включает в себя такое понятие как «коллекция», которая представляет из себя «умный» массив. Работа с ним оптимизирует групповые операции с объектами одного типа. Так к примеру, для реализации отдельного функционала сайта реализованы отведённые коллекции, с которыми мы можем работать по правилам ООП.
В данном посту вы рассмотрим возможности использования коллекции оплаты заказа Sale\PaymentCollection. Давайте создадим объект заказа, с которым мы и будем далее работать.
// используем пространство имён интернет-магазина use Bitrix\Sale; // int $orderId ID заказа $order = Sale\Order::load($orderId); // или так // mixed $orderNumber номер заказа $order = Sale\Order::loadByAccountNumber($orderNumber);
В переменную $order был помещён объект существующего заказа. Для работы с данными оплаты заказа, обращаемся к коллекции оплаты заказа Sale\PaymentCollection.
$paymentCollection = $order->getPaymentCollection();
После создания объекта коллекции оплаты, мы можем получать информацию об оплате текущего заказа, а также его параметры.
$paymentCollection->isPaid(); // статус оплаты заказа, true/false $paymentCollection->hasPaidPayment(); // есть ли хотя бы одна оплата, true/false $paymentCollection->getPaidSum(); // общая сумма оплаты $paymentCollection->isExistsInnerPayment(); // оплачен с внутреннего счёта true/false
Возможности системы позволяют содержать множество записей об оплатах. Это означает что с этими записями мы можем работать так же и в цикле. Каждая итерация цикла будет передавать объект оплаты Sale\Payment, который даёт возможность работы с данными оплаты.
foreach ($paymentCollection as $payment) { $sum = $payment->getSum(); // сумма к оплате $isPaid = $payment->isPaid(); // статус оплаты true/false $isReturned = $payment->isReturn(); // возврат, true/false $ps = $payment->getPaySystem(); // платежная система (объект Sale\PaySystem\Service) $psID = $payment->getPaymentSystemId(); // ID платежной системы $psName = $payment->getPaymentSystemName(); // наименование платежной системы $isInnerPs = $payment->isInner(); // оплата с внутреннего счёта, true/false }
Как получать данные оплаты мы рассмотрели, теперь самое время попробовать изменить параметры. Для этого мы попробует установить флаг оплаты, и возврата с помощью методов setPaid() и setReturn().
$onePayment = $paymentCollection[0]; $onePayment->setPaid("N"); // отменяем оплату $onePayment->setPaid("Y"); // выставляем оплату $onePayment->setReturn("Y"); // возврат средств // сохранение изменений $order->save();
Как мы знаем метод оплаты может иметь какую-либо форму с кнопкой оплаты. Для инициализации данной формы мы можем использовать следующий код:
$service = Sale\PaySystem\Manager::getObjectById($onePayment->getPaymentSystemId()); $context = \Bitrix\Main\Application::getInstance()->getContext(); $service->initiatePay($onePayment, $context->getRequest());
Таким образом, при создании заказа создаётся запись оплаты, с неоплаченным статусом. После транзакции покупателем статус оплаты должен меняться для подтверждения операции оплаты. Всё это делается в конкретном интерфейсе сайта. Пользуясь примерами, вы можете работать с оплатами заказа удобным для вас способом.