Михаил Базаров Разработка на 1С-Битрикс Михаил Базаров

Создание заказа через API 1С-битрикс, с автоматическим редиректом на оплату

Внимание! Все сообщения на форуме проходят модерацию. Ваше сообщение появится после проверки.
Вопрос. У меня в личном кабинете пользователя есть небольшой список услуг. Можно ли сделать переход на оплату сразу по клику обходя корзину и все остальное?  
Можно отправить на некую страницу со скриптом, в которой создастся заказ с выбранными позициями и с нее сразу переход на оплату, по ID этого заказа.
То есть, для пользователя что-то быстро прмелькнет, по сути даже не заметит и сразу отправится в банк.

Ответ на вопрос в формате видео инструкции
https://boosty.to/camouf/posts/ab50013d-fac9-4a1d-a3d0-1787357184d6?share=post_link

Код использованный в видео:

Код
use Bitrix\Main\Context,
    Bitrix\Currency\CurrencyManager,
    Bitrix\Sale\Order,
    Bitrix\Sale\Basket,
    Bitrix\Sale\Delivery,
    Bitrix\Sale\PaySystem;

global $USER;

$rsUser = CUser::GetByID($USER->GetID());
    $arUser = $rsUser->Fetch();

    Loader::includeModule("sale");
    
    $request = Context::getCurrent()->getRequest();
    $productId = $request["PRODUCT_ID"];
    $userId = $arUser['ID'];
    $userEmail = $arUser['EMAIL'];

    $siteId = Context::getCurrent()->getSite();
    $currencyCode = CurrencyManager::getBaseCurrency();


    $products = [
        [
            'PRODUCT_ID' => $productId,
            'PRODUCT_PROVIDER_CLASS' => '\Bitrix\Catalog\Product\CatalogProvider',
            'CURRENCY' => 'RUB',
            'QUANTITY' => 1,
        ]
    ];
    $basket = Bitrix\Sale\Basket::create('s1');
    foreach ($products as $product)
    {
        $item = $basket->createItem("catalog", $product["PRODUCT_ID"]);
        unset($product["PRODUCT_ID"]);
        $item->setFields($product);
    }
    $siteId = 's1'; // код сайта
    $userId = $userId; // ID пользователя
    $order = \Bitrix\Sale\Order::create($siteId, $userId);
    $order->setPersonTypeId(1); // 1 - ID типа плательщика
    $order->setBasket($basket);
    $shipmentCollection = $order->getShipmentCollection();
    $shipment = $shipmentCollection->createItem(
        Bitrix\Sale\Delivery\Services\Manager::getObjectById(1) // 1 - ID службы доставки
    );
    $shipmentItemCollection = $shipment->getShipmentItemCollection();
    foreach ($basket as $basketItem)
    {
        $item = $shipmentItemCollection->createItem($basketItem);
        $item->setQuantity($basketItem->getQuantity());
    }
    $paymentCollection = $order->getPaymentCollection();
    $payment = $paymentCollection->createItem(
        Bitrix\Sale\PaySystem\Manager::getObjectById(4) // 1 - ID платежной системы
    );
    $payment->setField("SUM", $order->getPrice());
    $payment->setField("CURRENCY", $order->getCurrency());
    $r = $order->save();
    if (!$r->isSuccess())
    {
        var_dump($r->getErrorMessages());
    }
    $orderId = $order->getId();
Михаил, доброй ночи.
Вопрос такой.
А если пользователь не авторизован?
Я заменил $USER->GetID()  на CSaleUser::GetAnonymousUserID()
Заказ оформляется. Появляется ссылка на оплату, но при переходе к оплате пишет заказ не найден.
Можно как то сессию к заказу привязвать? Или что делать в этом случаи?
Спасибо!
Варианта по сути два:
1) Создать пользователя в системе и такие заказы привязывать к нему.
2) При создании заказа, создавать нового пользователя. Тогда до перехода на скрипт еще и e-mail запрашивать. В скрипте добавить создание пользователя методом СUser::Add

Второй вариант правильнее юридически: вам же по закону нужно отправить чек об оплате, пользователю. Ну и не забывайте спрашивать согласие на обработку данных.
Самое простейшее в системах отплаты в личном кабинете есть ссылки на оплату.
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
 

Блог-note Заметки по 1С-Битрикс