Имя: Пароль:
1C
 
Api и сбер
,
0 pleasure
 
29.05.23
15:29
Пробую получить токен через API от Сбера для последующего создания заказа на оплату, в итоге после выполнения ниже представленного куска кода получаю следующее:
{"httpCode":"401", "httpMessage":"Unauthorized", "moreInformation":"Invalid credentials"}
что я делаю не так куда смотреть?
Код:
СтрокаАвторизации = "Basic "+ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(""+ClientId+":"+clientSecret,КодировкаТекста.UTF8,Ложь));
СтрокаАвторизации =СтрЗаменить(СтрокаАвторизации,Символы.ПС,"");
СтрокаАвторизации =СтрЗаменить(СтрокаАвторизации,Символы.ВК,"");  

// получение токена с авторизацией
    
ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл("g:\certificatet.p12", Пароль),Новый СертификатыУдостоверяющихЦентровОС);        
Соединение = Новый HTTPСоединение("api.sberbank.ru",8443,,,,5,SSL,Ложь);
        
Заголовки = Новый Соответствие();
Заголовки.Вставить("authorization", СтрокаАвторизации);
Заголовки.Вставить("accept","application/json");
Заголовки.Вставить("content-type","application/json");
    
Запрос = Новый HTTPЗапрос("/prod/tokens/v2/oauth",Заголовки);
Запрос.УстановитьТелоИзСтроки("grant_type=client_credentials&oauth=https://api.sberbank.ru:8443/prod/tokens/v2/oauth");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);    
СписокДоковПоФН = Ответ.ПолучитьТелоКакСтроку();
1 dchumak
 
30.05.23
12:57
[что я делаю не так куда смотреть?]
Неверный скоуп.

Для каждой операции свой, в теле запроса получения токена
grant_type=client_credentials&scope=

Создание заказа
https://api.sberbank.ru/qr/order.create
Отмена заказа
https://api.sberbank.ru/qr/order.revoke
Запрос статусов
https://api.sberbank.ru/qr/order.status
...
2 pleasure
 
30.05.23
19:17
(1) предыдущий шаг получения токена я прошёл, получаю следующий ответ:
{"access_token":"4b6ce5dd-b08b-4523-9ba5-8dca15183cc8","expires_in":"60","scope":"https://api.sberbank.ru/qr/order.create","session_state":"6a79efc3-e73a-44f9-8971-88ca988febde","token_type":"bearer"}. Тут вроде всё Ок.

а далее со следующим кодом получаю:
{"httpCode":"400","httpMessage":"Bad Request","moreInformation":"Body of the request is not valid according to json schema"}


// получение ссылки QR через токен
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Authorization","Bearer "+Токен);
    Заголовки.Вставить("RqUID"        , СтрокаGUID);
    Заголовки.Вставить("Content-Type" , "application/json");
    Заголовки.Вставить("accept"       , "application/json");
    ТелоЗапроса = "grant_type=client_credentials&creation=https://api.sberbank.ru:8443/prod/qr/order/v3/creation";
        АдресРесурса = "prod/qr/order/v3/creation";
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
                        
    HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса,, ИспользованиеByteOrderMark.НеИспользовать);
        Результат = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
    ОтветСтрока = Результат.ПолучитьТелоКакСтроку();
    
    Док.ДобавитьСтроку(ОтветСтрока);

ясно что JSON схема не та или как? авторизация по токену проходит, а схема ДЖСОН нета или не туда вставил?
3 pleasure
 
30.05.23
19:35
JSON
{
"rq_uid": "cae0dd74e6694caf8651ce954ac133f7",
"rq_tm": "2023-05-30T19:31:55Z",
"member_id": "00002***",
"order_number": "2222203551",
"order_create_date": "2023-05-30T19:31:55Z",
"order_params_type: [
  {
  "position_name": "Услуга",
  "position_count": 1,
  "position_sum": 100,
  "position_description": "Услуги"
}
],
"id_qr": "1000100051",
"order_sum": 100,
"currency": "643",
"description": "Оплата клиентом",
"sbp_member_id": "100000000111"
}
4 dchumak
 
31.05.23
05:57
Вот мой запрос
{
"rq_uid": "e397997e8f0644f98e582082223a71ec",
"rq_tm": "2023-05-31T02:53:46Z",
"member_id": "0000****",
в номер заказа я каждый раз передаю ГУИД
"order_number": "e397997e8f0644f98e582082223a71ec",
"order_create_date": "2023-05-31T02:53:46Z",
"order_params_type": [
{
"position_name": "Оплата за товары/услуги",
"position_count": 1,
"position_sum": 893,
"position_description": "Оплата за товары/услуги"
}
],
"id_qr": "2502****",
сумма в копейках
"order_sum": 89300,
"currency": "643",
"description": "Invoice",
"sbp_member_id": "100000000111"
}
5 dchumak
 
31.05.23
06:00
вот заголовки, посмотрите еще, сравните со своими
Заголовки = Новый Соответствие();
Заголовки.Вставить("Authorization", СтрокаАвторизации);
Заголовки.Вставить("Accept","*/*");
Заголовки.Вставить("Content-Type","application/json");
Заголовки.Вставить("rquid", rqUID);
6 dchumak
 
31.05.23
06:01
и вот это там уже не нужно
ТелоЗапроса = "grant_type=client_credentials .....
7 dchumak
 
31.05.23
06:42
[в номер заказа я каждый раз передаю ГУИД]
это сделано, чтобы можно было несколько раз передавать заказ на оплату, иначе выдается ошибка, что заказ с таким номером есть
8 pleasure
 
31.05.23
09:21
(5) Заголовки = Новый Соответствие;
        GUID = Новый УникальныйИдентификатор();
    СтрокаGUID = СтрЗаменить(Строка(GUID),"-","");
---------
    Заголовки.Вставить("Authorization","Bearer "+Токен);
    Заголовки.Вставить("Accept","*/*");
    Заголовки.Вставить("Content-Type","application/json");
    Заголовки.Вставить("rquid", СтрокаGUID);    
    HTTPСоединение = Новый HTTPСоединение("api.sberbank.ru",8443,,,,5,ssl);
    АдресРесурса = "prod/qr/order/v3/creation";  
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);

    HTTPЗапрос.УстановитьТелоИзСтроки(JSON,, ИспользованиеByteOrderMark.НеИспользовать);
    Результат = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
    ОтветСтрока = Результат.ПолучитьТелоКакСтроку();
    
    Док.ДобавитьСтроку(ОтветСтрока);
    Док.ДобавитьСтроку(JSON);

Результат:
{"access_token":"20cccd2d-0e2d-4308-88ba-f83d5ca89eff","expires_in":"60","scope":"https://api.sberbank.ru/qr/order.create","session_state":"79732520-3a62-4f9f-878e-eb193bd5829f","token_type":"bearer"}

{"httpCode":"400","httpMessage":"Bad Request","moreInformation":"Body of the request is not valid according to json schema"}
{
"rq_uid": "a710b9f191e344c6870e42675eb02ca9",
"rq_tm": "2023-05-31T09:15:52Z",
"member_id": "0000****",
"order_number": "a710b9f191e344c6870e42675eb02ca9",
"order_create_date": "2023-05-31T09:15:52Z",
"order_params_type: [
  {
  "position_name": "Услуги",
  "position_count": 1,
  "position_sum": 100,
  "position_description": "Услуги"
}
],
"id_qr": "10001002",
"order_sum": 100,
"currency": "643",
"description": "Оплата клиентом",
"sbp_member_id": "100000000111"
}

Или я тело запроса не так передаю или уже хз, столько вариантов перепробовано, не знаю куда смотреть ;(.
9 dchumak
 
31.05.23
09:56
Попробуйте поиграться с настройками

ЗаписьJSON = Новый ЗаписьJSON;
НастройкиСериализацииJSON = Новый НастройкиСериализацииJSON;
// вот тут
НастройкиСериализацииJSON.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
НастройкиСериализацииJSON.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДляФормированияЗапроса, НастройкиСериализацииJSON);
СтрокаJSON = ЗаписьJSON.Закрыть();
10 dchumak
 
31.05.23
09:59
// в ссл также посмотрите настройки
ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл(ПутьКСертификатуСБП, ПарольСертификатаСБП), Новый СертификатыУдостоверяющихЦентровОС);
Соединение = Новый HTTPСоединение(АдресСервераСБП, ПортСервераСБП, ClientId, SecretId, , 30, ssl, Ложь);

// ну и дальше
Запрос = Новый HTTPЗапрос(АдресДляСозданияЗаказаСБП, Заголовки);
Запрос.УстановитьТелоИзСтроки(СтрокаJSON);      
Ответ = Соединение.ОтправитьДляОбработки(Запрос);  
СтруктураОтвета = Новый Структура("КодСостояния, Тело", Ответ.КодСостояния, Ответ.ПолучитьТелоКакСтроку());
Если СтруктураОтвета.КодСостояния = 200 Тогда .....
11 dchumak
 
31.05.23
10:01
[не знаю куда смотреть]
1. Попробуйте сделать запрос в Postman
2. Обратитесь в техподдержку, приложите свой member_id, они вам ответят. В процессе ответа могут попросить cURL из п.1. Отвечают в течение 2-3 часов.
12 pleasure
 
31.05.23
10:16
(10) по логину, сертификату и паролю получает токен, что видно в отклике access_token.

а то что я адрес для создания заказа оплаты использую
https://api.sberbank.ru:8443/prod/qr/order/v3/creation
а при запросе токен используется
scope=https://api.sberbank.ru/qr/order.create
это не может быть причиной?
13 pleasure
 
31.05.23
10:45
обработка https://dropmefiles.com/mlDLV
14 dchumak
 
31.05.23
11:28
[это не может быть причиной?]
1. Это разные понятия.
Получили токен со скоупом scope=https://api.sberbank.ru/qr/order.create и дальше его используете для создания заказа, иначе будет ошибка Invalid Scope.
2. api.sberbank.ru:8443/prod/qr/order/v3/creation а это уже адрес, а не скоуп.
15 pleasure
 
04.06.23
14:56
проблема была  здесьJSON = СтрЗаменить(JSON, "order_params_type"": {", "order_params_type"": [
      |  {");

вместо  "order_params_type": [ было "order_params_type: [
Основная теорема систематики: Новые системы плодят новые проблемы.