Ця стаття — нотатка про те, як із коду 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, можна дізнатися з докладної документації


Я ищу метод как сначала авторизоваться , а после подключиться за данными.