Управление магазином ECWID из 1С

Вероятно многие (в том числе и я) используют для поддержки интернет-магазина стороннего поставщика, выплачивая ему энную сумму денег в месяц. Я выбрал ECWID. Не реклама, но не жалуюсь. Услуги вполне качественные. В этой статье пойдет речь  об инструментах, с помощью которых можно  из 1С через API Эквида общаться с их движком.

Для начала я завел на их сайте учетку, которой присваивают ИДМагазина. Затем я почитал их форумы и документацию про API на сайте api.ecwid.com. После этого решил приступить к написанию обработки, которая будет из 1С закачивать и обновлять данные о товарах в выделенную мне базу на Эквиде. Для начала таки мне пришлось купить первый платный пакет, чтобы получать обратную связь от техподдержки и оперировать сотней товаров ради отладки.

Чтобы ваша обработка имела доступ к оперированию данными в базе необходимо ее зарегистрировать и авторизовать.

Для этого вы сначала направляете через форму, которую найдете на сайте Эквида, запрос на регистрацию внешнего приложения. Получаете от тех. поддержки client_id и client_secret  (client_id это не ИДМагазина!).

Затем в адресной строке браузера вводите строку формата: «https://my.ecwid.com/api/oauth/authorize?client_id=<ВАШ client_id>&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=read_store_profile+update_store_profile+read_catalog+update_catalog+create_catalog+read_orders+update_orders+create_orders+read_customers+update_customers+create_customers+read_discount_coupons+update_discount_coupons+customize_storefront». В параметре scope плюсуются уровни доступа. Я перечислил все для полного охвата. После ввода этой строки в адресной строке браузера появится строка, которая будет в себя включать строку формата «?code=<временный код>». «ВременныйКод» ниже пригодится при авторизации.

Далее надо один раз для получения токена авторизовать ваше предложение. Я сделал это следующим кодом:

 

&НаКлиенте
Процедура Авторизоваться(Команда)
Если НЕ ЗначениеЗаполнено(ВременныйКод) Тогда
Сообщить("Не введен временный код. Его можно получить из адресной строки браузера.");
КонецЕсли;
HTTPСоединение = Новый HTTPСоединение("my.ecwid.com" ,,,,,Истина);//подключимся через https
HTTPЗапрос = Новый HTTPЗапрос("/api/oauth/token?client_id=<ВАШ client_id>&client_secret=<Ваш client_secret >&code="+СокрЛП(ВременныйКод)+"&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code");
Результат =  HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос); //POST
ЧтениеJson = Новый ЧтениеJson;
ЧтениеJson.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку("UTF-8"));
ПолучСтруктура = ПрочитатьJSON(ЧтениеJson);
Для каждого стр Из ПолучСтруктура Цикл

Если стр.Ключ = "access_token" Тогда

Объект.Токен = стр.Значение;

КонецЕсли;
КонецЦикла;
КонецПроцедуры

Объект.Токен надо куда-нибудь присвоить как константу, для его последующего использования для подключения к базе.

Токен получен, теперь можно манипулировать данными в базе Эквида для вашего магазина!

Добавить группу товаров (Объект.ИмяСервера = «app.ecwid.com»):

&НаКлиенте
Функция ДобавитьГруппу(стртаб, паренткод)
Заголовки = Новый Соответствие;
Заголовки.Вставить("Host",Объект.ИмяСервера);
Заголовки.Вставить("Content-Type","application/json;charset=utf-8");
Заголовки.Вставить("Cache-Control","no-cache");
СтрокаЗапроса = "{""name"": "+""""+стртаб.Наименование+""""+", ""description"": """", ""enabled"": true, ""orderBy"": 1"+?(ЗначениеЗаполнено(паренткод),", ""parentId"": "+паренткод,"")+"}";

HTTPСоединение = Новый HTTPСоединение(Объект.ИмяСервера ,,,,,Истина);//подключимся через https
HTTPЗапрос = Новый HTTPЗапрос("/api/v3/"+Объект.ИДМагазина+"/categories?token="+Объект.Токен, Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса,"UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
Результат =  HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);//POST
ЧтениеJson = Новый ЧтениеJson;
ЧтениеJson.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
ПолучСтруктура = ПрочитатьJSON(ЧтениеJson);
Для каждого стр Из ПолучСтруктура Цикл
Если стр.Ключ = "id" Тогда
Возврат стр.Значение;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции

Получить группы товаров:

&НаКлиенте
Функция ПолучитьСписокГруппНаСайте()
Заголовки = Новый Соответствие;
Заголовки.Вставить("Host",Объект.ИмяСервера);
Заголовки.Вставить("Content-Type","application/json;charset=utf-8");
Заголовки.Вставить("Cache-Control","no-cache");
HTTPСоединение = Новый HTTPСоединение(Объект.ИмяСервера ,,,,,Истина);//подключимся через https
HTTPЗапрос = Новый HTTPЗапрос("/api/v3/"+Объект.ИДМагазина+"/categories?token="+Объект.Токен, Заголовки);
Результат =  HTTPСоединение.Получить(HTTPЗапрос); //GET
ЧтениеJson = Новый ЧтениеJson;
ЧтениеJson.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
ПолучСтруктура = ПрочитатьJSON(ЧтениеJson);
ТабГрупп = ПолучитьТаблицуГрупп();
Для каждого стр Из ПолучСтруктура Цикл
Если стр.Ключ = "items" Тогда
МассивГрупп = стр.Значение;
Для каждого стр Из МассивГрупп Цикл
НоваяСтрокаГруппы = ТабГрупп.Добавить();
НоваяСтрокаГруппы.ИД = стр.id;
Попытка
НоваяСтрокаГруппы.ИДРодителя = стр.parentId;
Исключение
НоваяСтрокаГруппы.ИДРодителя = "";
КонецПопытки;
НоваяСтрокаГруппы.Наименование = стр.name;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат ТабГрупп;
КонецФункции
&НаСервере
Функция ПолучитьТаблицуГрупп()
ТаблицаГруппаСайта = Новый ТаблицаЗначений;
ТаблицаГруппаСайта.Колонки.Добавить("ИД");
ТаблицаГруппаСайта.Колонки.Добавить("ИДРодителя");
ТаблицаГруппаСайта.Колонки.Добавить("Наименование");
Возврат ТаблицаГруппаСайта ;
КонецФункции
 

Создать товар в магазине:

&НаКлиенте
Функция СоздатьТоварНаСайте(строкатовара)
СтруктураТовара     = ПолучитьСтруктуруТовараИзБазы(строкатовара);
СтрокаЗапроса ="{""name"": "+""""+СтруктураТовара.Наименование+""","+
"""sku"": "+""""+СтруктураТовара.Артикул+""","+
"""quantity"": "+СтруктураТовара.Количество+","+
"""price"": "+СтруктураТовара.ЦенаПродажи+","+
?(ЗначениеЗаполнено(СтруктураТовара.Вес),"""weight"": "+СтруктураТовара.Вес+",","")+
"""description"": "+""""+СтруктураТовара.Описание+""","+
"""categoryIds"": "+"["+СтруктураТовара.НомерКатегории+"],"+
"""attributes"": "+"[{""id"": 7894117, ""value"": "+""""+СтруктураТовара.Бренд+"""},"+
?(ЗначениеЗаполнено(СтруктураТовара.ОЕМ),"{""id"": 7894121, ""value"": "+""""+СтруктураТовара.ОЕМ+"""},","")+
?(ЗначениеЗаполнено(СтруктураТовара.Размеры),"{""id"": 8934007, ""value"": "+""""+СтруктураТовара.Размеры+"""},","")+
"{""id"": 7894120, ""value"": "+""""+СтруктураТовара.КодПоставщика+"""}]}";
Заголовки = Новый Соответствие;
Заголовки.Вставить("Host",Объект.ИмяСервера);
Заголовки.Вставить("Content-Type","application/json;charset=utf-8");
Заголовки.Вставить("Cache-Control","no-cache");

HTTPСоединение = Новый HTTPСоединение(Объект.ИмяСервера ,,,,,Истина);//подключимся через https
HTTPЗапрос = Новый HTTPЗапрос("/api/v3/"+Объект.ИДМагазина+"/products?token="+Объект.Токен, Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса,"UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
Результат =  HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);//POST
ЧтениеJson = Новый ЧтениеJson;
ЧтениеJson.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
Попытка
ПолучСтруктура = ПрочитатьJSON(ЧтениеJson);
Исключение
Сообщить("Не создан товар "+СтруктураТовара.Наименование+", с артикулом "+СтруктураТовара.Артикул);
КонецПопытки;
Для каждого стр Из ПолучСтруктура Цикл
Если стр.Ключ = "id" Тогда
Возврат стр.Значение;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции // СоздатьТоварНаСайте()

Обновить товар, уже существующий в магазине:

&НаКлиенте
Функция ОбновитьТоварНаСайте(строкатовара)
СтруктураТовара     = ПолучитьСтруктуруТовараИзБазы(строкатовара);
СтрокаЗапроса =//"{""name"": "+""""+СтруктураТовара.Наименование+""","+
//  """sku"": "+""""+СтруктураТовара.Артикул+""","+
"{""quantity"": "+СтруктураТовара.Количество+","+
"""price"": "+СтруктураТовара.ЦенаПродажи+","+
?(ЗначениеЗаполнено(СтруктураТовара.Вес),"""weight"": "+СтруктураТовара.Вес+",","")+
//  """description"": "+""""+СтруктураТовара.Описание+""","+
//  """categoryIds"": "+"["+СтруктураТовара.НомерКатегории+"],"+
"""attributes"": "+"[{""id"": 7894117, ""value"": "+""""+СтруктураТовара.Бренд+"""}"+
?(ЗначениеЗаполнено(СтруктураТовара.ОЕМ),",{""id"": 7894121, ""value"": "+""""+СтруктураТовара.ОЕМ+"""}","")+
?(ЗначениеЗаполнено(СтруктураТовара.Размеры),",{""id"": 8934007, ""value"": "+""""+СтруктураТовара.Размеры+"""}]}","]}");
//                      "{""id"": 7894120, ""value"": "+""""+СтруктураТовара.КодПоставщика+"""}]}";
Заголовки = Новый Соответствие;
Заголовки.Вставить("Host",Объект.ИмяСервера);
Заголовки.Вставить("Content-Type","application/json;charset=utf-8");
Заголовки.Вставить("Cache-Control","no-cache");

HTTPСоединение = Новый HTTPСоединение(Объект.ИмяСервера ,,,,,Истина);//подключимся через https
HTTPЗапрос = Новый HTTPЗапрос("/api/v3/"+Объект.ИДМагазина+"/products/"+СокрЛП(строкатовара.НомерНаСайте)+"?token="+Объект.Токен, Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса,"UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
Результат =  HTTPСоединение.Записать(HTTPЗапрос);//PUT
ЧтениеJson = Новый ЧтениеJson;
ЧтениеJson.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
ПолучСтруктура = ПрочитатьJSON(ЧтениеJson);
Для каждого стр Из ПолучСтруктура Цикл
Если стр.Ключ = "updateCount" Тогда
Возврат стр.Значение;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции // СоздатьТоварНаСайте()

Добавить картинку к товару:

&НаКлиенте
Функция ЗаписатьКартинкуНаСайт(НомерТовараУПоставщика, НомерТовараНаСайте)
//сначала считаем картинку с поставщика
Соединение = Новый HTTPСоединение("мойпоставщик.ru");
Каталог = "/uploads/items/";
АдресКартинки = Каталог+СокрЛП(НомерТовараУПоставщика)+".jpg";
Запрос = Новый HTTPЗапрос(АдресКартинки);
Ответ = Соединение.Получить(Запрос);
ДвоичныеДанныеКартинки = Ответ.ПолучитьТелоКакДвоичныеДанные();

//теперь запишем картинку на сайт
Заголовки = Новый Соответствие;
Заголовки.Вставить("Host",Объект.ИмяСервера);
Заголовки.Вставить("Content-Type","application/json;charset=utf-8");
Заголовки.Вставить("Cache-Control","no-cache");

HTTPСоединение = Новый HTTPСоединение(Объект.ИмяСервера ,,,,,Истина);//подключимся через https
HTTPЗапрос = Новый HTTPЗапрос("/api/v3/"+Объект.ИДМагазина+"/products/"+СокрЛП(НомерТовараНаСайте)+"/image?token="+Объект.Токен, Заголовки);
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеКартинки);
Результат =  HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);//POST
ЧтениеJson = Новый ЧтениеJson;
ЧтениеJson.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
ПолучСтруктура = ПрочитатьJSON(ЧтениеJson);
Для каждого стр Из ПолучСтруктура Цикл
Если стр.Ключ = "id" Тогда
Возврат стр.Значение;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции // ЗаписатьКартинкуНаСайт()

Надеюсь, этот базовый набор функций вам поможет начать и развивать инструментарий дальше.

3 Comments

  1. serg1974

    Вау! Абсолютно незаслуженно обошли вниманием вашу работу! Отдельное спасибо что выложили бесплатно коды текстом!! Буду изучать Ваш опыт — может что то получится и у меня!

    Reply
  2. Sardukar

    (1) serg1974, просто ECWID в России еще только набирает популярность. Думаю все еще впереди. Лично мне нравится как они работают с клиентами. Есть с кем сравнить. Я сам тоже искал коды, но наткнулся только на платную разработку и то код обмена у них закрыт. Мне это не понравилось и я решил сам написать и поделиться наработками с другими.

    Reply
  3. ScarFace

    Спасибо!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *