Програмування

1С8.3: отримання замовлень із WordPress і WooCommerce

Ця стаття — нотатка про те, як із коду 1С взаємодіяти з інтернет-магазином і за допомогою REST API WooCommerce отримувати замовлення та їхній вміст.

(статтю оновлено й доповнено 2021.12.01)

Для доступу без логіна й пароля використовується система JWT-токенів. Її суть у тому, що в заголовку запиту передається токен, пов’язаний із користувачем WordPress. За цим токеном WordPress розпізнає користувача.

Такі токени можна створювати й використовувати, встановивши один із плагінів:

  1. Плагін Advanced Access Manager. Дуже функціональний плагін, що дає змогу детально налаштувати права доступу за токенами, строк їхньої дії та оновлення. У мене на тестовому сайті він працював добре, але на старому сайті з десятками інших плагінів, на жаль, працювати відмовився.
  2. Плагін 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, можна дізнатися з докладної документації

Обговорення 1

Залишити коментар

Вашу електронну адресу не буде оприлюднено. Обов’язкові поля позначено *