Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

интеграция с сдэк

интеграция с сдэк
Я
   lamme
 
05.04.18 - 16:03
связываю 1С8 и сдэк
у них есть описание протокола https://www.cdek.ru/clients/integrator.html

споткнулся на cdek_calculator
те на расчете стоимости доставки груза из города А в город Б


Из описание протокола:
"Расчёт стоимости доставки СДЭК

Для получения стоимости и сроков доставки нужно отправить json-объект серверу СДЭК по адресу:
http://api.cdek.ru/calculator/calculate_price_by_json.php — для отправки Content-Type: application/json
http://api.cdek.ru/calculator/calculate_price_by_jsonp.php — для отправки dataType : "jsonp" (из js)
http://api.cdek.ru/calculator/calculate_price_by_json_request.php — для отправки Content-Type: application/x-www-form-urlencoded

При передаче json-объекта в заголовке нужно указать соответствующий Content-Type.


Основной сервер для запросов: http://api.cdek.ru
Сервер для запросов при защищенном соединении: https://api.cdek.ru
"
Сам файл запрос формата json  сделал.

а вот с отправкой  беда ..

------------------

код


...
имяТМП =  ПолучитьИмяВременногоФайла("json"); // тут запрос в json

ЗаписьJSON = Новый ЗаписьJSON;
                ЗаписьJSON.ОткрытьФайл(имяТМП, , , Новый ПараметрыЗаписиJSON ( , Символы.Таб) ) ;

...
// записали.
// пробуем приконнектиться и отправить
//



ТекстЗапроса = Новый ТекстовыйДокумент;
    ТекстЗапроса.Прочитать(имяТМП);
    Текст = ТекстЗапроса.ПолучитьТекст();

    
                
                
                
                
                
                
                
    Попытка
        ssl = Новый ЗащищенноеСоединениеOpenSSL();
        Соединение = Новый HTTPСоединение("api.cdek.ru",,,,,,ssl);
    Исключение
        Сообщить("Не удалось соединиться с сервером api.cdek.ru:11443.");
        Возврат Неопределено ;
    КонецПопытки;

    ////Основной сервер для запросов: http://api.cdek.ru
    
    
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
    ИмяВременногоФайлаОтвета = ПолучитьИмяВременногоФайла("json");
    //
    Запрос = Новый HTTPЗапрос("/calculator/calculate_price_by_json_request.php", Заголовки);
    Запрос.УстановитьТелоИзСтроки("xml_request="+Текст,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);


    Попытка
        Соединение.ОтправитьДляОбработки(Запрос, ИмяВременногоФайлаОтвета);
    Исключение
        Сообщить("Не удалось отправить запрос на получение себестоимости перевозки.");
        Возврат Неопределено;
    КонецПопытки;




// в ответ приход json в виде полной хрени

{"error":[{"code":12,"text":"\u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f json"}]}

/// те как бы отправка запроса идет не верно



вот как бы скорее всего тут ошибка
Запрос.УстановитьТелоИзСтроки("xml_request="+Текст,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

но как правильно - не понятно.
смущает так же и вот это из описания

Для получения стоимости и сроков доставки нужно отправить json-объект серверу СДЭК


Хелп
 
 
   lamme
 
1 - 05.04.18 - 16:04
те не могу понять
как отправить этот мой json запрос на один из скриптов сайта
что там надо и как правилньо ..
   fedoss
 
2 - 05.04.18 - 16:15
с Яндексом у меня так работает:

    Запрос = Новый HTTPЗапрос(ПараметрыСоединения.ПутьНаСервере);
    Если ТипЗнч(ПараметрыЗапроса) = Тип("Структура") Тогда
        Запрос.Заголовки.Вставить("Content-Type", "application/javascript");
        Запрос.УстановитьТелоИзСтроки(СтруктураВJson(ПараметрыЗапроса));
    ИначеЕсли ТипЗнч(ПараметрыЗапроса) = Тип("ДвоичныеДанные") Тогда
        Запрос.Заголовки.Вставить("Content-Type", "application/octet-stream");
        Запрос.УстановитьТелоИзДвоичныхДанных(ПараметрыЗапроса);
    КонецЕсли;
    Если ЗначениеЗаполнено(Заголовки) Тогда
        Для Каждого Заголовок Из Заголовки Цикл
            Запрос.Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
        КонецЦикла;
    КонецЕсли;
        
    Ответ = Соединение.ВызватьHTTPМетод(HTTPМетод, Запрос);



Функция СтруктураВJson(Объект) Экспорт 
    НастройкиСериализации = Новый НастройкиСериализацииJSON();
    НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
    НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Объект, НастройкиСериализации);
    
    Возврат ЗаписьJSON.Закрыть();
    
КонецФункции
   fedoss
 
3 - 05.04.18 - 16:17
(2) + в данном случае HTTPМетод = "POST"
   lamme
 
4 - 05.04.18 - 16:23
А ЧТО ТАКОЕ
HTTPМетод У ТЕБЯ?
   lamme
 
5 - 05.04.18 - 16:23
о... пардон .. только увидел
   lamme
 
6 - 05.04.18 - 16:26
Попытка

        ssl = Новый ЗащищенноеСоединениеOpenSSL();
        Соединение = Новый HTTPСоединение("api.cdek.ru",,,,,,ssl);
    Исключение
        Сообщить("Не удалось соединиться с сервером api.cdek.ru:11443.");
        Возврат Неопределено ;
    КонецПопытки;

    ////Основной сервер для запросов: http://api.cdek.ru
    
    
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
    Запрос = Новый HTTPЗапрос("/calculator/calculate_price_by_json_request.php", Заголовки);
    
    Запрос.УстановитьТелоИзДвоичныхДанных( Новый ДвоичныЕДанные(имяТМП));
    ИмяВременногоФайлаОтвета = ПолучитьИмяВременногоФайла("json");

    Попытка
        Соединение.ВызватьHTTPМетод("POST",Запрос, ИмяВременногоФайлаОтвета);
    Исключение
        Сообщить("Не удалось отправить запрос на получение себестоимости перевозки.");
        Возврат Неопределено;
    КонецПопытки;
   lamme
 
7 - 05.04.18 - 16:26
ответ сервера
12 - Ошибка декодирования данных. Ожидается <json или jsop>
   lamme
 
8 - 05.04.18 - 16:28
json от меня такой

{
    "version": "1.0",
    "authLogin": "ххх",
    "secure": "ххх",
    "dateExecute": "2018-04-05",
    "senderCityId": "47409",
    "receiverCityId": "270",
    "tariffId": "136",
    "goods": [
        {
            "weight": "9",
            "volume": "0.01"
        }
    ]
}
   fedoss
 
9 - 05.04.18 - 16:29
Ну а зачем ему двоичные данные передавать? Передай строку JSON
   lamme
 
10 - 05.04.18 - 16:34
Запрос.УстановитьТелоИзДвоичныхДанных( Новый ДвоичныЕДанные(имяТМП));

в хелпе по УстановитьТелоИзДвоичныхДанных - идет параметр как двоичныеданные
 
 Рекламное место пустует
   lamme
 
11 - 05.04.18 - 16:34
сделать в смысле

имяТМП =  ПолучитьИмяВременногоФайла("json");
                ЗаписьJSON = Новый ЗаписьJSON; 
                ЗаписьJSON.ОткрытьФайл(имяТМП, , , Новый ПараметрыЗаписиJSON ( , Символы.Таб) ) ;
                Попытка
                    ЗаписатьJSON(ЗаписьJSON, СтруктураОбщихПараметров); 
                    ЗаписьJSON.Закрыть();
                исключение
                    сообщить (ОписаниеОшибки());
                конецпопытки;


Запрос.УстановитьТелоИзДвоичныхДанных( ЗаписьJSON);

?
   fedoss
 
12 - 05.04.18 - 16:36
Запрос.УстановитьТелоИзСтроки(СтруктураВJson(ПараметрыЗапроса));
   lamme
 
13 - 05.04.18 - 16:36
{Форма.Форма.Форма(282)}: Ошибка при вызове метода контекста (УстановитьТелоИзДвоичныхДанных)
    Запрос.УстановитьТелоИзДвоичныхДанных( ЗаписьJSON);
по причине:
Несоответствие типов (параметр номер '1')
   fedoss
 
14 - 05.04.18 - 16:38
ЗаписьJSON.Закрыть()
Возвращаемое значение:

Тип: Строка.

Описание:

Завершает запись текста JSON. Если производилась запись в файл, то файл закрывается. Если производилась запись в строку, то результирующая строка будет получена в качестве возвращаемого значения метода. Если производилась запись в файл, то метод вернет пустую строку.
   lamme
 
15 - 05.04.18 - 16:38
Запрос.УстановитьТелоИзСтроки(ЗаписьJSON);
   lamme
 
16 - 05.04.18 - 16:38
(14)
ааа
   lamme
 
17 - 05.04.18 - 16:39
а что тогда в 
 СтруктураВJson(Объект)
является Объект  ?
   fedoss
 
18 - 05.04.18 - 16:42
Структура параметров
   lamme
 
19 - 05.04.18 - 16:43
да .. уже примерно понял.

тогда вот что по коду


СтруктураОбщихПараметров = новый Структура();
    СтруктураОбщихПараметров.Вставить("version",Сокрлп("1.0"));
    СтруктураОбщихПараметров.Вставить("authLogin",Сокрлп(Логин));

.... // еще какие то параметры //

Попытка
        ssl = Новый ЗащищенноеСоединениеOpenSSL();
        Соединение = Новый HTTPСоединение("api.cdek.ru",,,,,,ssl);
    Исключение
        Сообщить("Не удалось соединиться с сервером api.cdek.ru:11443.");
        Возврат Неопределено ;
    КонецПопытки;

    ////Основной сервер для запросов: http://api.cdek.ru
    
    
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
    Запрос = Новый HTTPЗапрос("/calculator/calculate_price_by_json_request.php", Заголовки);
    
    ///Запрос.УстановитьТелоИзДвоичныхДанных( ЗаписьJSON);
    Запрос.УстановитьТелоИзСтроки(СтруктураВJson(СтруктураОбщихПараметров));
   lamme
 
20 - 05.04.18 - 16:45
те
https://clip2net.com/s/3TekDBX

в СтруктураВJson(СтруктураОбщихПараметров) - идет строка.
которая уходит на сайт.
а в ответ все то же
   fedoss
 
21 - 05.04.18 - 16:56
Попробуй запрос сделать к 
http://api.edostavka.ru/calculator/calculate_price_by_json.php
с Content-Type: application/json
   g00d
 
22 - 05.04.18 - 16:57
Делали такое для утшки, придется помучиться с их справочниками :)
   lamme
 
23 - 05.04.18 - 17:02
Попытка

        ssl = Новый ЗащищенноеСоединениеOpenSSL();
        Соединение = Новый HTTPСоединение("api.edostavka.ru",,,,,,ssl);
    Исключение
        Сообщить("Не удалось соединиться с сервером api.cdek.ru:11443.");
        Возврат Неопределено ;
    КонецПопытки;

    ////Основной сервер для запросов: http://api.cdek.ru
    
    
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Content-Type", "application/json");
    Запрос = Новый HTTPЗапрос("/calculator/calculate_price_by_json.php", Заголовки);
    
    ///Запрос.УстановитьТелоИзДвоичныхДанных( ЗаписьJSON);
    Запрос.УстановитьТелоИзСтроки(СтруктураВJson(СтруктураОбщихПараметров));
    
    ИмяВременногоФайлаОтвета = ПолучитьИмяВременногоФайла("json");

    Попытка
        Соединение .ВызватьHTTPМетод("POST",Запрос, ИмяВременногоФайлаОтвета);
    Исключение
        Сообщить("Не удалось отправить запрос на получение себестоимости перевозки.");
        Возврат Неопределено;
    КонецПопытки;


не помогло (
   lamme
 
24 - 05.04.18 - 17:03
он возвращает вроде все тож самое 
что и если в браузер вставить
http://api.edostavka.ru/calculator/calculate_price_by_json.php
   lamme
 
25 - 05.04.18 - 17:07
(22)
уже мучаемся ...
глюк- отправляю им заказ на доставку
а в нем должна быть указана сумма доставки
при этому = сумму доставки надо рассчитать заранее.

те сначала рассчитываем сумму
потом отпаврялем заказ на сайт сидэка - с теми же самыми параметрами, что и для расчета стоимости доставки ..

два раза - одно и тоже
   fedoss
 
26 - 05.04.18 - 17:57
(24)хз, у меня запрос на http://api.edostavka.ru/calculator/calculate_price_by_json.php отправляется нормально.

{
"error": [
{
"code": 7,
"text": "Не задан город-отправитель"
},
{
"code": 8,
"text": "Не задан город-получатель"
},
{
"code": 5,
"text": "Не задано ни одного места для отправления"
},
{
"code": 6,
"text": "Не задан тариф или список тарифов"
}
]
}
   lamme
 
27 - 05.04.18 - 22:32
(26)
если не сложно, поделись кодом - как сделал отправку данных
   fedoss
 
28 - 06.04.18 - 15:02
Да я просто в свою обработку подставил:
URL = "http://api.edostavka.ru/calculator/calculate_price_by_json.php";;
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("version", "1.0");

Дальше мой код из (2)
   fedoss
 
29 - 06.04.18 - 15:05
+ В заголовках запроса Content-Type: "application/json; charset=utf-8"


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует