Покупка в 1 клик, минимальный код

Алексей,

Частая задача для интернет-магазина на 1С-Битрикс. В примере показаны все этапы минимально необходимые для оформления заказа.

// Входящие параметры и константы
$_REQUEST['PRODUCT_ID'] = 5966;
$_REQUEST['NAME'] = 'Alex';
$_REQUEST['EMAIL'] = 'test@test.test';
define('PRICE_ID', 1); // Розничная цена
define('PAY_SYSTEM_ID', 1); // Наличные
define('DEFAULT_LOCATION_ID', '0000073738'); // Москва

CModule::IncludeModule('iblock');
CModule::IncludeModule('sale');
CModule::IncludeModule('catalog');

// Получаем данные о товаре по его ID
$dbItems = CIBlockElement::GetList(
	array(),
	array('ID' => IntVal($_REQUEST["PRODUCT_ID"])),
	false,
	false,
	array('ID', 'IBLOCK_ID', 'NAME', 'CATALOG_GROUP_'.PRICE_ID)
);
if ($arItem = $dbItems->GetNext()) {
	// Создаем корзину и добавляем туда товар, 1шт
	$basket = \Bitrix\Sale\Basket::create(SITE_ID);
	$basketItem = $basket->createItem("catalog", $arItem['ID']);
	$basketItem->setFields(
		array(
			'PRODUCT_ID' => $arItem['ID'],
			'NAME' => $arItem['NAME'],
			'PRICE' => $arItem['CATALOG_PRICE_'.PRICE_ID],
			'CURRENCY' => $arItem["CATALOG_CURRENCY_".PRICE_ID],
			'QUANTITY' => 1
		)
	);

	// Создаем заказ и привязываем корзину, перерасчет происходит автоматически
	$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(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();
}

Если возникнут вопросы, пишите в комментариях, постараюсь помочь.

Опубликовано 28 Августа 2019 | Обновлено 3 Сентября 2019
готовый код, примеры d7, разработчику

Возврат к списку

Комментарии