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

7k
Алексей,
Покупка в 1 клик, минимальный код

Частая задача для интернет-магазина на 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();
}

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

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 28 августа 2019 | Обновлено 11 июля 2020
готовый код, примеры d7, разработчику
Поделиться
Похожие статьи
Как получить ограничения доставки по платежным системам
Понадобилось вне компонента оформления заказа показать какие способы оплаты доступны для той или ино...
Читать дальше » 0
Алексей,
Как получить название единицы измерения товара
Да и вообще всю информацию о единице измерения товара. Сразу покажу готовый код для нового ядра битр...
Читать дальше » 0
Алексей,
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
10 июл 2020
Добрый , 1. Я правильно понимаю, это обработчик. В него я могу с помощью jq передать константы по клику ? 2. $_REQUEST['PRODUCT_ID'] = 5966; $_REQUEST['NAME'] = 'Alex'; $_REQUEST['EMAIL'] = 'test@test.test'; где name и почта - это данные пользователя или менеджера? Спасибо за код!
Алексей
10 июл 2020
Павел, приветствую, все верно. Имя и почта покупателя. Код нужно немного поменять: при добавлении в корзину нужно указать провайдер и убрать поля цены, иначе не будут применяться скидки. Обновлю в ближайшее время.
11 июл 2020
Алексей, да, спасибо! было бы здорово, если обновите!
Алексей
11 июл 2020
Павел, обновил
13 июл 2020
Алексей, о, только решил зайти. Каеф. Щас буду разбираться. В принципе то понятно, что происходит, надо допилить. У меня помимо основного товара идут еще допники
Частая задача для интернет-магазина на 1С-Битрикс. В примере показаны все этапы минимально необходимые для оформления заказа.