Разберем процесс интеграции учетной системы 1С с API Сбербанка для создания заказов на оплату (Плати QR / СБП). В процессе разработки часто возникают ошибки авторизации (HTTP 401) и ошибки валидации данных (HTTP 400). Проанализируем эти ситуации по шагам и выясним причины их возникновения, а также посмотрим на правильные способы формирования запросов.
Первым этапом интеграции является получение access-токена. Зачастую разработчики отправляют запрос с учетными данными, но получают ответ:
{"httpCode":"401", "httpMessage":"Unauthorized", "moreInformation":"Invalid credentials"}
Рассмотрим подробнее, почему это происходит. Ошибка кроется в неверно переданном параметре scope в теле запроса. Для каждой операции в API Сбербанка предусмотрен свой scope. Если вы планируете создавать заказ, в теле запроса (x-www-form-urlencoded) необходимо явно указать нужную область видимости.
Посмотрим на исправленный пример кода для получения токена:
Заголовки = Новый Соответствие();
Заголовки.Вставить("Authorization", СтрокаАвторизации); // Basic + Base64(ClientId:ClientSecret)
Заголовки.Вставить("Accept", "application/json");
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Запрос = Новый HTTPЗапрос("/prod/tokens/v2/oauth", Заголовки);
// Обязательно указываем правильный scope для создания заказа
Запрос.УстановитьТелоИзСтроки("grant_type=client_credentials&scope=https://api.sberbank.ru/qr/order.create");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
Если все сделано верно, в ответе вернется JSON, содержащий access_token, который мы будем использовать на следующем шаге.
После успешного получения токена мы переходим к созданию самого QR-заказа (эндпоинт /prod/qr/order/v3/creation). И здесь нередко возникает следующая ошибка:
{"httpCode":"400","httpMessage":"Bad Request","moreInformation":"Body of the request is not valid according to json schema"}
Проанализируем причины. Эта ошибка означает, что переданное тело запроса не соответствует строгим правилам JSON-схемы банка. Разберем основные нюансы, на которые нужно обратить внимание:
"order_params_type": [ передается "order_params_type: ["). Это ломает всю структуру.order_sum и position_sum) всегда должны передаваться строго как целые числа в копейках. Передача строки или числа с плавающей точкой вызовет ошибку валидации.RqUID (уникальный идентификатор HTTP-запроса), а в теле — order_number (номер заказа). Если запрос повторяется из-за сетевой ошибки, order_number должен остаться прежним, а RqUID нужно сгенерировать заново.Чтобы избежать ошибок с кавычками и типами данных, откажемся от ручной склейки строк. Применим штатные механизмы платформы — объекты ЗаписьJSON и НастройкиСериализацииJSON.
Посмотрим на пример правильной сериализации:
ЗаписьJSON = Новый ЗаписьJSON;
НастройкиСериализации = Новый НастройкиСериализацииJSON;
// Настраиваем правильный формат дат по стандарту ISO 8601 UTC
НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДанныхЗаказа, НастройкиСериализации);
СтрокаJSON = ЗаписьJSON.Закрыть();
При использовании структуры СтруктураДанныхЗаказа убедитесь, что числовые значения добавляются именно как числа, а не как текст.
Отправим подготовленный JSON на сервер Сбербанка. Для корректной работы защищенного соединения необходимо использовать ЗащищенноеСоединениеOpenSSL.
Важный момент: API Сбербанка использует сертификаты Национального удостоверяющего центра (Минцифры РФ). Если на вашем сервере не установлены эти корневые сертификаты, соединение будет разорвано. В 1С это решается передачей правильного объекта сертификатов ОС:
ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаФайл(ПутьКСертификату, ПарольСертификата),
Новый СертификатыУдостоверяющихЦентровОС()
);
Соединение = Новый HTTPСоединение("api.sberbank.ru", 8443, , , , 30, ssl, Ложь);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + Токен);
Заголовки.Вставить("Accept", "application/json");
Заголовки.Вставить("Content-Type", "application/json");
Заголовки.Вставить("RqUID", СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""));
HTTPЗапрос = Новый HTTPЗапрос("prod/qr/order/v3/creation", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Альтернативный вариант: Если вы используете типовые конфигурации (УТ, Розница, УНФ), рассмотрите использование встроенной Библиотеки подключаемого оборудования (БПО). Драйвер "1С:Эквайринговые терминалы Сбербанк 2.x" берет на себя всю логику по авторизации, сериализации JSON и проверке статусов, значительно упрощая процесс настройки.