Задать вопрос

Bitrix. Интернет магазин. API работы с закаом. Как получить PAY_SYSTEM_ID по Id заказа?

Здравствуйте.
Сейчас есть вот такой код:

<?php
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';

use Bitrix\Main\Context,
Bitrix\Currency\CurrencyManager,
Bitrix\Sale\Order,
Bitrix\Sale\Basket,
Bitrix\Sale\Delivery,
Bitrix\Sale\PaySystem,
YandexCheckout\Client;

global $USER;

Bitrix\Main\Loader::includeModule("sale");
Bitrix\Main\Loader::includeModule("catalog");

if(CModule::IncludeModule("sale")){
$order = Order::load(71);
$collection = $order->getPaymentCollection();
}

То есть получаю объект заказа по id заказа = 71 строчкой $order = Order::load(71);
Далее предположительно получаю коллекцию оплат строчкой $collection = $order->getPaymentCollection();
Если вызвать var_dump($collection); то PAY_SYSTEM_ID определяется равный 2, при этом находится в приватном свойстве. Конечно можно выполнить (array)($collection) чтобы получить объект в виде массива, но хотелось бы правильное решение средствами Bitrix, поэтому пожалуйста ответе каким методом добраться до PAY_SYSTEM_ID.

Мало ли это важно - описанное выше, это подзадача оплаты заказа через API.

То есть далее я планирую сделать примерно следующее

$service = \Bitrix\Sale\PaySystem\Manager::getObjectById(2);// Здесь передаётся Id который как раз и требуется определить, то есть PAY_SYSTEM_ID
$payment = \Bitrix\Sale\Payment::create($collection, $service);

$payment->setField('SUM', 1000);// Создаём оплату на 1000 рублей к примеру
$collection->addItem($payment);// Добавляем оплату к коллекции
__________________________________________________________________________________
Вопрос решен, считаю нужным добавить следующее:
__________________________________________________________________________________
По факту я не совсем корректно из API создавал сам заказ, а именно сумму оплаты необходимо было указывать ещё на стадии формирования заказа, в этом случаи не было необходимости и в моём вопросе, а именно ещё на этапе формирования заказа нужно было сделать следующее:

$paymentCollection = $order->getPaymentCollection();
$payment = $paymentCollection->createItem();
$paySystemService = PaySystem\Manager::getObjectById(2);
$payment->setFields(array(
'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"),
'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME"),
'SUM' => ($cost + $deliveryCost)// !!!!!!!!!!! Именно этой строчки у меня не было, поэтому сумма оплаты была нулевая. То есть здесь указывается сумма оплаты, я указываю как сумма заказа с скидками плюс сумма доставки
));

А уже при проверке факта оплаты например от Яндекс кассы просто выполняется CSaleOrder::PayOrder($orderId, "Y"); Внимание! Метод согласно документации является устаревшим, но как сделать через Order я пока не понял
После использования данного метода появляется отметка "Да" в оплатах на против информации о оплате, а так же если суммы указанной в SUM достаточно для оплаты всего заказа - появляется информация что заказ оплачен в списке заказов, так же появляется в любом случаи зеленая индикация в заказе напротив метода заказа и оплаченная сумма.
  • Вопрос задан
  • 2125 просмотров
Подписаться 2 Средний 5 комментариев
Решения вопроса 1
alams_stoyne
@alams_stoyne
Full Stack Developer - #PHP #CSS #JS #DB
В заказе может быть не одна оплата поэтому:

$paymentCollection = $order->getPaymentCollection();

foreach ($paymentCollection as $payment) {
    $sum = $payment->getSum(); // сумма к оплате
    $isPaid = $payment->isPaid(); // true, если оплачена
    $isReturned = $payment->isReturn(); // true, если возвращена

    $ps = $payment->getPaySystem(); // платежная система (объект Sale\PaySystem\Service)
    $psID = $payment->getPaymentSystemId(); // ID платежной системы
    $psName = $payment->getPaymentSystemName(); // название платежной системы
    $isInnerPs = $payment->isInner(); // true, если это оплата с внутреннего счета
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы