При интеграции конфигураций 1С с сервисами Яндекс.Директа по протоколу OAuth 2.0 разработчики нередко сталкиваются с ситуацией, когда доступ к API в интерфейсе уже получен и подтвержден, но при выполнении тестового запроса сервер возвращает ошибку:
{"error":{"error_detail":"Необходимо заполнить для приложения заявку на доступ в интерфейсе Директа и дождаться её подтверждения","error_string":"Незавершенная регистрация","error_code":"58"}}
Разберем причины возникновения этой ошибки и выясним, как правильно составить HTTP-запрос в 1С для успешного взаимодействия с API Директа версии 5.
Текст ошибки указывает на незавершенную регистрацию приложения, однако на практике причин такого поведения сервиса может быть несколько:
Client-Login: если OAuth-токен получен аккаунтом агентства или управляющей компании, обращение к методам управления данными клиентов без заголовка Client-Login воспринимается API как попытка выполнить операцию от имени самого агентства. Если у агентского логина нет собственных рекламных кампаний, сервис выдает ошибку 58.{"method": "...", "params": {...}}. Даже для методов без входных параметров поле params должно передаваться как пустой JSON-объект {}. Пропуск данного блока приводит к сбою обработки контекста запроса.api.direct.yandex.com вместо api-sandbox.direct.yandex.com вызовет отказ в доступе.Посмотрим на рабочий вариант отправки запроса в 1С, который решает проблему. Для этого добавим в заголовки логин клиента и скорректируем структуру передаваемого JSON-пакета:
КодировкаТекст = "UTF-8";
ТекстЗапроса = "{
|""method"":""checkDictionaries"",
|""params"":{}
|}";
Ресурс = "/json/v5/changes";
Сервер = "api.direct.yandex.com";
Защита = Новый ЗащищенноеСоединениеOpenSSL();
HttpСоединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Защита);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + Токен);
Заголовки.Вставить("Accept-Language", "ru");
Заголовки.Вставить("Client-Login", Логин);
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
HttpЗапрос = Новый HTTPЗапрос(Ресурс, Заголовки);
HttpЗапрос.УстановитьТелоИзСтроки(ТекстЗапроса, КодировкаТекста.UTF8);
мОтвет = HttpСоединение.ОтправитьДляОбработки(HttpЗапрос);
Результат = мОтвет.ПолучитьТелоКакСтроку();
Разберем по шагам ключевые детали, которые позволят избежать ошибок при разработке сетевого обмена:
HttpСоединение.ОтправитьДляОбработки(HttpЗапрос), так и метод HttpСоединение.Post(HttpЗапрос). Второй вариант более нагляден в программном коде.ЗащищенноеСоединениеOpenSSL с явным указанием порта 443.UTF-8 вместо устаревших или проприетарных форматов вроде CESU-8. При установке тела из строки применяйте значение системного перечисления КодировкаТекста.UTF8.Host на основании имени хоста, указанного при создании HTTPСоединение. Вручную добавлять его в коллекцию заголовков не требуется во избежание дублирования заголовка в HTTP-пакете.200 OK даже при наличии логических ошибок авторизации или валидации. Обязательно десериализуйте тело ответа и проверяйте наличие секции error перед дальнейшей обработкой данных.Units, в котором передается информация об остатке доступных баллов и суточном лимите обращения к сервису.