gifts2017

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

Опубликовал Сергей Кирпо (Sardukar) в раздел Обмен - Интеграция с WEB

Вероятно многие (в том числе и я) используют для поддержки интернет-магазина стороннего поставщика, выплачивая ему энную сумму денег в месяц. Я выбрал 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" Тогда        
            Возврат стр.Значение;        
        КонецЕсли;     
    КонецЦикла;
    Возврат Неопределено;
КонецФункции // ЗаписатьКартинкуНаСайт()

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

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сергей Аблаев (serg1974) 06.05.16 14:19
Вау! Абсолютно незаслуженно обошли вниманием вашу работу! Отдельное спасибо что выложили бесплатно коды текстом!! Буду изучать Ваш опыт - может что то получится и у меня!
2. Сергей Кирпо (Sardukar) 07.05.16 05:00
(1) serg1974, просто ECWID в России еще только набирает популярность. Думаю все еще впереди. Лично мне нравится как они работают с клиентами. Есть с кем сравнить. Я сам тоже искал коды, но наткнулся только на платную разработку и то код обмена у них закрыт. Мне это не понравилось и я решил сам написать и поделиться наработками с другими.