Работа с API СДЭК v2.0

1. lasermag 02.11.21 23:34 Сейчас в теме
Уважаемые коллеги помогите пожалуйста разобраться.

Взаимодействие с сервисом требует клиентской авторизации. Авторизация клиентов обеспечивается с применением протокола OAuth 2.0.

Для получения токена необходимо отправить POST-запрос (x-www-form-urlencoded) на URL:

https://api.cdek.ru/v2/oauth/token?parameters

Разрешенные параметры и их возможные значения:

grant_type: тип аутентификации, доступное значение: client_credentials;

client_id: идентификатор клиента, равен Account;

client_secret: секретный ключ клиента, равен Secure password.


В ответ на запрос доступа будет возвращена следующая информация:

access_token: jwt-токен;

token_type: тип токена (всегда принимает значение "bearer");

expires_in: срок действия токена (по умолчанию 3600 секунд);

scope: область действия токена (доступ к объектам и операциям над ними);

jti: уникальный идентификатор токена.



Вот код обработки

&НаКлиенте
Процедура ВыполнитьСоединение(Команда)
    
    СтруктураAPI = ПутьAPI();
    Соединение = Новый HTTPСоединение(СтруктураAPI.Сервер, СтруктураAPI.Порт, , , , , Новый ЗащищенноеСоединениеOpenSSL);
                    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type", "x-www-form-urlencoded");
    Запрос = Новый HTTPЗапрос(СтруктураAPI.Путь, Заголовки);
    
    ПараметрыНТТРЗавпроса = ПолучитьПараметрыАвторизации();
    Запрос.УстановитьТелоИзСтроки(ПараметрыНТТРЗавпроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.Использовать);    
    Попытка
        Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
    Исключение
        // исключение здесь говорит о том, что запрос не дошел до HTTP-Сервера
        Сообщить("Произошла сетевая ошибка!");
        ВызватьИсключение;
    КонецПопытки;
    ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку();
    
КонецПроцедуры

&НаКлиенте
Функция ПутьAPI()
    Структура = Новый Структура;
    Структура.Вставить("ПолныйПуть", "https://api.cdek.ru/v2/oauth/token?parameters");
    Структура.Вставить("Сервер", "api.cdek.ru");
    Структура.Вставить("Порт", 443);
    Структура.Вставить("Путь", "/v2/oauth/token?parameters");
    Возврат Структура;
КонецФункции

&НаКлиенте
Функция ДобавитьПараметрыНТТРЗапроса(СтрПараметры, ИмяПараметра, ЗначениеПараметра)
    СтрПараметры = СтрПараметры + ?(ПустаяСтрока(СтрПараметры), "","&") + ИмяПараметра + "=" + ЗначениеПараметра;
    Возврат СтрПараметры;    
КонецФункции

&НаКлиенте
Функция ПолучитьПараметрыАвторизации()
    
    ПараметрыНТТРЗавпроса = "";
    ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "grant_type" , "client_credentials");
    ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "client_id" , "im-2@ff.cdek.ru");
    ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "client_secret" , "19");
        
    Возврат ПараметрыНТТРЗавпроса;
    
КонецФункции
Показать


В результате получаю

{"timestamp":"2021-11-02T19:33:22.755+00:00","status":401,"error":"Unauthorized","message":"","path":"/oauth/token"}
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. koln 03.11.21 10:21 Сейчас в теме
По указанной в посте ссылке выходит окно авторизации. Вы, под передаваемыми данными, можете войти в систему?
4. lasermag 03.11.21 12:46 Сейчас в теме
3. пользователь 03.11.21 12:45
Сообщение было скрыто модератором.
...
6. lasermag 03.11.21 14:48 Сейчас в теме
Вопрос решен. Спасибо подсказал коллега.
Заголовки.Вставить("Content-Type", "x-www-form-urlencoded");

вот здесь должно быть
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
7. SAO 29 27.04.23 22:25 Сейчас в теме
Нашел данный пост при поиске своей проблемы, может кто-то поможет и по моей проблеме

вот такой ответ получаю при коде ниже
{"error":"invalid_request","error_description":"Missing grant type"}

если закомметрировать строчку
ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "grant_type", "client_credentials");
то будет
{"timestamp":"2023-04-27T19:22:23.812+00:00","status":401,"error":"Unauthorized","path":"/oauth/token"}




перем СтруктКоннект;

Процедура КнопкаВыполнитьНажатие(Кнопка)
	ВыполнитьСоединение();
КонецПроцедуры

Процедура ВыполнитьСоединение()	
    СтруктураAPI = ПутьAPI();    
	Соединение = Новый HTTPСоединение(СтруктураAPI.Сервер, СтруктураAPI.Порт, , , , , Новый ЗащищенноеСоединениеOpenSSL);                    
    Заголовки = Новый Соответствие;
    //Заголовки.Вставить("Content-Type", "x-www-form-urlencoded");
	Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
    Запрос = Новый HTTPЗапрос(СтруктураAPI.Путь, Заголовки);    
    ПараметрыНТТРЗавпроса = ПолучитьПараметрыАвторизации();
    Запрос.УстановитьТелоИзСтроки(ПараметрыНТТРЗавпроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.Использовать);    
	Попытка		
        Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
    Исключение
        // исключение здесь говорит о том, что запрос не дошел до HTTP-Сервера
        Сообщить("Произошла сетевая ошибка!");
        ВызватьИсключение;
    КонецПопытки;
    ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку();
    Сообщить(ОтветСтрокой);
КонецПроцедуры

Функция ПутьAPI()
    Структура = Новый Структура;
    Структура.Вставить("Сервер", СтруктКоннект.Сервер);	
    Структура.Вставить("Порт", 443);
    Структура.Вставить("Путь", "/v2/oauth/token?parameters");	
	//Структура.Вставить("ПолныйПуть", "https://"+Структура.Сервер+Структура.Путь);	
    Возврат Структура;
КонецФункции

Функция ДобавитьПараметрыНТТРЗапроса(СтрПараметры, ИмяПараметра, ЗначениеПараметра)
    СтрПараметры = СтрПараметры + ?(ПустаяСтрока(СтрПараметры), "","&") + ИмяПараметра + "=" + ЗначениеПараметра;	
    Возврат СтрПараметры;    
КонецФункции

Функция ПолучитьПараметрыАвторизации()
	ПараметрыНТТРЗавпроса = "";    
	ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "grant_type", 	"client_credentials");
	ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "client_id", 	СтруктКоннект.ИД);
	ДобавитьПараметрыНТТРЗапроса(ПараметрыНТТРЗавпроса, "client_secret",СтруктКоннект.Пароль);
	Возврат ПараметрыНТТРЗавпроса;    
КонецФункции

СтруктКоннект=Новый Структура("Сервер,ИД,Пароль");
СтруктКоннект.Сервер="api.edu.cdek.ru";
СтруктКоннект.ИД="EMscd6r9JnFiQ3bLoyjJY6eM78JrJceI";
СтруктКоннект.Пароль="PjLZkKBHEiLK3YsjtNrt3TGNG0ahs3kG";
Показать
8. user856012 13 28.04.23 03:20 Сейчас в теме
(7)
может кто-то поможет и по моей проблеме
Может, автор вот этой публикации?

Причем, необязательно пытать его лично, достаточно просто скачать файл(ы) и посмотреть - что/как там устроено?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот