Как решить проблему авторизации при интеграции 1С с системой Фулфилмент

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

Интеграция 1С с внешними логистическими сервисами и системами фулфилмента — это стандартная задача для современной автоматизации торговли. Однако на этапе настройки авторизации разработчики часто сталкиваются с неочевидными ошибками. Рассмотрим ситуацию, когда при попытке получить токен доступа система возвращает ошибку 404 Not Found или сообщение User do not exists or wrong password, несмотря на наличие корректных ключей доступа. В этой статье мы подробно разберем, как правильно настроить соединение, какие параметры передавать и как избежать типичных ошибок при работе с API платформы Reworker (Фулфилмент СДЭК).

Анализ исходной проблемы и диагностика

Проанализируем типичный сценарий: разработчик пытается выполнить POST-запрос к эндпоинту авторизации, используя стандартные объекты 1С HTTPСоединение и HTTPЗапрос. В теле запроса передаются идентификаторы клиента, домен и ключи доступа (publicKey и secretKey). Несмотря на то, что данные кажутся верными, сервер отвечает отказом. Выясним основные причины такого поведения системы.

Первое, на что следует обратить внимание — это адрес сервера и используемый протокол. В современных API использование незащищенного протокола HTTP (порт 80) практически исключено. Если в коде указано Порт = 80, это первая точка отказа. Все операции по обмену конфиденциальными данными, к которым относится авторизация, должны проходить через HTTPS (порт 443).

Шаг 1: Настройка безопасного соединения

Для корректной работы с API Фулфилмента нам необходимо инициализировать HTTPСоединение с использованием защищенного протокола. Рассмотрим, как это выглядит в коде 1С:


// Определяем параметры подключения
Сервер = "app.lk.reworker.ru";
Порт = 443; // Используем стандартный порт для HTTPS

// Создаем объект защищенного соединения
Защита = Новый ЗащищенноеСоединениеOpenSSL();

// Инициализируем соединение
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , 30, Защита);

Использование ЗащищенноеСоединениеOpenSSL является обязательным требованием. Без этого параметра 1С будет пытаться установить обычное соединение, которое сервер фулфилмента, скорее всего, просто сбросит или перенаправит некорректно, что и вызывает ошибку 404.

Шаг 2: Проверка соответствия ключей доступа

Разберем ситуацию с ключами. Часто возникает путаница между ключами для обычного API СДЭК (доставка) и API Фулфилмента. Для интеграции с Фулфилментом (платформа Reworker) необходимо использовать publicKey и secretKey, которые генерируются именно в личном кабинете Фулфилмента. Ключи от личного кабинета cdek.ru (Account и Secure Password) здесь не подойдут. Проанализируем структуру параметров, которые ожидает система:

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

Шаг 3: Формирование тела запроса и заголовков

Посмотрим на формат передачи данных. В примере из обсуждения данные упаковываются в JSON. Однако многие системы, реализующие протокол OAuth 2.0, ожидают данные в формате application/x-www-form-urlencoded. Если передача JSON не работает, следует попробовать изменить формат тела запроса. Рассмотрим пример формирования запроса в формате JSON, так как он наиболее часто встречается в современных мануалах ФФ:


// Подготовка заголовков
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
Заголовки.Вставить("Accept", "application/json");

// Подготовка параметров
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("client_id", "reworker");
ПараметрыЗапроса.Вставить("domain", "cdek");
ПараметрыЗапроса.Вставить("grant_type", "password");
ПараметрыЗапроса.Вставить("username", "Ваш_Public_Key");
ПараметрыЗапроса.Вставить("password", "Ваш_Secret_Key");

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

// Формирование запроса
АдресРесурса = "/api/oauth/cdek"; // Уточните точный путь в актуальном мануале
Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
Запрос.УстановитьТелоИзСтроки(СтрокаТела, КодировкаТекста.UTF8);

Важный нюанс: Если сервер все равно возвращает ошибку, попробуйте изменить АдресРесурса. В некоторых версиях API путь может выглядеть как /oauth/token или иметь другие префиксы. Всегда сверяйте эндпоинт с официальной документацией вашего провайдера фулфилмента.

Шаг 4: Обработка ответа сервера

После отправки запроса методом POST, необходимо правильно обработать полученный ответ. Посмотрим, как извлечь токен доступа (access_token), который понадобится нам для всех последующих запросов к системе.


Попытка
    Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
    КодСостояния = Ответ.КодСостояния;
    ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    Если КодСостояния = 200 Тогда
        // Читаем JSON ответ
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(ОтветСтрокой);
        ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
        
        AccessToken = ДанныеОтвета.access_token;
        Сообщить("Авторизация успешна. Токен получен.");
    Иначе
        Сообщить("Ошибка авторизации! Код: " + КодСостояния);
        Сообщить("Тело ответа: " + ОтветСтрокой);
    КонецЕсли;
Исключение
    Сообщить("Ошибка при выполнении сетевого запроса: " + ОписаниеОшибки());
КонецПопытки;

Дополнительные рекомендации

Разберем еще несколько критических моментов, которые помогут нам добиться стабильной работы интеграции:

  1. Срок действия токена: Полученный access_token имеет ограниченный срок жизни (обычно передается в поле expires_in). Не стоит запрашивать новый токен перед каждой операцией. Правильнее будет сохранить его в константу или кэш и обновлять только по истечении времени жизни или при получении ошибки 401 (Unauthorized).
  2. Кодировка: Всегда явно указывайте КодировкаТекста.UTF8 при установке тела запроса и получении ответа. Это исключит проблемы с интерпретацией спецсимволов в ключах.
  3. Отладка через Postman: Если в 1С не удается победить ошибку 404/401, попробуйте воспроизвести запрос в сторонней утилите, такой как Postman. Это позволит точно понять: проблема в параметрах доступа или в программном коде 1С.
  4. Тире и спецсимволы: Проанализируем ситуацию с ключами. Если ваш secretKey содержит тире, убедитесь, что при передаче в JSON они не экранируются лишний раз и не превращаются в другие символы. В 1С ЗаписатьJSON корректно обрабатывает такие строки, но при использовании формата x-www-form-urlencoded значения обязательно нужно пропускать через функцию КодироватьСтроку().

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

← На главную