Имя: Пароль:
1C
1С v8
REST POST JSON запрос к СберМегаМаркет "Unexpected token Т in JSON at position 0"
,
0 espanol
 
29.11.21
07:56
Пытаюсь синтегрироваться с этой платформой, с кучей платформ уже синтегрировался, все отрабатывают кроме этой, при интеграции выдает код 200 и текст

"{"success":0,"error":{"errorText":"Unexpected token Т in JSON at position 0","errorCode":"SyntaxError"}}"

Что за ошибка? Как ее обойти?


Я строго следовал всех им инструкция, и авторизация по токену, и пост запрос с джейсоном, и все все все....
Как я только не крутил не вертел, ничего не получается, код прикладываю:

Функция ПолучитьЯрлыкЗаказа()
    
    ИсходящиеДанные = Новый Структура();
    ИсходящиеДанные.Вставить("ЕстьОшибка", Ложь);
    ИсходящиеДанные.Вставить("ДвоичныеДанные", "");
    АдресРесурса   = ПолучитьАдресСервера();
    АдресРесурса   = АдресРесурса + "order/shipping";
    ЗаголовокHTTP  = ПолучитьЗаголовки();
    Параметры      = ОбщегоНазначенияКлиентСервер.СтруктураURI(АдресРесурса);
    HTTPСоединение = Новый HTTPСоединение(Параметры.Хост,443,,,,600,Новый ЗащищенноеСоединениеOpenSSL);
    HTTPЗапрос     = Новый HTTPЗапрос(Параметры.ПутьНаСервере, ЗаголовокHTTP);
    JSON = ДанныеОтправкиПоАПИ();
    ФайлРезультата = ПолучитьИмяВременногоФайла();
    
    ФайлЗапроса = ПолучитьИмяВременногоФайла();
    ТекстовыйФайл = Новый ТекстовыйДокумент;
    ТекстовыйФайл.УстановитьТекст(JSON.СтрокаJSON);
    ТекстовыйФайл.Записать(ФайлЗапроса, КодировкаТекста.UTF8);
    
    HTTPЗапрос.УстановитьТелоИзСтроки(ТекстовыйФайл);
    
    Попытка
        Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос, ФайлРезультата);
        Если Ответ.КодСостояния = 200 Тогда
            СтрокаОтвет = Ответ.ПолучитьТелоКакСтроку();
            
            Ответ       = Новый ТекстовыйДокумент();
            Ответ.Прочитать(ФайлРезультата, КодировкаТекста.UTF8);
            ТекстОтвета = Ответ.ПолучитьТекст();
            УдалитьФайлы(ФайлЗапроса);
            УдалитьФайлы(ФайлРезультата);
            
            Сообщить(ТекстОтвета);
            Если Найти(НРег(ТекстОтвета), "error") = 0 Тогда
                ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
                ИсходящиеДанные.Вставить("ДвоичныеДанные", ДвоичныеДанные);
            Иначе
                ТекстОшибки = "Не удалось получить ярлык заказа!";
                МассивОшибок.Добавить(ТекстОшибки);
                ИсходящиеДанные.Вставить("ЕстьОшибка", Истина);
            КонецЕсли;
            
        Иначе
            ИсходящиеДанные.Вставить("ЕстьОшибка", Истина);
            ТекстОшибки = "Сбой подключения!" + Символы.ПС + "Код ответа: " + Формат(Ответ.КодСостояния, "ЧРГ=' '; ЧН=0; ЧГ=0");
            МассивОшибок.Добавить(ТекстОшибки);
        КонецЕсли;
    Исключение
        ИсходящиеДанные.Вставить("ЕстьОшибка", Истина);
        ТекстОшибки = ОписаниеОшибки();
        МассивОшибок.Добавить(ТекстОшибки);
    КонецПопытки;
    
    Возврат(ИсходящиеДанные);
    
КонецФункции

Функция ДанныеОтправкиПоАПИ()
    
    datain = Новый Структура;
    datain.Вставить("token", СокрЛП(Токен));
    
    shipmentIdИboxes = Новый Массив;
    shipmentId = Новый Структура;
    shipmentId.Вставить("shipmentId", "980820641");
    shipmentIdИboxes.Добавить(shipmentId);
    
    boxes = Новый Массив;
    boxIndexboxCode = Новый Структура;
    boxIndexboxCode.Вставить("boxIndex", 1);
    boxIndexboxCode.Вставить("boxCode", "194*980820641*1");
    boxes.Добавить(boxIndexboxCode);
    shipmentId.Вставить("boxes", boxes);
    
    shipping = Новый Структура;
    shippingDate = Новый Структура;
    shippingDate.Вставить("shippingDate", "2020-06-05T17:56:38");
    shipmentId.Вставить("shipping", shippingDate);
    
    datain.Вставить("shipments", shipmentIdИboxes);
    
    data = Новый Структура;
    data.Вставить("data", datain);
    data.Вставить("meta", Новый Структура);
    
    //ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows, "    ", Истина);
    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
    ЗаписьJSON          = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
    ЗаписатьJSON(ЗаписьJSON, data);
    СтрокаJSON           = ЗаписьJSON.Закрыть();
    
    СтруктураВозврата = Новый Структура;
    СтруктураВозврата.Вставить("СтрокаJSON", СтрокаJSON);
    
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(СтрокаJSON);
    СтруктураОтвета = ЗаполнитьСтруктуруИзОтветаJSON(Чтение);
    
    Возврат СтруктураВозврата;
КонецФункции

Функция ПолучитьЗаголовки()
    Заголовки = Новый Соответствие;
    //Заголовки.Вставить("Authorization"  , "OAuth oauth_token="""+СокрЛП(Токен)+"");
    //Заголовки.Вставить("Authorization"  , "OAuth oauth_token="""+СокрЛП(Токен)+""", oauth_client_id="""+СокрЛП(КлиентID)+"""");
    //Заголовки.Вставить("User-Agent"     ,"Beru-Modul 1.7.20 UT/"+Метаданные.Версия+"");
    Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Заголовки.Вставить("Authorization", Токен);//Боевой Fkj214SA9asdmxASDj12!@kcLdspX //Тестовый kS43Dl234jasd@$32dN
    //Заголовки.Вставить("Authorization", "Basic " + СоздатьСтрокуBase64("goods:goods2019"));
    Заголовки.Вставить("Accept", "application/json");
    //Заголовки.Вставить("Authorization", "Token " + Токен);
    Возврат Заголовки;
КонецФункции

Функция ПолучитьАдресСервера()
    Сервер = "https://partner.goodsteam.tech/api/market/v1/orderService/";
    Возврат Сервер;
КонецФункции



Подскажите что не так, что за ошибка такая, как её обойти?
1 ДенисЧ
 
29.11.21
08:01
BOM отключи в записи Джозефа Сталина.
2 espanol
 
29.11.21
08:12
Сделал без Bom

    ЗТ = Новый ЗаписьТекста(ФайлРезультата,,, Истина, Символы.ПС);
    ЗТ.Записать(JSON.СтрокаJSON);
    ЗТ.Закрыть();


Теперь ругается немножко по другому

{"success":0,"error":{"errorText":"Unexpected token З in JSON at position 0","errorCode":"SyntaxError"}}

Куда копать?
3 ДенисЧ
 
29.11.21
08:16
Проверь обращение к серверу. Сервер и путь на нём должны быть в разных местах. А у тебя (лень в портянке ковыряться) - похоже в одном.
4 espanol
 
29.11.21
08:36
Прикольно, теперь он ругается так:

{"success":0,"error":{"errorText":"Unexpected token C in JSON at position 0","errorCode":"SyntaxError"}}

И на сколько я понимаю он ругается на символ C в токене

CCB48D59-A768-494C-87A2-A9C4A9CED33C


Как такое вообще может быть?
5 espanol
 
29.11.21
08:45
Хотя нет, он  ругается не на символы токена, а на чтото другое
6 espanol
 
29.11.21
09:15
А в Taland API Tester возвращает это:

{
"success": 0,
"error":{"errorText": "Unexpected token \" in JSON at position 0", "errorCode": "SyntaxError"}
}



Плиз хелп!
7 Kassern
 
29.11.21
09:25
(6) " ТекстовыйФайл = Новый ТекстовыйДокумент;
    ТекстовыйФайл.УстановитьТекст(JSON.СтрокаJSON);
    ТекстовыйФайл.Записать(ФайлЗапроса, КодировкаТекста.UTF8); "
Вот это зачем? Можно же проще:
ТелоДляОтправки=JSON.Закрыть();
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоДляОтправки);

В адресе ресурса случаем нет символов которые нужно преобразовать в урл?
8 Kassern
 
29.11.21
09:26
и надеюсь json вы через Новый ЗаписьJSON собирали соблюдая теги.
9 espanol
 
29.11.21
09:40
В адресе ресурса случаем нет символов которые нужно преобразовать в урл?

нет, там все нормально.

и надеюсь json вы через Новый ЗаписьJSON собирали соблюдая теги.

именно так
10 Kassern
 
29.11.21
09:46
(9) а зачем вы именно текстовый файл пихаете в тело, а не сам текст?
11 espanol
 
29.11.21
09:46
(10) нет, не катит ) не работает так вообще, код ответа даже не 200 выдавало
12 Kassern
 
29.11.21
09:48
Если уж вам нужно было записать в файл json, так вместо УстановитьСтроку использовали бы указание файла, при закрытии json он бы автоматом записался по пути. Зачем текстовый документ то?
13 Kassern
 
29.11.21
09:48
(11) по API, в документации, что в теле нужно бередать? Бинарный файл с данными, или все же json строку?
14 Kassern
 
29.11.21
09:49
(13) *передать
15 Kassern
 
29.11.21
09:50
такое ощущение, что вы просто подбором пытаетесь вопрос решить, не понимая, что действительно нужно передать и как.
16 espanol
 
29.11.21
09:51
(13) инструкция у них очень скудная, вот что на счет джесона

Запрос Order/Shipping
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
    "data": {
        "token": "FC1E36EE-1885-426E-8A46-FB1B9591253E",
        "shipments": [{
                "shipmentId": "980820641",
                "boxes": [{
                        "boxIndex": 1,
                        "boxCode": "194*980820641*1"
                    }
                ],
                "shipping": {
                    "shippingDate": "2020-06-05T17:56:38"
                }
            }
        ]
    },
    "meta": {}
}
17 espanol
 
29.11.21
09:52
order/shipping - стандарт
Подтверждение отгрузки Мерчантом
Описание метода Order/Shipping

URL метода: /order/shipping

Запрос выполняется Мерчантом. Сообщает о выполнении отгрузки Отправления курьеру.

Формат даты в поле shippingDate - YYYY-MM-DDThh:mm:ss+hh:mm
18 espanol
 
29.11.21
09:52
и всё )
19 Kassern
 
29.11.21
10:01
(16) значит все верно я вам написал
Собирайте json через структуры верно:
Как-то так:
ЗаписьJson=Новый ЗаписьJSON;
ЗаписьJson.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJson,СтруктураДанных);
Результат=ЗаписьJson.Закрыть();
Далее в теле отправляете: Именно Результат.
Зачем вы делаете лишние "телодвижения"?
Вот это закоментите
СтруктураВозврата = Новый Структура;
    СтруктураВозврата.Вставить("СтрокаJSON", СтрокаJSON);
    
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(СтрокаJSON);
    СтруктураОтвета = ЗаполнитьСтруктуруИзОтветаJSON(Чтение);
    
    Возврат СтруктураВозврата;
И вот это для чего вам? ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
Попробуйте не указывать параметры записи.
20 Kassern
 
29.11.21
10:03
Собранный json проверьте на корректность, чтобы все теги совпадали с документацией (переменная Результат).
21 espanol
 
29.11.21
10:05
(19) там мой джесон валидный, от перестановки слагаемых, сумма не меняется. Всегда везде работало...
22 Kassern
 
29.11.21
10:06
(21) какая ошибка, если вы json вставляете в тело, а не текстовый документ?
23 Галахад
 
гуру
29.11.21
10:15
(22) + 1.
24 espanol
 
29.11.21
10:15
(22) {"meta":{},"success":0,"error":{"message":"No valid token.","code":0}}
25 Kassern
 
29.11.21
10:16
(24) ну вот и все "No valid token" - токен значит не верный. Уже ошибки с синтаксисом нет. Напишите им по поводу вашего токена в поддержку
26 espanol
 
29.11.21
10:17
(25) так я же беру токен по инструкции с личного кабинета и работаю с ним....
27 Kassern
 
29.11.21
10:21
(26) может его надо активировать, или еще какие то манипуляции сделать, перед тем как работать с ним. В любом случае напишите им в поддержку по поводу вашего токена
28 espanol
 
29.11.21
10:41
(27) спасибо, уже написал в пятницу, глухо пока что )
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.