Каркасная обработка для загрузки заказов по API в Логсис. Предназначена для магазинов, которым нужна курьерская доставка по городу Москва.
Для работы обработки нужен шлюз для передачи параметров через PHP скрипт
Следующего содержания в папке logsys/index.php:
<?php //phpinfo(); $str_input = file_get_contents('php://input'); // Получить строку из отправленных данных //echo $str_input; // Вывод в браузер $arr_input = json_decode($str_input,true); // Преобразуем в массив //print_r($arr_input); // Вывод в браузер $post_array = array(); foreach($arr_input as $key=>$val) { if ($key=='goods') { foreach($val as $key2=>$val2) { foreach($val2 as $key3=>$val3) { $post_array['goods['.$key2.']['.$key3.']']=$val3; } } } else { $post_array[$key] = $val; } } //print_r($post_array); // set post fields $ch = curl_init('http://cab.logsis.ru/apiv2/createorder'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_array); // execute! $response = curl_exec($ch); // close the connection, release resources used curl_close($ch); // do anything you want with your response echo $response;
И еще один скрипт в папке logsys2/index.php:
<?php //phpinfo(); $str_input = file_get_contents('php://input'); // Получить строку из отправленных данных //echo $str_input; // Вывод в браузер $arr_input = json_decode($str_input,true); // Преобразуем в массив //print_r($arr_input); // Вывод в браузер $post_array = array(); foreach($arr_input as $key=>$val) { $post_array[$key] = $val; } //print_r($post_array); // set post fields $ch = curl_init('http://cab.logsis.ru/apiv2/confirmorder'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_array); // execute! $response = curl_exec($ch); // close the connection, release resources used curl_close($ch); // do anything you want with your response echo $response;
Поднимаем Apache + PHP или Nginx + PHP на локальной машине и пробуем отправить заказы:
Функция ПодтвердитьЗаказВЛОГСИС(НомерДокументаЗаказа,НомерЗаказаЛогсис) Экспорт СтруктураПараметровЗаказа = Новый Структура; СтруктураПараметровЗаказа.Вставить("key",ПолучитьПараметрыИдентификации()); СтруктураПараметровЗаказа.Вставить("inner_n",СокрЛП(НомерДокументаЗаказа)); // Внутренний номер отправителя СтруктураПараметровЗаказа.Вставить("order_id",СокрЛП(НомерЗаказаЛогсис)); // Внутренний номер отправителя ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(,Символы.Таб)); ЗаписатьJSON(ЗаписьJSON,СтруктураПараметровЗаказа); СтрокаJSON = ЗаписьJSON.Закрыть(); //СтрокаВозврат = Сообщить(СтрокаJSON); HTTPСоединение = Новый HTTPСоединение("127.0.0.1"); HTTPЗапрос = Новый HTTPЗапрос("/logsys2/"); HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json"); HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос); ОтветСтрока = Ответ.ПолучитьТелоКакСтроку("UTF-8"); Сообщить("Код результата: " + Ответ.КодСостояния); Сообщить("Ответ: " + ОтветСтрока); ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(ОтветСтрока); ИмяСвойства = ""; НетОшибкаЧтенияJSON = Ложь; Пока ЧтениеJSON.Прочитать() Цикл ТипJSON = ЧтениеJSON.ТипТекущегоЗначения; Если ТипJSON = ТипЗначенияJSON.Строка Тогда Значение = ЧтениеJSON.ТекущееЗначение; Если ИмяСвойства = "status" Тогда Сообщить("status "+СокрЛП(Значение)); Если СокрЛП(Значение) = "400" Тогда НетОшибкаЧтенияJSON = Истина; ИначеЕсли СокрЛП(Значение) = "200" Тогда НетОшибкаЧтенияJSON = Истина; КонецЕсли; КонецЕсли; ИначеЕсли ТипJSON = ТипЗначенияJSON.ИмяСвойства Тогда ИмяСвойства = ЧтениеJSON.ТекущееЗначение; КонецЕсли; КонецЦикла; Возврат НетОшибкаЧтенияJSON; КонецФункции Функция ОтправитьЗаказыВLogsys(ДокументЗаказа,НомерЗаказаЛогсис = "") Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Заказ.Номер КАК НомерЗаказа, | Заказ.Дата КАК ДатаЗаказа, | Заказ.Адрес КАК АдресДоставки, | Заказ.Вес КАК ВесЗаказа, | Заказ.ГабаритВысота, | Заказ.ГабаритДлина, | Заказ.ГабаритШирина, | Заказ.ФИОКонтактногоЛица КАК Получатель, | Заказ.Телефон КАК НомерТелефона, | Заказ.ПолучитьСКлиента КАК СуммаКПолучению, | Заказ.ЭлектроннаяПочта КАК EMailПолучателя, | Заказ.СтраховаяСумма КАК СтраховаяСумма, | Заказ.КоличествоМест, | Заказ.Ссылка КАК Док, | Заказ.НомерСкладской |ИЗ | Документ.Заказ КАК Заказ |ГДЕ | Заказ.Ссылка = &ДокументОтгрузки"; Запрос.УстановитьПараметр("ДокументОтгрузки", ДокументЗаказа); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат Ложь; КонецЕсли; ВыборкаЗаказы = Результат.Выбрать(); СтруктураПараметровЗаказа = Новый Структура; СтруктураПараметровЗаказа.Вставить("key",ПолучитьПараметрыИдентификации()); Пока ВыборкаЗаказы.Следующий() Цикл СтруктураПараметровЗаказа.Вставить("inner_n",СокрЛП(ВыборкаЗаказы.НомерЗаказа)); // Внутренний номер отправителя СтруктураПараметровЗаказа.Вставить("delivery_date",Формат(ВыборкаЗаказы.ДатаЗаказа,"ДФ=yyyy-MM-dd")); // Дата доставки (YYYY-mm-dd) СтруктураПараметровЗаказа.Вставить("delivery_time1",Формат(ВыборкаЗаказы.ДатаЗаказа,"ДФ=hh:mm")); // Начальное время интервала доставки (min 10:00 ) СтруктураПараметровЗаказа.Вставить("delivery_time2","22:00"); // Конечное время интервала доставки( max 22:00 ) СтруктураПараметровЗаказа.Вставить("target_name",СокрЛП(ВыборкаЗаказы.Получатель)); // Получатель СтруктураПараметровЗаказа.Вставить("target_contacts",ПреобразоватьСтрокуВЧисло(ВыборкаЗаказы.НомерТелефона)); // Телефон получателя 7хххххххххх СтруктураПараметровЗаказа.Вставить("os",Формат(ВыборкаЗаказы.СтраховаяСумма,"ЧДЦ=2; ЧРД=.; ЧГ=")); // Оценочная стоимость заказа СтруктураПараметровЗаказа.Вставить("np","0"); // Услуга 'Прием наложенного платежа' (1 - да, иначе - 0) СтруктураПараметровЗаказа.Вставить("price_client","0"); // Величина наложенного платежа, руб СтруктураПараметровЗаказа.Вставить("price_client_delivery",Формат(ВыборкаЗаказы.СуммаКПолучению,"ЧДЦ=2; ЧРД=.; ЧГ=")); // Стоимость доставки для конечного получателя СтруктураПараметровЗаказа.Вставить("order_weight",Формат(ВыборкаЗаказы.ВесЗаказа,"ЧРД=.; ЧГ=")); // Вес отправления, кг СтруктураПараметровЗаказа.Вставить("places_count",Формат(ВыборкаЗаказы.КоличествоМест,"ЧРД=.; ЧГ=")); // Количество мест в заказе. СтруктураПараметровЗаказа.Вставить("dimension_side1",Формат(ВыборкаЗаказы.ГабаритВысота*100,"ЧРД=.; ЧГ=")); // Габарит заказа 1, см СтруктураПараметровЗаказа.Вставить("dimension_side2",Формат(ВыборкаЗаказы.ГабаритДлина*100,"ЧРД=.; ЧГ=")); // Габарит заказа 2, см СтруктураПараметровЗаказа.Вставить("dimension_side3",Формат(ВыборкаЗаказы.ГабаритШирина*100,"ЧРД=.; ЧГ=")); // Габарит заказа 3, см СтруктураПараметровЗаказа.Вставить("addr",СокрЛП(ВыборкаЗаказы.АдресДоставки)); // Адрес доставки СтруктураПараметровЗаказа.Вставить("sms","0"); // Признак услуги sms-информирования. Значения: 0 - нет, 1 - да СтруктураПараметровЗаказа.Вставить("open_option","3"); // Признак возможности вскрытия заказа. Возможные значения: 1 - Вскрытие разрешено, 2 - Разрешено вскрытие только внешней упаковки, 3 - Вскрытие запрещено СтруктураПараметровЗаказа.Вставить("call_option","0"); // Дополнительный (тарифицируемый) звонок клиенту. Значения: 0 - нет, 1 - да СтруктураПараметровЗаказа.Вставить("docs_option","0"); // Возврат накладных / документов, вложенных в заказ (опция тарифицируется). Значения: 0 - нет, 1 - да СтруктураПараметровЗаказа.Вставить("partial_option","1"); // Признак возможности частичного выкупа заказа клиентом (не тарифицируется). Значения: 0 - нет, 1 - да СтруктураПараметровЗаказа.Вставить("dress_fitting_option","0"); // Признак возможности примерки товаров (тарифицируется согласно договору). Значения: 0 - нет, 1 - да СтруктураПараметровЗаказа.Вставить("lifting_option","0"); // Занос / подъем КГТ заказов (более 25 кг) до квартиры (тарифицируется согласно договору). Значения: 0 - нет, 1 - да СтруктураПараметровЗаказа.Вставить("city","Москва"); СтруктураПараметровЗаказа.Вставить("shk",СокрЛП(ВыборкаЗаказы.НомерСкладской)); МассивТоваров = Новый Массив; ЗаказДокО = ВыборкаЗаказы.Док.ПолучитьОбъект(); Для Каждого СтрТовары Из ЗаказДокО.Товары Цикл СтруктураСтрокиЗаказа = Новый Структура; Если СтрТовары.Товар.Пустая() Тогда Продолжить; КонецЕсли; СтруктураСтрокиЗаказа.Вставить("articul",СокрЛП(СтрТовары.Товар.АртикулПартнера));// Артикул товарной позиции / услуги СтруктураСтрокиЗаказа.Вставить("artname",СокрЛП(СтрТовары.Товар.Наименование));// Название товарной позиции / услуги СтруктураСтрокиЗаказа.Вставить("count",Формат(СтрТовары.Количество,"ЧРД=.; ЧГ="));// Название товарной позиции / услуги СтруктураСтрокиЗаказа.Вставить("weight",Формат(СтрТовары.ВесТовара,"ЧРД=.; ЧГ="));// Вес единицы товара, кг СтруктураСтрокиЗаказа.Вставить("price",Формат(СтрТовары.Цена,"ЧДЦ=2; ЧРД=.; ЧГ="));// Цена единицы товара, руб СтруктураСтрокиЗаказа.Вставить("nds",ПолучитьКодСтавкиНДС(СтрТовары.Товар.СтавкаНДС));// Вид налога на товар/услугу (передавать Int): 1 - HДС 18%, 2 - Без HДС, 3 - HДС 10%, 4 - HДС 18/118, 5 - HДС 10/110, 6 - НДС 0% МассивТоваров.Добавить(СтруктураСтрокиЗаказа); КонецЦикла; СтруктураПараметровЗаказа.Вставить("goods",МассивТоваров); КонецЦикла; ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(,Символы.Таб)); ЗаписатьJSON(ЗаписьJSON,СтруктураПараметровЗаказа); СтрокаJSON = ЗаписьJSON.Закрыть(); Сообщить(СтрокаJSON); HTTPСоединение = Новый HTTPСоединение("127.0.0.1"); HTTPЗапрос = Новый HTTPЗапрос("/logsys/"); HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json"); HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос); ОтветСтрока = Ответ.ПолучитьТелоКакСтроку("UTF-8"); Сообщить("Код результата: " + Ответ.КодСостояния); Сообщить("Ответ: " + ОтветСтрока); ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(ОтветСтрока); ИмяСвойства = ""; НетОшибкаЧтенияJSON = Ложь; Пока ЧтениеJSON.Прочитать() Цикл ТипJSON = ЧтениеJSON.ТипТекущегоЗначения; Если ТипJSON = ТипЗначенияJSON.Строка Тогда Значение = ЧтениеJSON.ТекущееЗначение; Если ИмяСвойства = "status" Тогда НетОшибкаЧтенияJSON = Истина; ИначеЕсли ИмяСвойства = "order_id" Тогда НомерЗаказаЛогсис = Значение; КонецЕсли; ИначеЕсли ТипJSON = ТипЗначенияJSON.ИмяСвойства Тогда ИмяСвойства = ЧтениеJSON.ТекущееЗначение; КонецЕсли; КонецЦикла; Возврат НетОшибкаЧтенияJSON; КонецФункции
Тестировалось на платформе: 1С:Предприятие 8.3 (8.3.10.2561) Конфигурация самописная
воо заморочки, как-то не клиентооринтировано чтобы настроить обмен.
(1) Лекгий путь — это не наш метод. :))