Имя: Пароль:
1C
 
Сбер СБП
, , ,
0 FreeWay
 
03.02.24
09:57
до середины января работал код, всё было шикарно, но после прилетело откуда не ждали:
собственно часть кода
авторизация проходит успешно, а вот дальше создание заказа qr-кода с ошибкой
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Authorization","Bearer "+Токен);
    Заголовки.Вставить("Accept","application/json");
    Заголовки.Вставить("Content-Type","application/json");
    Заголовки.Вставить("rquid", СтрокаGUID);    
    HTTPСоединение = Новый HTTPСоединение("mc.api.sberbank.ru",443,,,,3600,ssl);
    АдресРесурса = "/prod/qr/order/v3/creation";  
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
    HTTPЗапрос.УстановитьТелоИзСтроки(JSON,, ИспользованиеByteOrderMark.НеИспользовать);
    
    Результат = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);  
    Если Результат.КодСостояния=200 Тогда ......

ответ от сервера:
{
  "httpCode": "400",
  "httpMessage": "Validation Error. Response phase",
  "moreInformation": "/qr/order/v3/creation"
}
сбер поддержка молчит третью неделю. куда смотреть и что делать ума не приложу
1 stopa85
 
03.02.24
10:05
Может сертификат протух?

Ну и полный текст запроса в студию. У нас все работает. Все норм.
2 FreeWay
 
03.02.24
10:11
авторизация по сертификату проходит, токен получается.
Authorization = "Basic "+ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(""+ClientId+":"+clientSecret,КодировкаТекста.UTF8,Ложь));
    Authorization =СтрЗаменить(Authorization,Символы.ПС,"");
    Authorization =СтрЗаменить(Authorization,Символы.ВК,"");
    
    ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл(ПутьКСертификату,ПарольСертификата));
    
    HTTPСоединение = Новый HTTPСоединение("mc.api.sberbank.ru",443,,,,5,ssl);
    ТелоЗапроса = "grant_type=client_credentials";
    ТелоЗапроса = ТелоЗапроса + "&scope=https://api.sberbank.ru/qr/order.create";
    ТекстЗапроса = "/prod/tokens/v3/oauth";
    HTTPЗапрос = Новый HTTPЗапрос(ТекстЗапроса);
    HTTPЗапрос.АдресРесурса = ТекстЗапроса;
    HTTPЗапрос.Заголовки.Вставить("x-ibm-client-id", clientID);    
    HTTPЗапрос.Заголовки.Вставить("authorization", Authorization);    
    HTTPЗапрос.Заголовки.Вставить("rquid", СтрокаGUID);    
    HTTPЗапрос.Заголовки.Вставить("content-type","application/x-www-form-urlencoded" );  
    HTTPЗапрос.Заголовки.Вставить("accept", "application/json");
    HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);
    
    Результат = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
    ОтветСтрока = Результат.ПолучитьТелоКакСтроку();
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ОтветСтрока);
    Ответ = ПрочитатьJSON(ЧтениеJSON);
    Токен=Ответ.access_token;
    
    // получение ссылки QR через токен  
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Authorization","Bearer "+Токен);
    Заголовки.Вставить("Accept","application/json");
    Заголовки.Вставить("Content-Type","application/json");
    Заголовки.Вставить("rquid", СтрокаGUID);
    HTTPСоединение = Новый HTTPСоединение("mc.api.sberbank.ru",443,,,,3600,ssl);
    АдресРесурса = "/prod/qr/order/v3/creation";
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
    HTTPЗапрос.УстановитьТелоИзСтроки(JSON,, ИспользованиеByteOrderMark.НеИспользовать);
    
    Результат = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
    Если Результат.КодСостояния=200 Тогда
3 stopa85
 
03.02.24
10:14
Я по другому делаю

ВебЗапрос.УстановитьТелоИзСтроки(ТелоВебЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.Авто);
ВебОтвет = Соединение.ОтправитьДляОбработки(ВебЗапрос);
ТелоОтвета = ВебОтвет.ПолучитьТелоКакСтроку();
4 stopa85
 
03.02.24
10:16
HTTPЗапрос.Заголовки.Вставить("content-type","application/x-www-form-urlencoded" );  

нужно тут
application/json
5 stopa85
 
03.02.24
10:16
Тыж JSON отправляешь...
6 FreeWay
 
03.02.24
10:19
в первом запросе авторизации через сертификат application/x-www-form-urlencoded, далее получая токен Заголовки.Вставить("Content-Type","application/json")
7 FreeWay
 
03.02.24
10:28
8 stopa85
 
03.02.24
10:29
Кидай json запроса тестом и заголовки текстом
9 stopa85
 
03.02.24
10:30
Я со своим сравню
10 FreeWay
 
03.02.24
10:37
я не менял JSON, ни чего не менялось, пока со стороны сбера не накрутили
11 FreeWay
 
03.02.24
10:40
{
"rq_uid": "3a025bceb0be466db5fc659850d51ac8",
"rq_tm": "2024-02-03T10:38:22Z",
"member_id": "00001292",
"order_number": "3a025bceb0be466db5fc659850d51ac8",
"order_create_date": "2024-02-03T10:38:22Z",
"id_qr": "29115815",
"order_sum": 284362,
"currency": "643",
"order_params_type": [
  {
  "position_name": "Услуга Т***ь",
  "position_count": 1,
  "position_sum": 284362,
  "position_description": "Оплата клиентом л/с №565*0*1600; г. Р****, улица Станиславского. Дом № 1 А, Квартира 5; **** **** **"
}
],
"description": "Оплата клиентом л/с №565*0*1600; г. Р****, улица Станиславского. Дом № 1 А, Квартира 5; **** **** **",
"sbp_member_id": "100000000111"
}
12 FreeWay
 
03.02.24
10:43
"rquid" "3a025bceb0be466db5fc659850d51ac8"
"Content-Type" "application/json"
"Accept" "application/json"
"Authorization" "Bearer 38105208-2be1-4451-889b-29f535f5a949"
13 stopa85
 
03.02.24
13:49
Странно. Попробуй без order_params_type.

У меня без него работает

Запрос:
127.0.0.1/prod/qr/order/v3/creation
Заголовки: 
RqUID: c343a0dc4093475fb61a59d582923b6e
authorization: Bearer f9d33694-6c52-45d2-9b46-ХХХХХХ13a37e
content-type: application/json
accept: application/json
Тело Запроса: 
{
"rq_uid": "c343a0dc4093475fb61a59d582923b6e",
"rq_tm": "2024-02-03T10:28:29Z",
"member_id": "00000302",
"order_number": "ООО075689",
"order_create_date": "2024-02-03T10:28:29Z",
"id_qr": "25978323",
"order_sum": 100,
"currency": "643",
"description": "Счет 116899 от 17 сентября 2021г",
"sbp_member_id": "100000000111"
}
Ответ: КодОтвета:200
14 stopa85
 
03.02.24
13:59
Ну я единственное еще
  HTTPЗапрос.УстановитьТелоИзСтроки(JSON,, ИспользованиеByteOrderMark.НеИспользовать);


явно указываю кодировку
15 FreeWay
 
03.02.24
14:19
(13) Расшифровка услуги, по докам так же есть позиции.
16 stopa85
 
03.02.24
15:01
Чисто для пробы. Где-то же ошибка.

Все равно придется теперь проверить все методы
17 stopa85
 
03.02.24
15:05
И про (14) не забудь.

А вообще postman в руки и в перед. Это сбер, как ни крути.
18 stopa85
 
04.02.24
01:13
Я разобрался! У меня тоже такой глюк был!

Символ номер убери из описания заказа!

Описание заказа (Спец.символы требуется экранировать)

Для заказа СБП значение ограничено 140 символами: pattern ^ [A-Za-zА-Яa-я0-9' '!"#$%&'()*+,-.\/\:;<=>?@[\]^_`{|}~]{140}
19 stopa85
 
04.02.24
01:13
Они тут это даже в доку вписали наконец

https://api.developer.sber.ru/index.php/product/PlatiQR/doc/v1/QR_API_doc522
20 FreeWay
 
04.02.24
14:07
(19) (18) я думаю при таком раскладе ошибка был бы другой но ни как не 400
21 FreeWay
 
04.02.24
14:13
и без спец символа не работает
22 FreeWay
 
04.02.24
14:23
Документация Сбебанка для прямого шлюза СБП https://ecomtest.sberbank.ru/doc
Реализуем без сертификата по паролям логинам

Функция ФормированиеСБПQR() //ЛС,СуммаПлатежа,ФИО,адрес
    Login = "********";
    Pass = "*******";
    
    Authorization = ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(Login+":"+pass));
    Authorization =СтрЗаменить(Authorization,Символы.ПС,"");
    Authorization =СтрЗаменить(Authorization,Символы.ВК,"");
    
    JSON = СформироватьТелоЗапроса();
    ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows());
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Authorization", "Basic " +Authorization);
    Заголовки.Вставить("Content-Type", "application/json;charset=utf-8");
    
    HTTPСоединение = Новый HTTPСоединение("ecommerce.sberbank.ru",443,,,,5,ssl);
    АдресРесурса = "/ecomm/gw/partner/api/v1/register.do";
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
    HTTPЗапрос.УстановитьТелоИзСтроки(JSON,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    Результат = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);  
    Если Результат.КодСостояния=200 Тогда  
        ОтветСервера = Результат.ПолучитьТелоКакСтроку();
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(ОтветСервера);
        Соответствие = ПрочитатьJSON(ЧтениеJSON,Истина);
        Если не Соответствие.Получить("externalParams").Получить("sbpPayload")=Неопределено Тогда
            ПлатежнаяСсылка=Соответствие.Получить("externalParams").Получить("sbpPayload");    
        КонецЕсли;
    КонецЕсли;        
    Возврат ПлатежнаяСсылка;
КонецФункции

Функция СформироватьТелоЗапроса()
    GUID =Новый УникальныйИдентификатор();
        ДатаОкончанияЖизниЗаказа = Строка(Формат(ДобавитьМесяц(ТекущаяДата(),1),"ДФ='yyyy-MM-ddTHH:mm:ss'"));
    JSON_Структура_Тело = Новый Структура;
    JSON_Структура_Тело.Вставить("userName","*********");
    JSON_Структура_Тело.Вставить("password","**********");
    JSON_Структура_Тело.Вставить("merchantLogin","","**********");");
    JSON_Структура_Тело.Вставить("orderNumber",""+GUID+"");
    JSON_Структура_Тело.Вставить("description","Лицевой счет №123456789 период 01.2024 сумма 1,00 руб");
        JSON_Структура_Тело.Вставить("expirationDate",ДатаОкончанияЖизниЗаказа);
    JSON_Структура_Тело.Вставить("amount",100);
    JSON_Структура_Тело.Вставить("returnUrl","https://online.sberbank.ru/");
    
    СтруктураПараметровТ = Новый Соответствие;
    СтруктураПараметровТ.Вставить("qrType","DYNAMIC_QR_SBP");
    СтруктураПараметровТ.Вставить("sbp.scenario","C2B");
    
    JSON_Структура_Тело.Вставить("jsonParams",СтруктураПараметровТ);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    НастройкиСериализацииJSON = Новый НастройкиСериализацииJSON;
    НастройкиСериализацииJSON.ФорматСериализацииДаты = ФорматДатыJSON.JavaScript;
    НастройкиСериализацииJSON.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON,JSON_Структура_Тело, НастройкиСериализацииJSON);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    Возврат СтрокаJSON;
КонецФункции

код рабочий
23 stopa85
 
04.02.24
18:43
(20) У меня именно такое поведение, как у тебя. Русские буквы можно, а "№" нельзя. Ну и 400 вполне логичный код.

(22) некоторым моим организациям Сбер прикрывает этот api, переводит на yookassa.
Закон Брукера: Даже маленькая практика стоит большой теории.