Имя: Пароль:
1C
1С v8
интеграция с сдэк
0 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-объект серверу СДЭК


Хелп
1 lamme
 
05.04.18
16:04
те не могу понять
как отправить этот мой json запрос на один из скриптов сайта
что там надо и как правилньо ..
2 fedoss
 
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.Закрыть();
    
КонецФункции
3 fedoss
 
05.04.18
16:17
(2) + в данном случае HTTPМетод = "POST"
4 lamme
 
05.04.18
16:23
А ЧТО ТАКОЕ
HTTPМетод У ТЕБЯ?
5 lamme
 
05.04.18
16:23
о... пардон .. только увидел
6 lamme
 
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",Запрос, ИмяВременногоФайлаОтвета);
    Исключение
        Сообщить("Не удалось отправить запрос на получение себестоимости перевозки.");
        Возврат Неопределено;
    КонецПопытки;
7 lamme
 
05.04.18
16:26
ответ сервера
12 - Ошибка декодирования данных. Ожидается <json или jsop>
8 lamme
 
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"
        }
    ]
}
9 fedoss
 
05.04.18
16:29
Ну а зачем ему двоичные данные передавать? Передай строку JSON
10 lamme
 
05.04.18
16:34
Запрос.УстановитьТелоИзДвоичныхДанных( Новый ДвоичныЕДанные(имяТМП));

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

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


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

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

Тип: Строка.

Описание:

Завершает запись текста JSON. Если производилась запись в файл, то файл закрывается. Если производилась запись в строку, то результирующая строка будет получена в качестве возвращаемого значения метода. Если производилась запись в файл, то метод вернет пустую строку.
15 lamme
 
05.04.18
16:38
Запрос.УстановитьТелоИзСтроки(ЗаписьJSON);
16 lamme
 
05.04.18
16:38
(14)
ааа
17 lamme
 
05.04.18
16:39
а что тогда в
СтруктураВJson(Объект)
является Объект  ?
18 fedoss
 
05.04.18
16:42
Структура параметров
19 lamme
 
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(СтруктураОбщихПараметров));
20 lamme
 
05.04.18
16:45
те
https://clip2net.com/s/3TekDBX

в СтруктураВJson(СтруктураОбщихПараметров) - идет строка.
которая уходит на сайт.
а в ответ все то же
21 fedoss
 
05.04.18
16:56
Попробуй запрос сделать к
http://api.edostavka.ru/calculator/calculate_price_by_json.php
с Content-Type: application/json
22 g00d
 
05.04.18
16:57
Делали такое для утшки, придется помучиться с их справочниками :)
23 lamme
 
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",Запрос, ИмяВременногоФайлаОтвета);
    Исключение
        Сообщить("Не удалось отправить запрос на получение себестоимости перевозки.");
        Возврат Неопределено;
    КонецПопытки;


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

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

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

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