Имя: Пароль:
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.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший