Покупка в 1 клик, минимальный код
Частая задача для интернет-магазина на 1С-Битрикс. В примере показаны все этапы минимально необходимые для оформления заказа.
// Входящие параметры и константы $_REQUEST['PRODUCT_ID'] = 5966; $_REQUEST['NAME'] = 'Alex'; $_REQUEST['EMAIL'] = 'test@test.test'; define('DEFAULT_PAY_SYSTEM_ID', 1); // Наличные define('DEFAULT_LOCATION_ID', '0000073738'); // Москва \Bitrix\Main\Loader::includeModule('iblock'); \Bitrix\Main\Loader::includeModule('sale'); \Bitrix\Main\Loader::includeModule('catalog'); // Получаем данные о товаре по его ID $dbItems = CIBlockElement::GetList( array(), array('ID' => IntVal($_REQUEST["PRODUCT_ID"])), false, false, array('ID', 'IBLOCK_ID', 'NAME') ); if ($arItem = $dbItems->GetNext()) { $arItem['PRICE'] = CCatalogProduct::GetOptimalPrice($arItem['ID'], 1); // Создаем корзину и добавляем туда товар, 1шт $basket = \Bitrix\Sale\Basket::create(SITE_ID); $basketItem = $basket->createItem("catalog", $arItem['ID']); $basketItem->setFields( array( 'PRODUCT_ID' => $arItem['ID'], 'NAME' => $arItem['NAME'], // "BASE_PRICE" =>$arItem['PRICE']['RESULT_PRICE']["BASE_PRICE"], // 'PRICE' => $arItem['PRICE']['RESULT_PRICE']["DISCOUNT_PRICE"], 'CURRENCY' => $arItem['PRICE']['RESULT_PRICE']['CURRENCY'], 'QUANTITY' => 1, 'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider', ) ); // Создаем заказ и привязываем корзину, перерасчет происходит автоматически $order = \Bitrix\Sale\Order::create(SITE_ID, ($USER->IsAuthorized()) ? $USER->GetID() : \CSaleUser::GetAnonymousUserID()); $order->setPersonTypeId(1); // Физ. лицо $order->setBasket($basket); // Создаём одну отгрузку и устанавливаем способ доставки - "Без доставки" (он служебный) $shipmentCollection = $order->getShipmentCollection(); $shipment = $shipmentCollection->createItem(); $service = \Bitrix\Sale\Delivery\Services\Manager::getById(\Bitrix\Sale\Delivery\Services\EmptyDeliveryService::getEmptyDeliveryServiceId()); $shipment->setFields(array( 'DELIVERY_ID' => $service['ID'], 'DELIVERY_NAME' => $service['NAME'], )); $shipmentItemCollection = $shipment->getShipmentItemCollection(); $arResult['basket'] = $basket; foreach ($basket as $item) { $shipmentItem = $shipmentItemCollection->createItem($item); $shipmentItem->setQuantity($item->getQuantity()); } // Создаём оплату $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->createItem(); $paySystemService = \Bitrix\Sale\PaySystem\Manager::getObjectById(DEFAULT_PAY_SYSTEM_ID); $payment->setFields(array( 'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"), 'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME"), )); // Устанавливаем свойства $propertyCollection = $order->getPropertyCollection(); $nameProp = $propertyCollection->getPayerName(); $nameProp->setValue(htmlspecialcharsbx($_REQUEST['NAME'])); $emailProp = $propertyCollection->getUserEmail(); $emailProp->setValue(htmlspecialcharsbx($_REQUEST['EMAIL'])); $locProp = $propertyCollection->getDeliveryLocation(); $locProp->setValue(DEFAULT_LOCATION_ID); // Сохраняем $order->doFinalAction(true); $order->save(); echo 'New order #'.$order->getId(); }
Если возникнут вопросы, пишите в комментариях, постараюсь помочь.
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.