Как настроить интеграцию 1С с API Сбербанка Плати QR и решить ошибки 401 и 400?

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

Разберем процесс интеграции учетной системы 1С с API Сбербанка для создания заказов на оплату (Плати QR / СБП). В процессе разработки часто возникают ошибки авторизации (HTTP 401) и ошибки валидации данных (HTTP 400). Проанализируем эти ситуации по шагам и выясним причины их возникновения, а также посмотрим на правильные способы формирования запросов.

Шаг 1. Получение токена авторизации и решение ошибки 401 Unauthorized

Первым этапом интеграции является получение 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, который мы будем использовать на следующем шаге.

Шаг 2. Создание заказа и решение ошибки 400 Bad Request

После успешного получения токена мы переходим к созданию самого QR-заказа (эндпоинт /prod/qr/order/v3/creation). И здесь нередко возникает следующая ошибка:

{"httpCode":"400","httpMessage":"Bad Request","moreInformation":"Body of the request is not valid according to json schema"}

Проанализируем причины. Эта ошибка означает, что переданное тело запроса не соответствует строгим правилам JSON-схемы банка. Разберем основные нюансы, на которые нужно обратить внимание:

  1. Синтаксические ошибки: Самая банальная причина — некорректно сформированная строка JSON при ручной сборке. Например, пропущенная кавычка перед массивом (вместо "order_params_type": [ передается "order_params_type: ["). Это ломает всю структуру.
  2. Строгая типизация сумм: Суммы (такие как order_sum и position_sum) всегда должны передаваться строго как целые числа в копейках. Передача строки или числа с плавающей точкой вызовет ошибку валидации.
  3. Формат дат: API жестко требует соблюдения стандарта ISO 8601 в формате UTC (на конце строки с датой должен быть символ "Z").
  4. Идентификаторы: В заголовках передается RqUID (уникальный идентификатор HTTP-запроса), а в теле — order_number (номер заказа). Если запрос повторяется из-за сетевой ошибки, order_number должен остаться прежним, а RqUID нужно сгенерировать заново.

Шаг 3. Правильное формирование JSON в 1С

Чтобы избежать ошибок с кавычками и типами данных, откажемся от ручной склейки строк. Применим штатные механизмы платформы — объекты ЗаписьJSON и НастройкиСериализацииJSON.

Посмотрим на пример правильной сериализации:


ЗаписьJSON = Новый ЗаписьJSON;
НастройкиСериализации = Новый НастройкиСериализацииJSON; 

// Настраиваем правильный формат дат по стандарту ISO 8601 UTC
НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;

ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДанныхЗаказа, НастройкиСериализации);
СтрокаJSON = ЗаписьJSON.Закрыть();

При использовании структуры СтруктураДанныхЗаказа убедитесь, что числовые значения добавляются именно как числа, а не как текст.

Шаг 4. Особенности работы с SSL-сертификатами

Отправим подготовленный 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 и проверке статусов, значительно упрощая процесс настройки.

← На главную