Загрузка заказов по API в Logsis

Каркасная обработка для загрузки заказов по 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) Конфигурация самописная

2 Comments

  1. Константин С.
    Поднимаем Apache + PHP или Nginx + PHP на локальной машине и пробуем отправить заказы:

    воо заморочки, как-то не клиентооринтировано чтобы настроить обмен.

    Reply
  2. astracrypt

    (1) Лекгий путь — это не наш метод. :))

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *