Эта статья-заметка о том как взаимодействовать из кода 1С с интернет магазином и используя REST-API woocommerce получать заказы и их содержимое.
(статья обновлена и дополнена 2021.12.01)
Для доступа без логина и пароля используется используется система JWT-токенов. Суть этой системы в том что вместе с заголовком запроса передается токен, сопоставленный с пользователем wordpress, по которому wordpress опознает пользователя.
Эти токены можно создавать и использовать установив один из плагинов:
- Плагин Advanced Access Manager. Очень навороченный плагин, позволяющий тонко настроить права доступа по токенам, их устаревание и обновление. У меня лично с ним на тестовом сайте было все хорошо, но на старом сайте с десятками других плагинов увы он работать отказался.
- Плагин JWT Authentication for WP-API. Это очень простой плагин, вообще без каких либо настроек и интерфейса. Даже сам токен придется создавать выполнив GET-запрос с указанием логина и пароля и в JSON-ответе получив сам токен. Крое того для работы согласно инструкции нужно будет прописать пару строк в wp-config.php.
Соединение = Новый HTTPСоединение("domain",80); // если у вас простое HTTP
Соединение = Новый HTTPСоединение("domain",443,,,,,Новый ЗащищенноеСоединениеOpenSSL()); // HTTPS!
ЗаголовкиЗапроса = Новый Соответствие;
ЗаголовкиЗапроса.Вставить("Content-Type", "application/json;charset=utf-8");
// Добавляем в заголовок запроса авторизацию, которая на стороне wordpress реализуется плагином Advanced Access Manager через созданный JWT-токен
ЗаголовкиЗапроса.Вставить("Authorization", "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI**********XQiOjEE08nOm8k");
// Получаем список заказов начиная с установленной даты
Запрос = Новый HTTPЗапрос("/wp-json/wc/v2/orders?after=2021-08-08T00:00:00Z&page=1&orderby=id&order=asc", ЗаголовкиЗапроса);
Результат = Соединение.Получить(Запрос);
Сообщить("Нам вернули код: " + Результат.КодСостояния);
// Коды результата запроса:
// [100, 299] - Ок
// [300, 399] - Перенаправление (302 - код постоянного перенаправления)
// [400, 499] - Ошибка запроса
// [500, 599] - Ошибка сервера
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
Заказы = Неопределено;
СформироватьДерево(ЧтениеJSON, Заказы);
// Демонстрация содержимого заказов
Для Каждого Заказ из Заказы Цикл
Сообщить("Заказ№:" + Заказ.Получить("number") + " создан:" + ПрочитатьДатуJSON(Заказ.Получить("date_created"), ФорматДатыJSON.ISO));
billing = Заказ.Получить("billing");
Сообщить(billing.Получить("first_name") + " " + billing.Получить("last_name") + " " + billing.Получить("email") + " " + billing.Получить("phone"));
line_items = Заказ.Получить("line_items"); // Достаем строки заказа
Для Каждого СтрокаЗаказа из line_items Цикл
Сообщить(" * " + СтрокаЗаказа.Получить("sku") + СтрокаЗаказа.Получить("price") + СтрокаЗаказа.Получить("name"));
КонецЦикла;
КонецЦикла;
К сожалению формат отдаваемого json woocommerce представляет собой несколько уровней вложенных массивов и объектов, так что простым циклическим вызовом функции ЧтениеJSON.Прочитать() для заполнения данных заказа обойтись довольно сложно. В вышеприведенном коде разбором json и переводом в более удобную форму занимается процедура СформироватьДерево , ниже привожу ее код:
Процедура СформироватьДерево(ЧтениеJSON, Дерево)
ИмяСвойства = Неопределено;
Пока ЧтениеJSON.Прочитать() Цикл
TипJSON = ЧтениеJSON.ТипТекущегоЗначения;
Если TипJSON = ТипЗначенияJSON.НачалоОбъекта
ИЛИ TипJSON = ТипЗначенияJSON.НачалоМассива Тогда
НовыйОбъект = ?(TипJSON = ТипЗначенияJSON.НачалоОбъекта, Новый Соответствие, Новый Массив);
Если ТипЗнч(Дерево) = Тип("Массив") Тогда
Дерево.Добавить(НовыйОбъект);
ИначеЕсли ТипЗнч(Дерево) = Тип("Соответствие") И ЗначениеЗаполнено(ИмяСвойства) Тогда
Дерево.Вставить(ИмяСвойства, НовыйОбъект);
КонецЕсли;
СформироватьДерево(ЧтениеJSON, НовыйОбъект);
Если Дерево = Неопределено Тогда
Дерево = НовыйОбъект;
КонецЕсли;
ИначеЕсли TипJSON = ТипЗначенияJSON.ИмяСвойства Тогда
ИмяСвойства = ЧтениеJSON.ТекущееЗначение;
ИначеЕсли TипJSON = ТипЗначенияJSON.Число
ИЛИ TипJSON = ТипЗначенияJSON.Строка
ИЛИ TипJSON = ТипЗначенияJSON.Булево
ИЛИ TипJSON = ТипЗначенияJSON.Null Тогда
Если ТипЗнч(Дерево) = Тип("Массив") Тогда
Дерево.Добавить(ЧтениеJSON.ТекущееЗначение);
ИначеЕсли ТипЗнч(Дерево) = Тип("Соответствие") Тогда
Дерево.Вставить(ИмяСвойства, ЧтениеJSON.ТекущееЗначение);
КонецЕсли;
Иначе
Возврат;
КонецЕсли;
КонецЦикла;
КонецПроцедуры;
Также нужно помнить про разные форматы даты в JSON и 1С. Для преобразованию можно использовать функций:
Дата1С = ПрочитатьДатуJSON(ДатаВФорматеJSON, ФорматДатыJSON.ISO);
ДатаJSON = ЗаписатьДатуJSON(ТекущаяДата(), ФорматДатыJSON.ISO);
Для понимая что именно приходит в 1С с сайта в виде JSON можно Результат.ПолучитьТелоКакСтроку() посмотреть в структурированном виде, например при помощи JSON-Editro-online
Ну и чтобы играться с запросами в удобной среде конечно советую попробовать POSTMAN, что очень удобно.
Какие вообще запросы можно делать к Woocommerce API можно посмотреть в обширной документации
Я ищу метод как сначала авторизоваться , а после подключиться за данными.