Как правильно настроить HTTP POST запрос в 1С для авторизации в API Rozetka

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

Интеграция 1С с современными маркетплейсами, такими как Rozetka, требует от разработчика понимания нюансов протокола HTTP и особенностей платформы 1С при работе с кодировками. Часто при переносе запроса из Postman в 1С возникают ошибки авторизации, даже если логин и пароль указаны верно. Разберем пошагово, как реализовать этот процесс правильно, избегая типичных ловушек.

Переход на защищенное соединение (HTTPS)

Первое, на что следует обратить внимание — это протокол. Большинство современных сервисов работают исключительно через HTTPS. Если в 1С создать объект HTTPСоединение без указания защищенного соединения, сервер может вернуть ошибку или код перенаправления 301. Проанализируем, как правильно инициализировать соединение.

Для работы с HTTPS необходимо использовать объект ЗащищенноеСоединениеOpenSSL. Это критически важно, так как при передаче учетных данных по открытому каналу HTTP риск перехвата паролей становится максимальным, и многие серверы (включая Rozetka) блокируют такие запросы.


// Инициализация защищенного соединения
Защита = Новый ЗащищенноеСоединениеOpenSSL();
АдресСервиса = "api.seller.rozetka.com.ua";

// Создание соединения с использованием SSL
HTTPСоединение = Новый HTTPСоединение(АдресСервиса, , , , , , Защита);

Формирование JSON-тела запроса

Одной из частых ошибок является попытка собрать строку JSON вручную. Рассмотрим ситуацию: если передать строку вида "username:Login, password:Pass", сервер её не примет. Тело запроса должно быть валидным JSON-объектом, заключенным в фигурные скобки, где и ключи, и строковые значения обернуты в двойные кавычки.

Рекомендуется использовать объект ЗаписьJSON, который автоматически экранирует спецсимволы и гарантирует правильную структуру документа. Выясним, как это выглядит в коде:


ДанныеЗапроса = Новый Соответствие;
ДанныеЗапроса.Вставить("username", "ВашЛогин");
ДанныеЗапроса.Вставить("password", "ВашПарольВBase64");

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

Кодирование пароля в Base64

API Rozetka требует, чтобы пароль в запросе передавался в кодировке Base64. При этом важно убедиться, что перед кодированием строка пароля была преобразована в двоичные данные в правильной кодировке (обычно UTF-8). Рассмотрим функцию для корректного преобразования:


Функция СоздатьСтрокуBase64(ВходнаяСтрока) Экспорт
    Птк = Новый ПотокВПамяти;
    Текст = Новый ЗаписьТекста(Птк, "UTF-8"); // Важно использовать UTF-8
    Текст.Записать(ВходнаяСтрока);
    Текст.Закрыть();
    ДД = Птк.ЗакрытьИПолучитьДвоичныеДанные();
    Возврат Base64Строка(ДД);
КонецФункции

Проблема BOM (Byte Order Mark) и ее решение

Это одна из самых коварных проблем в 1С. По умолчанию метод УстановитьТелоИзСтроки при использовании кодировки UTF-8 может добавлять в начало сообщения невидимые символы — префикс BOM. Многие веб-серверы не понимают этот префикс в теле JSON и возвращают ошибку incorrect_username_password (код 1004), даже если пароль верный.

Чтобы избежать этой проблемы, начиная с платформы 8.3.6, мы можем явно указать использование BOM. Рассмотрим, как правильно задать тело запроса:


HTTPЗапрос = Новый HTTPЗапрос("/sites/auth"); // Проверьте актуальный эндпоинт в документации
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");

// Отключаем использование BOM при установке тела запроса
HTTPЗапрос.УстановитьТелоИзСтроки(СтрJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Если вы используете более ранние версии платформы, проблему можно решить через ПотокВПамяти и ДвоичныеДанные, как показано в финальном решении автора темы.

Полный пример кода авторизации

Соберем все части воедино. Проанализируем итоговый алгоритм, который гарантированно работает с API маркетплейса:


Процедура ВыполнитьАвторизациюНаРозетке()
    // 1. Подготовка данных
    Логин = "MyAccount";
    ПарольОбычный = "MySecretPassword";
    ПарольBase64 = СоздатьСтрокуBase64(ПарольОбычный);
    
    АдресСервиса = "api.seller.rozetka.com.ua";
    ПутьКАвторизации = "/sites/auth"; // Уточните путь в документации Rozetka
    
    // 2. Формирование структуры JSON
    СтруктураДанных = Новый Структура();
    СтруктураДанных.Вставить("username", Логин);
    СтруктураДанных.Вставить("password", ПарольBase64);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
    ТелоЗапроса = ЗаписьJSON.Закрыть();
    
    // 3. Настройка соединения и запроса
    Защита = Новый ЗащищенноеСоединениеOpenSSL();
    Соединение = Новый HTTPСоединение(АдресСервиса, , , , , , Защита);
    
    Запрос = Новый HTTPЗапрос(ПутьКАвторизации);
    Запрос.Заголовки.Вставить("Content-Type", "application/json");
    
    // Устанавливаем тело БЕЗ BOM
    Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    // 4. Отправка и обработка ответа
    Попытка
        Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
        Состояние = Ответ.КодСостояния;
        ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
        
        Если Состояние = 200 Тогда
            // Успех! Парсим токен
            Сообщить("Авторизация прошла успешно");
            // Здесь должна быть логика извлечения токена из JSON
        Иначе
            Сообщить("Ошибка авторизации. Код: " + Состояние + ". Ответ: " + ТекстОтвета);
        КонецЕсли;
    Исключение
        Сообщить("Ошибка связи с сервером: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Важные рекомендации для дальнейшей работы

После получения успешного ответа (код 200) вы получите Access Token. Посмотрите на структуру ответа: обычно токен находится в поле access_token. Этот токен необходимо сохранять и передавать во всех последующих запросах к API в заголовке Authorization.

Помните:

  1. Срок жизни токена: Обычно он ограничен (например, 24 часа). Не делайте авторизацию перед каждым чихом, сохраняйте токен в константу или регистр сведений.
  2. Лимиты: Если делать слишком много запросов на авторизацию подряд, сервер может временно заблокировать ваш IP (ошибка 429).
  3. Отладка: Если код всё равно не работает, используйте инструменты мониторинга трафика (например, Fiddler), чтобы сравнить «сырой» запрос из 1С и из Postman байт за байтом. Чаще всего разница будет именно в лишних символах кодировки или заголовках.

Таким образом, мы выяснили, что секрет успешного подключения заключается в строгом соблюдении требований к протоколу HTTPS, исключении BOM из тела запроса и правильной подготовке данных в формате Base64.

← На главную