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 можно посмотреть в обширной документации

Оставьте комментарий

Ваш адрес email не будет опубликован.