API POST /oauth выдает ошибку Invalid object: the property 'grant_type' is missing

1. user1202776 15.02.21 18:19 Сейчас в теме
Пытаюсь подключиться по API но выдает ошибку {"httpCode":"400","httpMessage":"Bad Request","moreInformation":"[JSV0002] Invalid object: the property 'grant_type' is missing."}

Документация API:
https://developer.sberbank.ru/api/5c9f5313e4b0388ba0f08b42
СтрокаURI ="https://dev.api.sberbank.ru/ru/prod/tokens/v2/oauth";
	СтруктураURI = СтруктураURI(СтрокаURI);
	HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост, СтруктураURI.Порт,,,,,Новый ЗащищенноеСоединениеOpenSSL()); // Новый ЗащищенноеСоединениеOpenSSL() если протокол https
	
	Заголовки = Новый Соответствие();
	Заголовки.Вставить("grant_type", "client_credentials");
	Заголовки.Вставить("scope", "https://api.sberbank.ru/rating/partner/legal");
	Заголовки.Вставить("Content-Type","application/x-www-form-urlencoded");
	Заголовки.Вставить("Authorization","Basic client id:client secret");
	Заголовки.Вставить("accept", "application/json");
	Заголовки.Вставить("RqUID", "e9FAE9fcee76276Ffdeb11b8A4Dde85e");
	
	
	//СтруктураДляJSON = Новый Структура;
	//СтруктураДляJSON.Вставить("grant_type","client_credentials");
	//СтруктураДляJSON.Вставить("scope","https://api.sberbank.ru/rating/partner/legal");
	
	//СписокОбъектов = Новый Массив;
	//СписокОбъектов.Добавить(СтруктураДляJSON);
	
	Запись = Новый ЗаписьJSON;
	Запись.УстановитьСтроку();
	ЗаписатьJSON(Запись,);
	ТелоЗапроса = Запись.Закрыть();
	
	
	HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере, Заголовки); 
	HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса,КодировкаТекста.UTF8);
	
	HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
	ТекстОтветаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();//здесь возвращается ответ запроса
	Сообщить(ТекстОтветаJSON);
Показать


Где нужно указать grant_type и scope?
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. pyrkin_vanya 488 15.02.21 18:54 Сейчас в теме
(1)Обычно ошибка 400 означает, что сервер не смог обработать запрос из-за неверного синтаксиса.

Попробуйте через такой метод, если винда. С заголовками в стандартном соединении трудности бывают.

Вот мой код. Естественно адаптируйте под себя.
	JSONДанные = Новый Структура("ВыполненоСОшибками, ОтветОтСервера");
	
	СтрокаСоединения = Ваша строка;
	
	Попытка
		WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
		WinHttp.Option(2, "utf-8");
		WinHttp.Open("POST", СтрокаСоединения, 0);
		
		// установка заголовков запроса
		WinHttp.SetRequestHeader("Accept-Language" , "ru");
		WinHttp.SetRequestHeader("Accept-Charset"  , "utf-8");
		WinHttp.setRequestHeader("Content-Language", "ru");
		WinHttp.setRequestHeader("Content-Charset" , "utf-8");
		WinHttp.setRequestHeader("Content-type"    , "application/x-www-form-urlencoded; charset=utf-8");
		
		Если НЕ СтруктураЗаголовков = Неопределено Тогда
			Для каждого ТекущаяСтрокаСтруктуры Из СтруктураЗаголовков Цикл
				WinHttp.setRequestHeader(ТекущаяСтрокаСтруктуры.Ключ, ТекущаяСтрокаСтруктуры.Значение);
			КонецЦикла;
		КонецЕсли;
		
		WinHttp.Send(ЗапросСтрока);
		
		ТекстОтвета = WinHttp.ResponseText();
		
		// получение JSON-данных
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
		
		JSONДанные.ВыполненоСОшибками = Ложь;
		JSONДанные.ОтветОтСервера     = ПрочитатьJSON(ЧтениеJSON, Ложь);
		
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
	
Показать
3. user1202776 15.02.21 20:28 Сейчас в теме
(2)правильно понимаю что grant_type и scope в моем случае должны быть в заголовке?
4. user1202776 15.02.21 21:28 Сейчас в теме
(2)Что должно быть в СтруктураЗаголовков и в ЗапросСтрока?
5. pyrkin_vanya 488 15.02.21 21:30 Сейчас в теме
(4)Ну это нужно анализировать документацию по API. Я меликом пробежался, вообще описания методов не обнаружил.
6. user1202776 15.02.21 21:42 Сейчас в теме
(5)Вы сказали,что выложили свой код. СтруктураЗаголовков и ЗапросСтрока в вашем коде
7. pyrkin_vanya 488 15.02.21 21:49 Сейчас в теме
(6)А, вы об этом
ЗапросСтрока имеет вид
{"Subject":"1","Secret":"2","Serial":"c2-b8e7-11e4-b24e-bcaec574","Request":"pos/service/activate","Key":"USA2ZXXU1qSu5qhx"}
СтуктураЗаголвков - Это просто структура. Ключ имя , ну и значение. И все.
8. user1202776 15.02.21 21:54 Сейчас в теме
(7)В 1С
ЗапросСтрока ="{"Subject":"1","Secret":"2","Serial":"c2-b8e7-11e4-b24e-bcaec574","Request":"pos/service/activate","Key":"USA2ZXXU1qSu5qhx"}"
?
9. pyrkin_vanya 488 15.02.21 21:56 Сейчас в теме
(8)Да, что смущает? Это мой пример реально работающего API.
10. user1202776 15.02.21 21:56 Сейчас в теме
(9)ничего не смущает.Спрашиваю,чтобы точно понять
11. pyrkin_vanya 488 15.02.21 21:58 Сейчас в теме
(10)Subject, Secret, Serial - это все обязательные поля для моего API. Дальше отдельно заголовки, т.к. написано в моей документации. По вашей ссылке я ее не увидел. По крайней мере внятного описания.
12. user1202776 15.02.21 22:02 Сейчас в теме
(11)тогда точно не понимаю как должно быть у меня
13. pyrkin_vanya 488 15.02.21 22:08 Сейчас в теме
(12)Вот, например, как выглядит одно из описаний одного из API. Синхронизацию писал недавно. Все понятно, примеры, описания ошибок и ответы. Ищите нечто подобное в вашем API.
Прикрепленные файлы:
14. user1202776 15.02.21 22:15 Сейчас в теме
(13)в моем APi такой описании нет. В моем API grant_type и scope должны быть в заголовке?
В описании АПИ написано "Обязательно в formData". Что такое formData , где и как в 1С это должно быть?
15. pyrkin_vanya 488 15.02.21 22:22 Сейчас в теме
(14)ну типа заголовок. В любом случае без описания api это просто тыкаться в никуда. Больше никакой инфы нельзя получить? Может связаться с поддержкой? Может у них есть более подробное описание .
16. user1202776 15.02.21 22:25 Сейчас в теме
(15)Что вы видите,когда переходите по ссылке? Скинь плиз скрин
53. devonec_team 36 22.07.21 15:11 Сейчас в теме
(2)

Новый COMОбъект("WinHttp.WinHttpRequest.5.1")
[/IS-QUOTE]


Спасибо, да видимо через HTTPСоединение , с таким заголовком "Content-type" , "application/x-www-form-urlencoded; charset=utf-8" не хочет корректно работать.

Переделал как у вас в примере все работает, через Новый COMОбъект("WinHttp.WinHttpRequest.5.1") - заработало сразу.
17. shurikvz 15.02.21 23:15 Сейчас в теме
Не читал документацию сбера. Просто по аналогии с другим сервисом, то как это работает. Возможно в сбере также.

grant_type, username, password, scope - отправляешь первым post запросом на сервер авторизации, они передаются в теле запроса. (как строка, т.е. grant_type=...&scope=..&итд)

В ответе сервера приходит токен.

И вот уже этот токен используешь дальше для своих запросов через заголовок Authorization, для api запросов к ресурсу.
18. user1202776 15.02.21 23:26 Сейчас в теме
(17)вот этот запрос делаю для того,чтобы получит токен.
Сможете привести пример как передать grant_type?
19. pyrkin_vanya 488 16.02.21 08:11 Сейчас в теме
(18)Да не, нормальная там документация оказывается. Просто уж разбираться в ней надо. Найдите в документации описание того что вам надо. Как называется глава? Методы? Описание? Сюда скриншот дайте.
Прикрепленные файлы:
20. user1202776 16.02.21 09:06 Сейчас в теме
(19)я думал, там видите то,что я вижу. Но оказывается все далекое не так)
На 3 скрине пример на Python
Прикрепленные файлы:
21. pyrkin_vanya 488 16.02.21 09:32 Сейчас в теме
(20) Я думаю мой пример из первого сообщения должен подойти. Вы переписали код? Покажите?
22. user1202776 16.02.21 09:39 Сейчас в теме
(21)Не понимаю,что должен подставить в ЗапросСтрока

	JSONДанные = Новый Структура("ВыполненоСОшибками, ОтветОтСервера");
    
    СтрокаСоединения = "https://dev.api.sberbank.ru/ru/prod/tokens/v2/oauth";;
    
    Попытка
        WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
        WinHttp.Option(2, "utf-8");
        WinHttp.Open("POST", СтрокаСоединения, 0);
		
		
		WinHttp.SetRequestHeader("grant_type", "client_credentials");
	WinHttp.SetRequestHeader("scope", "https://api.sberbank.ru/rating/partner/legal");
	WinHttp.SetRequestHeader("Content-Type","application/x-www-form-urlencoded");
	WinHttp.SetRequestHeader("Authorization","Basic client id:client secret");
	WinHttp.SetRequestHeader("accept", "application/json");
	WinHttp.SetRequestHeader("RqUID", "e9FAE9fcee76276Ffdeb11b8A4Dde85e");

		        
		//Если НЕ СтруктураЗаголовков = Неопределено Тогда
		//    Для каждого ТекущаяСтрокаСтруктуры Из СтруктураЗаголовков Цикл
		//        WinHttp.setRequestHeader(ТекущаяСтрокаСтруктуры.Ключ, ТекущаяСтрокаСтруктуры.Значение);
		//    КонецЦикла;
		//КонецЕсли;
        
		//WinHttp.Send(ЗапросСтрока);
		 WinHttp.Send();
		 
		ТекстОтвета = WinHttp.ResponseText();
		
		// получение JSON-данных
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
		
		JSONДанные.ВыполненоСОшибками = Ложь;
		JSONДанные.ОтветОтСервера     = ПрочитатьJSON(ЧтениеJSON, Ложь);
        
    Исключение
        Сообщить(ОписаниеОшибки());
	КонецПопытки;
Показать
23. pyrkin_vanya 488 16.02.21 09:42 Сейчас в теме
(22)
Попробуйте
СтрокаСоединения = "https://dev.api.sberbank.ru/";
ЗапросСтрока = "ru/prod/tokens/v2/oauth";
24. user1202776 16.02.21 09:46 Сейчас в теме
(23)выводит такую же ошибку :
Произошла исключительная ситуация (WinHttp.WinHttpRequest): Не удается установить соединение с сервером
25. pyrkin_vanya 488 16.02.21 09:48 Сейчас в теме
(24)На какой строке выходит ошибка?
26. pyrkin_vanya 488 16.02.21 09:49 Сейчас в теме
(24)Авторизация как вообще проходит?
27. user1202776 16.02.21 09:58 Сейчас в теме
(26)
	
	JSONДанные = Новый Структура("ВыполненоСОшибками, ОтветОтСервера");
    
	//СтрокаСоединения = "https://dev.api.sberbank.ru/ru/prod/tokens/v2/oauth";;
     СтрокаСоединения = "https://dev.api.sberbank.ru/";
ЗапросСтрока = "ru/prod/tokens/v2/oauth";

	//Попытка
        WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
        WinHttp.Option(2, "utf-8");
        WinHttp.Open("POST", СтрокаСоединения, 0);
		
		
		WinHttp.SetRequestHeader("grant_type", "client_credentials");
	WinHttp.SetRequestHeader("scope", "https://api.sberbank.ru/rating/partner/legal");
	WinHttp.SetRequestHeader("Content-Type","application/x-www-form-urlencoded");
	WinHttp.SetRequestHeader("Authorization","Basic client id:client secret");
	WinHttp.SetRequestHeader("accept", "application/json");
	WinHttp.SetRequestHeader("RqUID", "e9FAE9fcee76276Ffdeb11b8A4Dde85e");

		        
		//Если НЕ СтруктураЗаголовков = Неопределено Тогда
		//    Для каждого ТекущаяСтрокаСтруктуры Из СтруктураЗаголовков Цикл
		//        WinHttp.setRequestHeader(ТекущаяСтрокаСтруктуры.Ключ, ТекущаяСтрокаСтруктуры.Значение);
		//    КонецЦикла;
		//КонецЕсли;
        
		WinHttp.Send(ЗапросСтрока);
		 //WinHttp.Send();
		 
		ТекстОтвета = WinHttp.ResponseText();
		
		// получение JSON-данных
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
		
		JSONДанные.ВыполненоСОшибками = Ложь;
		JSONДанные.ОтветОтСервера     = ПрочитатьJSON(ЧтениеJSON, Ложь);
        
	//Исключение
	//    Сообщить(ОписаниеОшибки());
	//КонецПопытки;
Показать



Ошибку выдает на строке
WinHttp.Send(ЗапросСтрока);

Выдает ошибку : Произошла исключительная ситуация (WinHttp.WinHttpRequest): Не удается установить соединение с сервером
28. pyrkin_vanya 488 16.02.21 10:02 Сейчас в теме
(27) Вы пока тупо не можете соединение установить с сервером. Что в API написано? Сложно без документации. Авторизация каким образом в этом API происходит?
29. user1202776 16.02.21 10:16 Сейчас в теме
(28)
Прикрепленные файлы:
30. pyrkin_vanya 488 16.02.21 10:18 Сейчас в теме
(29)Вы уверены, что вот тут у вас должно быть так?
 WinHttp.SetRequestHeader("Authorization","Basic client id:client secret");
33. user1202776 16.02.21 10:24 Сейчас в теме
(30)В документации написано "Авторизационные данные. Необходимо в поле указать слово "Basic" и через пробел передать закодированные в BASE64 значения client id и client secret разделенные двоеточием (Basic client id:client secret)
Вроде правильно указал
31. user1202776 16.02.21 10:19 Сейчас в теме
(28)Все что написано про авторизацию скинул скринами в (20).
Это запрос возвращает access_token. Этот токен нужен для того,чтобы в других запросах использовать его
32. pyrkin_vanya 488 16.02.21 10:23 Сейчас в теме
(31)Там можно тестировать операции. Там прям есть кнопка в API "Вызвать операцию". Вы проверяли ее? Что возвращается?
34. user1202776 16.02.21 10:30 Сейчас в теме
(32)Да, проверял. Все успешно отрабатывает
Прикрепленные файлы:
35. pyrkin_vanya 488 16.02.21 10:33 Сейчас в теме
(34)А есть какой-то тестовый сервер? Я хочу сам попробовать...
36. user1202776 16.02.21 10:40 Сейчас в теме
(35) Может как-то можно тестовый доступ получить, но насколько я знаю нельзя
37. pyrkin_vanya 488 16.02.21 10:45 Сейчас в теме
(36)Поинтересуйтесь. Мне любопытна эта задача.
38. user1202776 16.02.21 10:54 Сейчас в теме
(37)Тестовый доступ можно получить только если у вас есть учетка в сбер бизнесе
39. shurikvz 16.02.21 11:17 Сейчас в теме
Чет не то ты пишешь.
Ты же документацию кидаешь, там ясно написано что grant_type и scope в теле запроса. Нафига ты их в заголовки пихаешь?

Как-то так тогда уж:
WinHttp.SetRequestHeader("Content-Type","application/x-www-form-urlencoded");
WinHttp.SetRequestHeader("Authorization","Basic client id:client secret");
WinHttp.SetRequestHeader("accept", "application/json");
WinHttp.SetRequestHeader("RqUID", "e9FAE9fcee76276Ffdeb11b8A4Dde85e");

ЗапросСтрока = "grant_type=client_credentials&scope=https://api.sberbank.ru/rating/partner/legal";
WinHttp.Send(ЗапросСтрока);


И вот насчет того что scope задается как https://api.sberbank.ru/rating/partner/legal - я не уверен. Уточни этот момент.
Свои client id:client secret точно правильно кидаешь, в base64?
40. user1202776 16.02.21 11:32 Сейчас в теме
(39)
Свои client id:client secret точно правильно кидаешь, в base64?

С техподдержки сказали,что и ":" нужно в base64 зашифровать, но у меня на сайте работает без шифрования ":" . А клиент ид и клиент секрет зашифроваю в base64
41. user1202776 16.02.21 11:38 Сейчас в теме
(39) до https://api.sberbank.ru/rating/partner/legalещё
не дошел. Сначала нужно получить. Скрины документации скинул в (20)
43. shurikvz 16.02.21 15:43 Сейчас в теме
(41) в смысле не дошел? Это и есть начало. Чего получить? Это первый запрос к ресурсу.
44. user1202776 16.02.21 16:13 Сейчас в теме
(43)В (42) написал,что не то написал
45. pyrkin_vanya 488 16.02.21 19:18 Сейчас в теме
(44)у вас что-то получилось?
46. user1202776 16.02.21 20:14 Сейчас в теме
(45)нет. Вообще не понимаю что не так делаю
47. pyrkin_vanya 488 16.02.21 21:30 Сейчас в теме
(46)Покажите ваш код хотя бы. Полностью. Может по нему что скажем.
48. user1202776 16.02.21 21:47 Сейчас в теме
(47)
JSONДанные = Новый Структура("ВыполненоСОшибками, ОтветОтСервера");
    
	СтрокаСоединения = "https://dev.api.sberbank.ru/ru/prod/tokens/v2/oauth";
	 //СтрокаСоединения = "https://dev.api.sberbank.ru/";
//ЗапросСтрока = "ru/prod/tokens/v2/oauth";

	//Попытка
        WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
        WinHttp.Option(2, "utf-8");
        WinHttp.Open("POST", СтрокаСоединения, 0);
		
	
	WinHttp.SetRequestHeader("Content-Type","application/x-www-form-urlencoded");
	WinHttp.SetRequestHeader("x-ibm-client-id", "ad7f7d7f-bd5e-4331-8f8c-b095d570c6e7");
WinHttp.SetRequestHeader("Authorization","Basic client id:client secret");
WinHttp.SetRequestHeader("accept", "application/json");
WinHttp.SetRequestHeader("RqUID", "e9FAE9fcee76276Ffdeb11b8A4Dde85e");

ЗапросСтрока = "grant_type=client_credentials&scope=https://api.sberbank.ru/rating/partner/legal";
WinHttp.Send(ЗапросСтрока);
	
	
	
		//Если НЕ СтруктураЗаголовков = Неопределено Тогда
		//    Для каждого ТекущаяСтрокаСтруктуры Из СтруктураЗаголовков Цикл
		//        WinHttp.setRequestHeader(ТекущаяСтрокаСтруктуры.Ключ, ТекущаяСтрокаСтруктуры.Значение);
		//    КонецЦикла;
		//КонецЕсли;
        
		WinHttp.Send(ЗапросСтрока);
		 //WinHttp.Send();
		 
		ТекстОтвета = WinHttp.ResponseText();
		
		// получение JSON-данных
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
		
		JSONДанные.ВыполненоСОшибками = Ложь;
		JSONДанные.ОтветОтСервера     = ПрочитатьJSON(ЧтениеJSON, Ложь);
Показать
49. pyrkin_vanya 488 16.02.21 21:57 Сейчас в теме
(48) Параметры в URL вроде передаются через &, а значения через {}. Строка соединения вряд ли должна быть такая. Тут уже от API зависит.
Вот мой пример строки соединения
{"Subject":"1","Secret":"23","Serial":"ccb128a2-b8e7-11e4-b24e-bcaec574","Request":"pos/service/activate","Key":"MF6rjpEdWeoOPsBi+NycGeAVhLFb"}


Сначала устанавливаем соединение с сервером. Потом передаем уже сроку соединения. У вас соединение вообще устанавливается?
42. user1202776 16.02.21 11:54 Сейчас в теме
(39) а нет, в (42) фигню написал
50. shurikvz 17.02.21 09:21 Сейчас в теме
Уф. 10 строк что-ли написать не можете.
	АдресСервера = "dev.api.sberbank.ru";
	АдресРесурса = "/ru/prod/tokens/v2/oauth";
	
	Соединение = Новый HTTPСоединение(АдресСервера, 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
	
	
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Accept", "application/json");
	Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
	Заголовки.Вставить("Authorization", "...");
	Заголовки.Вставить("RqUID", "...");
	Заголовки.Вставить("x-ibm-client-id", "...");
	
	ДанныеТелаСтрокой = "grant_type=client_credentials&scope=https://api.sberbank.ru/rating/partner/legal";
	
	Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
	Запрос.УстановитьТелоИзСтроки(ДанныеТелаСтрокой);
	
	ОтветСервера = Соединение.ОтправитьДляОбработки(Запрос);
	Тело = ОтветСервера.ПолучитьТелоКакСтроку();
	
	
	Соединение = Неопределено;
Показать


Параметры все уточняйте в техподдержке если не знаете.
grant_type и scope вероятно не такие.
51. user1202776 20.02.21 09:08 Сейчас в теме
(50)
grant_type и scope вероятно не такие

спросил и разработчиков и они ответили
grant_type: client_credentials
scope: https://api.sberbank.ru/rating/partner/legal

Но все равно выдает ошибку { "httpCode":"401", "httpMessage":"Unauthorized", "moreInformation":"Client id not registered." }
52. shurikvz 20.02.21 18:46 Сейчас в теме
(51)
"httpMessage":"Unauthorized", "moreInformation":"Client id not registered."

Ну как бы намекает, что что-то не то с логином/паролем, либо как вариант id на стороне банка еще надо дополнительно регистрировать для доступа к api.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)