UPD: в скрипте используются старые методы работы с заказом, для тех у кого Битрикс новых редакций рекомендую в работе с заказами использовать D7!
Пост не удаляю, чтобы вновь открыв его, ужаснуться какие раньше велосипеды изобретал :)
Данной темы косвенно касался уже несколько раз, напишу более простой и обновленный вариант оформления заказа с помощью API методов Битрикса. Если кому-то понадобится буду рад=)
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php"); $APPLICATION->SetTitle("Перенос заказов"); @set_time_limit(0); if(!CModule::IncludeModule("sale") && !CModule::IncludeModule("catalog")) die(); if( !empty($_POST["FIO"])&& !empty($_POST["EMAIL"])&& !empty($_POST["PHONE"]) ) { // Шаг 0. Lexa.pro: параметры $arIBLOCKS = array(10, 11); // инфоблоки с товарами // в моем случае одинаковое для двух инфоблоков $typePrice = 1; // Тип цены $PERSON_TYPE_ID = 1; $PAY_SYSTEM_ID = 1; $DELIVERY_ID = 2; // Шаг 1. Lexa.pro: найти/создать пользователя global $USER; $emailUser = CUser::GetList($by="", $order="", array('=EMAIL' => $_POST["EMAIL"])); while($arUser = $emailUser->Fetch()) $USER_ID = $arUser["ID"]; if(empty($USER_ID)){ // Если не нашлось email-а в БД, созданим нового юзвера $NEW_LOGIN = $_POST["EMAIL"]; $NEW_EMAIL = $_POST["EMAIL"]; $NEW_NAME = ""; $NEW_LAST_NAME = ""; if(strlen($_POST["FIO"]) > 0) { $arNames = explode(" ", $_POST["FIO"]); $NEW_NAME = $arNames[1]; $NEW_LAST_NAME = $arNames[0]; } $pos = strpos($NEW_LOGIN, "@"); if ($pos !== false) $NEW_LOGIN = substr($NEW_LOGIN, 0, $pos); if (strlen($NEW_LOGIN) > 47) $NEW_LOGIN = substr($NEW_LOGIN, 0, 47); if (strlen($NEW_LOGIN) < 3) $NEW_LOGIN .= "___"; $dbUserLogin = CUser::GetByLogin($NEW_LOGIN); if ($arUserLogin = $dbUserLogin->Fetch()) { $newLoginTmp = $NEW_LOGIN; $uind = 0; do { $uind++; if ($uind == 10) { $NEW_LOGIN = $arUserResult["USER_EMAIL"]; $newLoginTmp = $NEW_LOGIN; } elseif ($uind > 10) { $NEW_LOGIN = "buyer".time().GetRandomCode(2); $newLoginTmp = $NEW_LOGIN; break; } else { $newLoginTmp = $NEW_LOGIN.$uind; } $dbUserLogin = CUser::GetByLogin($newLoginTmp); } while ($arUserLogin = $dbUserLogin->Fetch()); $NEW_LOGIN = $newLoginTmp; } $GROUP_ID = array(2); $def_group = COption::GetOptionString("main", "new_user_registration_def_group", ""); if($def_group!="") { $GROUP_ID = explode(",", $def_group); $arPolicy = $USER->GetGroupPolicy($GROUP_ID); } else { $arPolicy = $USER->GetGroupPolicy(array()); } $password_min_length = intval($arPolicy["PASSWORD_LENGTH"]); if($password_min_length <= 0) $password_min_length = 6; $password_chars = array( "abcdefghijklnmopqrstuvwxyz", "ABCDEFGHIJKLNMOPQRSTUVWXYZ", "0123456789", ); if($arPolicy["PASSWORD_PUNCTUATION"] === "Y") $password_chars[] = ",.<>/?;:'\"[]{}\|`~!@#\$%^&*()-_+="; $NEW_PASSWORD = $NEW_PASSWORD_CONFIRM = randString($password_min_length+2, $password_chars); $user = new CUser; $arAuthResult = $user->Add(Array( "LOGIN" => $NEW_LOGIN, "NAME" => $NEW_NAME, "LAST_NAME" => $NEW_LAST_NAME, "PASSWORD" => $NEW_PASSWORD, "CONFIRM_PASSWORD" => $NEW_PASSWORD_CONFIRM, "EMAIL" => $NEW_EMAIL, "GROUP_ID" => $GROUP_ID, "ACTIVE" => "Y", "LID" => SITE_ID, ) ); if (IntVal($arAuthResult) <= 0) { $arResult["ERROR"][] = GetMessage("STOF_ERROR_REG").((strlen($user->LAST_ERROR) > 0) ? ": ".$user->LAST_ERROR : "" ); } else { $USER->Authorize($arAuthResult); } } else { $USER->Authorize($USER_ID); // авторизуем, если новый } // Шаг 2. Lexa.pro: оформляем заказ // в моем случае не важно какие тип платильщика, способы доставки и оплаты были указаны // 2.1 Получаем корзину $basket = array(); // корзина $summ = 0; $dbBasketItems = CSaleBasket::GetList( array(), array("FUSER_ID" => CSaleBasket::GetBasketUserID(),"LID" => SITE_ID, "ORDER_ID" => "NULL"), false, false, array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "PRODUCT_PROVIDER_CLASS", "PRICE") ); while ($arItems = $dbBasketItems->GetNext()) { $basket[] = $arItems; $summ += $basket["QUANTITY"]*$basket["PRICE"]; } // 2.2Добавляем заказ $arOrderDat = CSaleOrder::DoCalculateOrder( SITE_ID, $USER->GetID(), $basket, $PERSON_TYPE_ID, // тип плательщика array(), $DELIVERY_ID, // доставка $PAY_SYSTEM_ID, // оплата array(), $arErrors, $arWarnings ); $arFields = array( "LID" => SITE_ID, "PERSON_TYPE_ID" => $PERSON_TYPE_ID, "PAYED" => "N", "CANCELED" => "N", "STATUS_ID" => "N", "PRICE" => $summ, "CURRENCY" => "RUB", "USER_ID" => (int)$USER->GetID(), "PAY_SYSTEM_ID" => $PAY_SYSTEM_ID, //"PRICE_DELIVERY" => $arResult["DELIVERY_PRICE"], "DELIVERY_ID" => $DELIVERY_ID, //"DISCOUNT_VALUE" => $arResult["DISCOUNT_PRICE"], //"TAX_VALUE" => $arResult["bUsingVat"] == "Y" ? $arResult["VAT_SUM"] : $arResult["TAX_PRICE"], "USER_DESCRIPTION" => $_POST["SITE"], "ORDER_PROP" => array( 3 => $_POST["PHONE"], 1 => $_POST["FIO"], 7 => $_POST["ADDRESS"], 2=> $_POST["EMAIL"], ), ); //не получилось прикрепить корзину к заказу $orderID = (int)CSaleOrder::DoSaveOrder($arOrderDat, $arFields, 0, $arErrors); CSaleBasket::OrderBasket($orderID, $_SESSION["SALE_USER_ID"], SITE_ID); // привязывает товары из корзины к заказу. }