Паркфлаер это сообщество любителей радиоуправляемых моделей. Еще это магазин, в котором можно купить радиоуправляемые модели и комплектующие.

Радиоуправляемые модели самолетов, вертолетов, автомобилей, катеров, яхт и танков.

Гарантируем ваше удовольствие либо возврат денег. На сайте огромное количество отзывов о нашей работе и товарах.

Подключить свой магазин

Вы можете открыть свой магазин как внутри Паркфлаера, так и на собственном домене используя наш движек.
Мы сделали XML API или 1С API для синхронизации каталога товаров и состояний обработки заказов.

Паркфлаер берет комиссию порядка 10% без абоненсткой платы и без оплаты за установку при открытии магазина радиоуправляемой тематики.
Другие тематики согласуются отдельно.

Для настройки воспользуйтесь адресом sandbox.parkflyer.ru, именно там появится ваш каталог первоначально.
Затем, обратитесь в поддержку, мы согласуем договор и переведем ваш каталог на главный сайт.

Ниже приведена документация по XML API, документции.

1. Загрузка и обновление каталога 2. Получение способов доставки
3. Передача заказа поставщику
4. Синхронизация статусов заказа


1. Загрузка и обновление каталога

Загружать свои товары и каталог через WebDAV API на sandbox.parkflyer.ru;

Загрузка каталога товаров на сайт осуществляется в 3 шага:

- загрузка xml файла каталога
- загрузка файлов товаров(картинки и т.п)
- запуск обновления

Загрузка каких-либо файлов происходит по протоколу webDav:

- сервер WebDAV: http://www.parkflyer.ru/api/
- логин: ваш логин на сайте
- пароль: ваш пароль на сайте

Ниже описываются каждый из шагов.

Шаг 1. Загрузка xml файла каталога

Каталог товаров загружается xml файлом, формат которого представен ниже.
Название файла: catalog.xml.
Загружается в корень api (http://www.parkflyer.ru/api/).
Пример загрузки: curl -T путь_к_файлу_на_вашей_машине/catalog.xml "http://username:password@www.parkflyer.ru/api/"

Новые категории добавляются в базу. Категории и товары, информация о которых отсутсвует в запросе удаляются.
При повторной загрузке каталоге, если какое-либо поле отсутсвует, то соответствующая часть информации обновлена не будет.
Пример: Можно передать остатки на складе и цену, не передавая описание, изображение товара и прочее.
Для того, чтобы указать, что соответвующая информация должна быть удалена, нужно передать поле с пустым содержанием.
Пример: Чтобы удалить раздел персонификации из описания товара нужно передать в запросе пустое поле personification (<personification />). Если же поле personification в запросе отсутствует, то данный раздел будет оставлен без изменений.

Шаг 2. Загрузка файлов товаров(картинки и т.п)

Загружаются в папку files (http://www.parkflyer.ru/api/files/).
Путь до файла должен совпадать с путем до него в xml. Если в xml вы указали url до файла, то путь будет формироваться путем обрезания "http://".
Пример:
путь - file.espritmodel.com/airplanes/jet-arrows/a10-thunderbolt21.jpg
curl -T путь_к_файлу_на_вашей_машине/a10-thunderbolt21.jpg "http://username:password@www.parkflyer.ru/api/files/file.espritmodel.com/airplanes/jet-arrows/a10-thunderbolt21.jpg"

Шаг 3. Запуск обновления каталога и проверка статуса

После того как был загружен catalog.xml и другие необходимые файлы, можно начинать обновление каталога.
Запуск обнолвения:
Проверка статуса:
Пример загрузка из PHP

Если у вас не стоит модуль php5-curl - установите, ну думаю должен стоять на вашем хостинге.
Для ubuntu: sudo apt-get install php5-curl
Для windows: спросите у google.
Документация: http://php.net/manual/ru/book.curl.php
Пример загрузки файла методом PUT из php:
//-----------------------------------------------------------------------------------------------------
$username = "himodel";
$password = "your_password";
$namefile = "catalog.xml";
$url = "http://www.parkflyer.ru/api/$namefile";
$file = "/files/$namefile";
$fp = fopen($file, "r");
$curl = curl_init();
curl_setopt($curl, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_PUT, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_INFILE, $fp);
curl_setopt($curl, CURLOPT_INFILESIZE, filesize($file));
$return = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
fclose($fp);
//-----------------------------------------------------------------------------------------------------


XML формат каталога


<provider name="username" currency="валюта в которой цены магазина">
<categories>
<!-- ext_id - всегда строка! -->
<category ext_id="category_1" name="Название категории">
<products>
<!-- Товары, входящие в данную категорию. -->
<product ext_id="строка - id или sku"
slug="человеческий url"
weight="вес в граммах"
price="цена, по которой поставщик продает товар нам"
discount="скидка, которую поставщик делает нам"
[old_price='' Цена до объявления скидки (для отображения перечеркнутых огромных цен)]
stock="кол-во на складе"
rating="рейтинг по 5-ти бальной шкале"
name="Название в каталоге"
can_backorder="возможен ли предзаказ: 0 или 1"
[visual_type="тип для рендерера изображений"]
[show_in_category="показывать товар/вариацию в категориях: 0 или 1"]
[product_type="lipo/мотор/пропеллер/... для индексирования поисковиком"]>
<description></description>
<!-- Вариации товара
Если они у товара указаны - он в корзине НЕ добавляется.
Это виртуальный товар БЕЗ выбранной вариации.
-->
<product_variations>
<product ext_id="product_variation_1">
<product ext_id="product_variation_2">
...
</product_variations><!-- В некоторых магазинах некоторые товары стоят дешевле если их приобрести в дополнение к данному. Тут перечисляем ext_id товара и цену при покупке его совместно с данным -->
<kits>
<product ext_id="product_ext_id1" price="price" />
...
</kits>
<!-- Картинки указаывать обязательно, но бинарные данные
передаются отдельным запросом! -->
<files>
<file type="driver" url="URL файла на сайте поставщика" target_width="80" target_height="50" error="text"/>
<!- type
Если выставлен error, значит файл не смог высосаться покакой-либо причине и его показывать НЕ нужно!
thumbnail_image - маленькая картинка для каталога
product_image - картинка товара
attributes_image - картинка для пояснения техн. характеристик
user_image - пользовательские фотки
unknown - непонятно что
small_inline_image - картинка, отображаемая непосредственно в описании
large_inline_image - картинка высокого разрешения, на которую ссылается описание
driver - драйвера
manual - инструкции
firmware - прошивки
...
target_width ширина до которой необходимо смасштабировать картинку
target_height высота до которой необходимо смасштабировать
картинку. Мастабирование производится с сохранением соотношения сторон оригинала в соответсвии с http://parkflyer.ru:9898/#parkflyer.ru/w+tAwFeR1pc-H
-->
...
</files>
<videos>
<video type="description/user">HTML code</video>
<video>...</video>
...
</videos>
<personification>
Тут Мишин формат, или еще подумать.
</personification>
<!-- Информация о товаре для специфичного показа и поиска -->
<attributes>
<!-- Ключ -> мультизначение
В будущем структура усложнится в плане спецификации
'как именно' индексировать, например, физические характеристики
-->
<attribute name="имя" [indexed="индексирвоать: 0 или 1" type="int/bool/double/string"] />
<value>значение 1</value>
...
<value>значение n</value>
</attribue>
...
</attributes>
<related_products>
<!-- Другие товары, которые могут потребоваться в дополнение к
данному (отображаются на странице описания товара -->
<product ext_id="related_product_1">
...
<product ext_id="related_product_n">
</related_products>
</product>
...
</products>
<debug /> <!-- дебаг тэг, который диффер игнорирует -->
<categories>
...
<!-- Дочерние категории. -->
...
</categories>
</category>
...
<category ext_id="category_n">
...
</category>
</categories>
<!-- Обновление спец предложений и скидак -->
<offers>
<offer>
<start>Дата и время начала действия предложения в формате ISO 8601</start> <!-- Необязательное поле -->
<end>Дата и время окончания действия предложения в формате ISO 8601</end><!-- Необязательное поле -->
<!-- Товары, на которые распространяется предложение -->
<products>
<product id="product_1" >
<old_price>Цена до начала действия акции</old_price>
<!-- Новая цена - у нас в каталоге. -->
</product>
...
<product id="product_n" >
...
</product>
</products>
</offer>
</offers>
</provider>

2. Получение способов доставки от поставщика


Отправляем POST запрос с переменной req="XML корзины", на url поставщика.
Ответ должен быть также в XML формате.
URL - произвольный, выбирается поставщиком.
 
Формат запроса и ответа

Запрос:

<?xml version='1.0' encoding='utf-8'?>
<cart cart_id="number" provider_id="number">
<!-- товары корзины -->
<product local_id="number" ext_id="string">
<!-- local_id - номер в нашей системе учета, ext_id - в системе учета поставщика -->
<quantity>1</quantity> <!-- сколько хотим купить? -->
<personification> <!-- Информация для персонификации товара (имя на хвостовой балке и т.п.). -->
<field name="name1">value1</field>
...
<field name="nameN">valueN</field>
</personification>
</product>
...
<!-- информация о доставке -->
<shipping_info>
<firstname>Михаил</firstname>
<lastname>Яшинский</lastname>
<phone>84012750588</phone>
<address>ул. Офицерская 28 кв.7</address>
<postal_index>236000</postal_index>
<state>Калининградская</state>
<city>Калининград</city>
<country>RU</country>
</shipping_info>
</cart>
 
Ответ:

<?xml version='1.0' encoding='utf-8'?>
<answer cart_id="number">
<deleted> <!-- удаленные из каталога товары -->
<product local_id="number" ext_id="number">
...
</deleted>
<cantbackorder> <!-- товары, которые невозможно поставить на дозаказ -->
<product local_id="number" ext_id="number>
...
</cantbackorder>
<cart><!-- собранная корзина! -->
<!-- заполняется, только если нет удаленных или cantbackorder товаров -->
<product local_id="number" ext_id="number>
<quantity>number</quantity> <!-- Сколько хотят заказать. Копируется из запроса для удобства парсинга ответа. -->
<avail>number</avail> <!-- Сколько доступно на складе. -->
<weight>number</weight> <!-- Вес всех товаров quantity в граммах (не обязательный параметр)-->
<price>number</price> <!-- Цена в валюте магазина за quantity продуктов -->
<can_backorder>0/1</can_backorder> <!-- Возможен ли дозаказ. Если нет, значит продукт мог быть удален или дозаказ невозможен. -->
<product>
...
<!-- дополнительные упаковки -->
<additional_pack>
<price>number</price> <!-- цена за quantity упаковок -->
<quantity>number</quantity> <!-- сколько нужно упаковок -->
<avail>number</avail> <!-- скольку у магазина осталось упаковок -->
<weigth>number</weigth> <!-- вес всех упаковок quantity в граммах -->
</additional_pack>
...
<!-- способы доставки -->
<shipping_method index="number"> <!-- индекс используется для сортировки при показе -->
<name>Air Parcel (RUSSIAN FEDERATION) 4000g - 4499g</name>
<rus_name>Авиапосылка (Россия) от 4000 до 4499гр</rus_name>
<price>64.04</price>
<left>0</left> <!-- сколько в граммах осталось -->
<key>RUS_AIP_4000_4499</key> <!-- ключ в системе учета поставщика -->
<min_weight>4000</min_weight>
<max_weight>4499</max_weight>
</shipping_method>
...
 
<total> <!-- использовать для проверки корректности работы бакенда! -->
<weight>number</weight> <!-- общий выпарсенный вес корзины в граммах -->
<price>number</price> <!-- выпарсенная цена корзины без стоимости доставки -->
</total>
<items_under weight="number"> <!-- товары для заполнения почтового тарифа(не обязательный параметр) -->
<product local_id="number" ext_id="number"></product>
...
</items_under>
</cart>
</answer>


3. Передача заказа поставщику


Параметры
Для начала работы поставщик должен определить следующие параметры:
orderURL - URL на который отправляется запрос с информацией о заказе;
password - секретный пароль, используемый при расчете криптографического хэша. Необходим для аутентификации запросов.
 
Запрос от Паркфлаер к Поставщику
 
При получении POST запроса, на передачу заказа, поставщик проверяет значение криптографического хэша (sha1), который расчитывается в комбинации с совместно известным Поставщику и Паркфлаер секретным паролем.
Также поставщик может проверять IP-адрес, с которого он получил запрос.
 
Паркфлаер отправляет Поставщику HTTP(POST) запросы, результат обработки Поставщик возвращает в ответах на эти запросы.
При отсутствии ответа на запрос, Паркфлаер повторяет попытки.
 
Поставщик должен быть готов к тому, что запрос на передачу одного и того же заказа может приходить неоднократно (из-за проблем со связью или ошибок в ответе Поставщика на этот запрос). На повторные уведомления Поставщик должен отвечать "OK"(успешно обработано). Уникальность заказа определяется его номером (order_id).
 
Запрос состоит из двух переменных:
rqst - xml заказа, формат представлен ниже;
secret_key - хэш sha1, правила формирования описаны ниже.
 
Хэш формируется как последовательность значений ряда параметров, разделенных символом точка с запятой ";", которые можно взять из xml заказа.
Порядок следования параметров:
"order_id;price;shipping_price;password"
 
Результаты обработки запросов, возвращаемые Поставщиком:
ERROR - произошла какя-то ошибка при обработке заказа;
ERROR_KEY - ошибка авторизации (несовпадение хэша);
OK - успешно.
 
Формат запроса на создание заказа
 
<order order_id="303730" price="10000">
<product local_id="6457" ext_id="HD2830-12" slug="6457"><quantity>1</quantity><pers_info/></product>
<product local_id="7520" ext_id="ESC_B-12A" slug="7520"><quantity>2</quantity><pers_info/></product>
...
<shipping_info>
<method price="219" key="219">Почта России, бандероль 1-го класса.</method>
<firstname>Ivan</firstname>
<lastname>Ivanov</lastname>
<phone>79028980807</phone>
<address>ul. Moskovskaya 1-1</address>
<postal_index>119018</postal_index>
<state>Moskva</state>
<city>Moskva</city>
<country>RU</country>
</shipping_info>
</order>

4. Синхронизация статусов заказа


Отправляем GET запрос с переменной orders="номера заказов через зпт", на URL поставщика.
Ответ должен быть в XML формате.
URL - произвольный, выбирается поставщиком.
 
Формат ответа:
<orders>
<order id="номер заказа" status="статус" tracking_number="номер если есть" >msg</order>
<order id="номер заказа" status="статус" tracking_number="номер если есть" >msg</order>
....
</orders>
 
Возможные статусы:
"In Process" - в обработке;
"Shipped" - отправлен, с заполнением атрибута tracking_number, если есть;
"Canceled" - отменен, при возможности в тело <order>причина отмены</order>.
 
Пример запроса/ответа:
запрос
http://выбранный вами url?orders=153105,153242,152532
ответ
<?xml version="1.0" encoding="utf-8" ?>
<orders>
<order id="153105" status="Canceled" tracking_number="">отсутствует товар 2344</order>
<order id="153242" status="In Process" tracking_number=""></order>
<order id="152532" status="Shipped" tracking_number="10719971021477"></order>
</orders>
 


Обратная связь
/ Зарегистрироваться
Ваша страна:
Чтобы оформить заказ, выполните несколько простых шагов.
Для подробностей, наведите курсор на одну из картинок.
Удаленные товары