getField('CODE') == $code) { return $property; } } } // Определяем тип платильщика $payerType = false; if (isset($_REQUEST["recipient"]) and (($_REQUEST["recipient"] == "Юридическое лицо") or ($_REQUEST["recipient"] == "Розничный покупатель"))) { if ($_REQUEST["recipient"] == "Розничный покупатель") { $payerType = 1; } elseif ($_REQUEST["recipient"] == "Юридическое лицо") { $payerType = 2; } } if ($payerType === false) {// Если не передана информация о типе платильщика $JSONResults->status = -3; $JSONResults->msg = "Не выбран тип платильщика"; echo json_encode($JSONResults); exit; } // Адрес доставки $deliveryAddress = false; if (isset($_REQUEST["city"]) and isset($_REQUEST["adress"]) and $_REQUEST["city"] and $_REQUEST["adress"]) { $deliveryAddress = $_REQUEST["city"] . " " . $_REQUEST["adress"]; } if ($deliveryAddress == false) { $JSONResults->status = -4; $JSONResults->msg = "Не передан адрес доставки"; echo json_encode($JSONResults); exit; } // Проверяем передан ли email if (!(isset($_REQUEST["email"]) and $_REQUEST["email"])) { $JSONResults->status = -5; $JSONResults->msg = "Поле E-mail обязательно для заполнения"; echo json_encode($JSONResults); exit; } // Проверяем корректен ли E-mail if (!preg_match("|^([a-z0-9_\.\-]{1,20})@([a-z0-9\.\-]{1,20})\.([a-z]{2,4})|is", strtolower($_REQUEST["email"]))) { $JSONResults->status = -6; $JSONResults->msg = "Поле E-mail заполнено не корректно."; echo json_encode($JSONResults); exit; } $payCard = false;//Флаг оплаты картой, если оплата производится картой равен true $payNP = false;// Флаг оплаты наложенным платежом if (isset($_REQUEST["pay"]) and (($_REQUEST["pay"] == 1) or ($_REQUEST["pay"] == 0))) { if ($_REQUEST["pay"] == 1) { $payCard = true; } elseif ($_REQUEST["pay"] == 0) { $payNP = true; } } $costOfDelivery = 0; if (isset($_REQUEST["costOfDelivery"]) and $_REQUEST["costOfDelivery"]) { $costOfDelivery = $_REQUEST["costOfDelivery"] * 1; } // Определение стоимости доставки $delivery = false; //$deliveryAddress = ""; $deliveryCost = 0; $deliveryTimeMin = 0; $deliveryTimeMax = 0; if (isset($_REQUEST["delivery"]) and $_REQUEST["delivery"] and isset($_REQUEST["adress"]) and $_REQUEST["adress"]) { require_once($_SERVER["DOCUMENT_ROOT"] . '/local/templates/main/phpscripts/myGetBasketData.php');//Подключаем класс для работы с корзиной $myGetBasketData = new myGetBasketData;//Создаём экземпляр объекта для работы с скидками $weight = $myGetBasketData->getWeight();// Определяем вес if ((strpos($_POST["delivery"],"СДЕК") !== false) and isset($_REQUEST["cityID"]) and $_REQUEST["cityID"] and ((($_REQUEST["cityID"] * 1) . "") == ($_REQUEST["cityID"] . "")) and isset($_REQUEST["city"]) and $_REQUEST["city"]) { $cityid = $_REQUEST["cityID"]; $delivery = 2; // $deliveryAddress = $_REQUEST["city"] . " " . $_REQUEST["adress"]; // Определяем стоимость доставки СДЭК require_once($_SERVER["DOCUMENT_ROOT"] . '/local/templates/main/phpscripts/cdekLib.php');//Подключаем класс для работы с СДЭК $cdekLib = new cdekLib;//Создаём экземпляр объекта для работы с СДЭК $obj = $cdekLib->calc($cityid,ceil($weight /1000)); if ($obj and isset($obj->result->price) and $obj->result->price and isset($obj->result->deliveryPeriodMin) and $obj->result->deliveryPeriodMin) { $deliveryCost = ceil($obj->result->price); $deliveryTimeMin = $obj->result->deliveryPeriodMin; } // Конец определения стоимости СДЭК } elseif ((strpos($_REQUEST["delivery"],"Почта") !== false) and isset($_REQUEST["city"]) and $_REQUEST["city"]) { $delivery = 3; // $deliveryAddress = $_REQUEST["city"] . " " . $_REQUEST["adress"]; // Определяем стоимость и время доставки через Почту России require_once($_SERVER["DOCUMENT_ROOT"] . '/local/templates/main/phpscripts/postRussianLib.php');// Подключаем библиотеку доставки почтой России // Настройки города из которого осуществляется посылка указываются в массиве ниже $postRussian = new postRussian(array( "fromCity"=>"Иваново", "fromCountry"=>"Россия", "fromRegion"=>"Ивановская", "fromNormalizedAddress"=>"г Иваново", "fromCityType"=>"г", "postalCodesFrom"=>array("153023","153027","153031"), "weight"=>$weight )); $text = $postRussian->getCost($_REQUEST["city"]); if (isset($text->data->costEntity->cost) and $text->data->costEntity->cost) { $cost = $text->data->costEntity->cost; if (isset($text->data->timeEntity->deliveryTimeRange) and $text->data->timeEntity->deliveryTimeRange) { $time = $text->data->timeEntity->deliveryTimeRange; $time = explode("–",$time); if (count($time) == 2) { $deliveryTimeMin = $time[0]; $maxtime = $time[1]; $deliveryCost = ceil($cost); $deliveryTimeMax = $mintime; } } } // Конце определения стоимости почтой России } } // Конец определения стоимости доставки if (isset($_REQUEST["agree"]) and ($_REQUEST["agree"] == "on")) {// Проверяем принято ли пользовательское соглашение if (CModule::IncludeModule("sale")) { // Допустим некоторые поля приходит в запросе $request = Context::getCurrent()->getRequest(); //$productId = $request["PRODUCT_ID"]; //$phone = $request["PHONE"]; //$name = $request["NAME"]; //$comment = $request["COMMENT"]; $productId = 1; //$phone = "79065140012"; //$name = "тестовое имя"; $comment = ""; if (isset($_REQUEST["comment"]) and $_REQUEST["comment"]) { $comment = $_REQUEST["comment"]; } $siteId = Context::getCurrent()->getSite(); $currencyCode = CurrencyManager::getBaseCurrency(); // Если пользователь не авторизован определяем к какому пользователю привязывать заказ или создаём нового пользователя $sendPass = false;// если требуется отправить письмо с паролем от личного кабинета $sendPasslogin = ""; $sendPassPassword = ""; $sendPassEmail = ""; $userIdTpm = false; if (!$USER->GetID() and isset($_REQUEST["email"]) and $_REQUEST["email"]) { $emailToCheckUser = $_REQUEST["email"]; // Сначала пробуем определить пользователя по полю EMAIL $filter = Array("EMAIL"=>$emailToCheckUser); $order = array('sort' => 'asc'); $tmp = 'sort'; //Выполняем запрос и обрабатываем результаты $dbUsers = CUser::GetList($order, $tmp, $filter,array()); while ($arUser = $dbUsers->Fetch()) { if (!$userIdTpm) { $userIdTpm = $arUser["ID"]; } } // Если по EMAIL не удалось найти пробуем найти по логин if (!$userIdTpm) { $filter = Array("LOGIN"=>$emailToCheckUser); $order = array('sort' => 'asc'); $tmp = 'sort'; //Выполняем запрос и обрабатываем результаты $dbUsers = CUser::GetList($order, $tmp, $filter,array()); while ($arUser = $dbUsers->Fetch()) { if (!$userIdTpm) { $userIdTpm = $arUser["ID"]; } } } // Если пользователь не был найден генерируем нового if (!$userIdTpm) { $passwordToReg = randString(10, array("abcdefghijklnmopqrstuvwxyz","ABCDEFGHIJKLNMOPQRSTUVWXYZ","0123456789","!@#\$%^&*()"));// Генерирует пароль $arFields = Array( "EMAIL"=>$emailToCheckUser, "LOGIN"=>$emailToCheckUser, "ACTIVE"=>"Y",//Делаем пользователя активным "PASSWORD"=>$passwordToReg, "CONFIRM_PASSWORD"=>$passwordToReg, ); $userIdTpm = $USER->Add($arFields);// Добавляем пользователя в битрикс и получаем его Id if ($userIdTpm) { $sendPass = true;// Отправить уведомление на почту // данные для отправки на почту $sendPassPassword = $passwordToReg; $sendPasslogin = $emailToCheckUser; $sendPassEmail = $emailToCheckUser; } } } // Если $userIdTpm остаётся false присваиваем админа if ($userIdTpm === false) { $userIdTpm = 1; } // Конец проверки куда привязывать заказ // Создаёт новый заказ $order = Order::create($siteId, $USER->isAuthorized() ? $USER->GetID() : $userIdTpm); $order->setPersonTypeId($payerType);// Устанавливаем тип платильщика (Физическое лицо 1 или 3- юридическое лицо.) $order->setField('CURRENCY', $currencyCode); // Устанавливаем комментарий из формы если требуется if ($comment) { $order->setField('USER_DESCRIPTION', $comment); // Устанавливаем поля комментария покупателя } // Устанавливаем прочие данные из формы $propertyCollection = $order->getPropertyCollection(); // Телефон if (isset($_REQUEST["phone"]) and $_REQUEST["phone"]) { $phoneProperty2 = getPropertyByCode($propertyCollection, 'PHONE'); $phoneProperty2->setValue($_REQUEST["phone"]);// Устанавливаем телефон } // E-mail if (isset($_REQUEST["email"]) and $_REQUEST["email"]) { $emailProperty2 = getPropertyByCode($propertyCollection, 'EMAIL'); $emailProperty2->setValue($_REQUEST["email"]);// Устанавливаем e-mail } // Адрес доставки if ($deliveryAddress) { $addressProperty2 = getPropertyByCode($propertyCollection, 'ADDRESS'); $addressProperty2->setValue($deliveryAddress);// Устанавливаем адрес } // Если платильщик физическое лицо if ($payerType == 1) { // Имя if (isset($_REQUEST["name"]) and $_REQUEST["name"]) { $fioProperty2 = getPropertyByCode($propertyCollection, 'FIO'); $fioProperty2->setValue($_REQUEST["name"]);// Устанавливаем ФИО } } elseif ($payerType == 2) {// Если плательщик юридическое лицо // Название компании if (isset($_REQUEST["companyName"]) and $_REQUEST["companyName"]) { $cnameProperty2 = getPropertyByCode($propertyCollection, 'COMPANY'); $cnameProperty2->setValue($_REQUEST["companyName"]);// Устанавливаем название компании } // Имя платильщика юридического лица if (isset($_REQUEST["contName"]) and $_REQUEST["contName"]) { $cpersonurProperty2 = getPropertyByCode($propertyCollection, 'CONTACT_PERSON'); $cpersonurProperty2->setValue($_REQUEST["contName"]);// Устанавливаем название компании } // Имя платильщика юридического лица if (isset($_REQUEST["adressur"]) and $_REQUEST["adressur"]) { $companyadrProperty2 = getPropertyByCode($propertyCollection, 'COMPANY_ADR'); $companyadrProperty2->setValue($_REQUEST["adressur"]);// Устанавливаем название компании } // Город юридического лица if (isset($_REQUEST["cityur"]) and $_REQUEST["cityur"]) { $cityurProperty2 = getPropertyByCode($propertyCollection, 'CITY'); $cityurProperty2->setValue($_REQUEST["cityur"]);// Устанавливаем название компании } } // Создаём корзину с одним товаром //var_dump(CSaleBasket::GetBasketUserID()); //$basket = Basket::create($siteId); $basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(CSaleBasket::GetBasketUserID()), \Bitrix\Main\Context::getCurrent()->getSite()); //var_dump($basket->getId()); //var_dump(CSaleBasket::GetBasketUserID()); //var_dump($basket); //exit; $arBasketItems = array(); $dbBasketItems = CSaleBasket::GetList(//Выполняем запрос array("NAME" => "ASC","ID" => "ASC"), array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"), false, false, array("ID","MODULE","PRODUCT_ID","QUANTITY","CAN_BUY","PRICE")); // Проверяем не пустая ли сейчас корзина $checkYesItems = false; while ($arItems=$dbBasketItems->Fetch()) {// Просматриваем полученную информацию считаем общее количество и сумму $checkYesItems = true; // $arItems=CSaleBasket::GetByID($arItems["ID"]); } if ($checkYesItems === false) { $JSONResults->status = -2; $JSONResults->msg = "Нельзя оформить заказ с пустой корзиной"; } else { /* while ($arItems=$dbBasketItems->Fetch()) {// Просматриваем полученную информацию считаем общее количество и сумму $arItems=CSaleBasket::GetByID($arItems["ID"]); $item = $basket->createItem('catalog', $arItems["ID"]); $item->setFields(array( 'QUANTITY' => $arItems["QUANTITY"], 'CURRENCY' => $currencyCode, 'LID' => $siteId, 'PRODUCT_PROVIDER_CLASS' => '\CCatalogProductProvider', )); echo "!!"; var_dump($arItems["QUANTITY"]); var_dump($arItems["ID"]); } */ /* Первый кусок кода о ручном добавлении произвольного количества товара с произвольным id в корзину(в данном случаи 1 единица товара с Ид один) $item = $basket->createItem('catalog', 1); $item->setFields(array( 'QUANTITY' => 1, 'CURRENCY' => $currencyCode, 'LID' => $siteId, 'PRODUCT_PROVIDER_CLASS' => '\CCatalogProductProvider', )); */ /* $item2 = $basket->createItem('catalog', 2); $item2->setFields(array( 'QUANTITY' => 2, 'CURRENCY' => $currencyCode, 'LID' => $siteId, 'PRODUCT_PROVIDER_CLASS' => '\CCatalogProductProvider', )); */ $order->setBasket($basket); // Создаём одну отгрузку и устанавливаем способ доставки - "Без доставки" (он служебный) $shipmentCollection = $order->getShipmentCollection(); $shipment = $shipmentCollection->createItem(); // Создаём доставку для СДЭК по Id=2 для Почты России по Id=3 на выходе получаем просто массив $service if (($delivery == 2) or ($delivery == 3)) { $service = Delivery\Services\Manager::getById($delivery); $shipment->setFields(array( "DELIVERY_ID" => $service["ID"], "DELIVERY_NAME" => $service["NAME"], )); $shipment->setBasePriceDelivery($deliveryCost); } else {// Иначе создаём служебную доставку $service = Delivery\Services\Manager::getById(Delivery\Services\EmptyDeliveryService::getEmptyDeliveryServiceId()); $shipment->setFields(array( "DELIVERY_ID" => $service["ID"], "DELIVERY_NAME" => $service["NAME"], )); } //$service = Delivery\Services\Manager::getById(3);//Delivery\Services\EmptyDeliveryService::getEmptyDeliveryServiceId(3) //var_dump($service);exit; //$service["CONFIG"]["MAIN"]["PRICE"] = "1100.15"; //$service["CONFIG"]["MAIN"]["PERIOD"]["TO"] = "г.Фурманов, улица и квартира тут"; //$shipment->setFields(array( // 'DELIVERY_ID' => $service['ID'], // 'DELIVERY_NAME' => $service['NAME'], // 'CURRENCY' => "887.63" //)); //$shipment->setBasePriceDelivery(887.48);// Изменение стоимости доставки //var_dump($shipment->getFields());exit; //$shipment->setFields($service); //$collection->createItem($service); /* Второй кусок пода по ручному добавлению произвольного товара в приизвольном колличестве в корзину $shipmentItemCollection = $shipment->getShipmentItemCollection(); $shipmentItem = $shipmentItemCollection->createItem($item); $shipmentItem->setQuantity($item->getQuantity()); */ // Создание типа оплаты if ($payCard) {// Оплата картой $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->createItem(); $paySystemService = PaySystem\Manager::getObjectById(2);// Код оплаты банковской картой $payment->setFields(array( 'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"), 'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME") )); } elseif ($payNP) {// Оплата наложенным платедом $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->createItem(); $paySystemService = PaySystem\Manager::getObjectById(3);// Код оплаты наложенным платежом $payment->setFields(array( 'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"), 'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME") )); } // Конец создания типа оплаты // Создаём оплату со способом #1 /* $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->createItem(); $paySystemService = PaySystem\Manager::getObjectById(1); $payment->setFields(array( 'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"), 'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME"), )); */ // Устанавливаем свойства //$propertyCollection2 = $order->getPropertyCollection(); //$phone = $propertyCollection2->getPayerName(); //var_dump($phone); //exit; /* $propertyCollection = $order->getPropertyCollection(); $phoneProp = $propertyCollection->getPhone(); $phoneProp->setValue($phone); $nameProp = $propertyCollection->getPayerName(); $nameProp->setValue($name); */ require_once($_SERVER["DOCUMENT_ROOT"] . '/local/templates/main/phpscripts/myGetBasketData.php');//Подключаем класс для работы с корзиной $myGetBasketData = new myGetBasketData;//Создаём экземпляр объекта для работы с корзиной $cost = $myGetBasketData->getProductCostDiscontCeil();//Стоимость с учётом скидок // Если тип оплаты существует дополнительно указываем для него стоимость необходимую оплатить if (isset($payment) and $payment) {// Способ оплаты создавался выше, ниже только устанавливаем сумму оплаты равной сумме товаров с учётом скидок плюс сумма доставки $payment->setFields(array( 'SUM' => ($cost + $deliveryCost) )); } // Конец добавления стоимости к типу оплаты // Сохраняем $order->doFinalAction(true); $result = $order->save(); $orderId = $order->getId(); if ($orderId) { $JSONResults->orderId = $orderId; $JSONResults->orderAddTrue = "Заказ №$orderId успешно сформирован."; if ($sendPass) {// если требуется отправить на почту уведомление о создании личного кабинета $arEventFields = array( "TOEMAIL" => $sendPassEmail, "LOGIN" => $sendPasslogin, "PASSWORD" => $sendPassPassword ); $res = CEvent::Send("ADDNEWUSER", "s1", $arEventFields); $JSONResults->orderAddTrue .= "Информация для входа в личный кабинет отправлена на $sendPassEmail"; } } //var_dump($orderId); if ($orderId > 0) { // CSaleBasket::DeleteAll(CSaleBasket::GetBasketUserID()); } $JSONResults->status = 1; $JSONResults->msg = "Заказ успешно сформирован"; // При оплате Яндекс-кассой if ($payCard) { $client = new Client(); // Заменить данные на данные от реального магазина требуется в следующей строке $client->setAuth('54401', 'test_Fh8hUAVVBGUGbjmlzba6TB0iyUbos_lueTHE-axOwM0'); $idempotenceKey = uniqid('', true); // Ключ для COOKIE Якассы $cookiePlusKey = ""; $cookiePlusKey2 = explode(".",$idempotenceKey); if (count($cookiePlusKey2) == 2) { $cookiePlusKey = $cookiePlusKey2[1]; } unset($cookiePlusKey2); // Конце вычислений cookie ключа $response = $client->createPayment( array( "capture"=>true, "amount" => array( "value" => (($cost + $deliveryCost) . ""), "currency" => "RUB", ), "payment_method_data" => array( "type" => "bank_card", ), "confirmation" => array( "type" => "redirect", "return_url" => "https://artponline.aspired.ru/payment/?payid=$cookiePlusKey", ), "description" => "Заказ №$orderId", ), $idempotenceKey ); $confirmation_url = ""; $yaKassaPayId = ""; // Статус ответа Якассы не должен быть canceled, в этом случаи так же должен быть передан confirmation_url if(isset($response->status) and ($response->status != "canceled") and ($response->confirmation->confirmation_url)) { $confirmation_url = $response->confirmation->confirmation_url; } if (isset($response->payment_method->id) and $response->payment_method->id) { $yaKassaPayId = $response->payment_method->id; } if ($confirmation_url and $yaKassaPayId) { SetCookie("yaKa$cookiePlusKey",$yaKassaPayId,time()+432000,"/"); $JSONResults->confirmation_url = $confirmation_url; } } // Конце работы с яндекс кассой } } } else { $JSONResults->status = -1; $JSONResults->msg = "Необходимо принять пользовательское соглашение"; } echo json_encode($JSONResults);