Как правильно выполнить POST-запрос с авторизацией из 1С к SberBusiness API?

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

При настройке интеграции с внешними API, работающими по протоколу HTTPS, разработчики часто сталкиваются с двумя проблемами: невозможностью просмотреть содержимое отправляемого пакета и ошибками сервера при валидации параметров запроса. Рассмотрим, как поэтапно решить обе задачи.

Шаг 1: Диагностика и перехват трафика с помощью Fiddler

Когда 1С возвращает ошибку или API сообщает, что параметры не заполнены, крайне полезно увидеть «сырой» запрос. Для этого применяются снифферы, такие как Fiddler. Однако, использование прокси для HTTPS-трафика требует настройки доверия к сертификатам.

  1. Установите Fiddler на локальный компьютер.
  2. Перейдите в настройки программы (раздел HTTPS) и установите флаг Decrypt HTTPS traffic.
  3. Если при отправке запроса из 1С возникает Ошибка установки SSL-соединения, это означает, что платформа 1С не доверяет корневому сертификату Fiddler. Вам необходимо экспортировать корневой сертификат Fiddler и импортировать его в хранилище Доверенные корневые центры сертификации в Windows.
  4. После этого 1С будет корректно проходить через прокси-сервер, и вы сможете увидеть содержимое заголовков и тела запроса в окне сниффера.

Шаг 2: Исправление формата отправки POST-запроса

Частая ошибка при интеграции с OAuth2-сервисами (включая Сбер) заключается в неверном понимании типа контента. Если вы указываете заголовок Content-Type: application/x-www-form-urlencoded, сервер ожидает не JSON-структуру, а строку, где параметры разделены символом &, а ключи и значения соединены знаком =.

Разберем пример правильной реализации отправки данных в формате x-www-form-urlencoded:


// Пример правильной отправки данных для OAuth2
ЗапросHTTP = Новый HTTPЗапрос;
ЗапросHTTP.АдресРесурса = "/ic/sso/api/v2/oauth/token";
ЗапросHTTP.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
ЗапросHTTP.Заголовки.Вставить("Accept", "application/json");

// Формируем тело запроса как строку параметров
ТелоЗапроса = СтрШаблон("code=%1&client_id=%2&client_secret=%3&redirect_uri=%4&grant_type=authorization_code", 
    КодАвторизации, 
    ИдентификаторПриложения, 
    СекретПриложения, 
    URLПеренаправления);

ЗапросHTTP.УстановитьТелоИзСтроки(ТелоЗапроса);

// Выполнение запроса
Соединение = Новый HTTPСоединение("edupirfintech.sberbank.ru", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);

Почему ваш JSON-запрос мог не работать?

Если вы отправляете JSON, вы должны убедиться, что сервер поддерживает такой тип контента. В случае с получением токенов (OAuth2), большинство API жестко придерживаются стандарта application/x-www-form-urlencoded. Если вы передаете JSON, но в заголовке указываете x-www-form-urlencoded, сервер не сможет прочитать параметры, что приведет к ошибке invalid_grant или 400 Bad Request.

Рекомендации по отладке

Следуя этим рекомендациям и правильно форматируя тело запроса, вы сможете успешно интегрироваться с любым современным API без возникновения ошибок SSL или неверного формата данных.

← На главную