Блог Мазепина Василия

Пишу о том, что кажется интересным

Hello, Ecwid!

2015-08-02 01:06 | Комментарии

Доброго времени суток, коллеги и гости.

На своем месте постоянного труда я занимаюсь интеграцией коммерческой CRM-системы RetailCRM с различными интернет-площадками, будь то CMS, landing-page, или Saas-система. Как раз на последних и остановлюсь.
В последнее время я активно занимаюсь интеграцией и ее поддержкой таких систем, как InSales, Wikimart и Activizm. И пришел к нам клиент с такой Saas-системой, как Ecwid. Задачи полной интеграции передо мной не стояло, поэтому сделал лишь по потребности. А задача стояла в том, чтобы разобраться с механизмом вытаскивания через REST API.
Так как это может быть полезным и для Вас, решил описать мой путь.

Итак, что нам нужно:

  1. Необходимо зарегистрироваться:
  2. После этого мы авторизуем свою почту, и входим в наш личный кабинет
  3. Важное замечание: доступ к API тут дают только для платных аккаунтов. На странице документации четко написано, что для разработчиков возможен вариант предоставления демо-аккаунта со всеми возможностями платных аналогов. Этим я и воспользовался, написал с их руководством и мне предоставили такой аккаунт, на котором я и могу тестить свой код.
  4. Создал свое приложение, которое не будет публиковаться в Market'e. Ссылку на создание приложение мне прислали в ходе переписки с руководством.

Собственно, о чём это я

Задачу в общем то наполовину я выполнил, осталось лишь обратиться к API, проверить, что всё работает и отчитаться моему начальству об успешном завершению задачи. Насколько мне известно, планируется лишь единожды достать каталог товаров и их категорий. Но выполнять эту задачу буду либо не я, либо не сейчас, мое дело маленькое.
Поэтому я написал такой маленький класс, который только и умеет, что вытаскивать категории и товары:

EcwidClient.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php

/**
 * API-клиент для Ecwid
 * @author Mazepin Vasily
 */
class EcwidClient {
    /** Базовый URL для API методов */
    const BASE_REQUEST_URL = 'http://app.ecwid.com/api/v1';
    /** @var string Идентификатор магазина */
    private $storeId;
    /** @var string API-ключ для приложения */
    private $apiKey;

    /**
     * @param $storeId string Идентификатор магазина
     * @param $apiKey string API-ключ для приложения
     */
    public function __construct($storeId, $apiKey) {
        $this->apiKey = $apiKey;
        $this->storeId = $storeId;
    }

    /**
     * @param $url
     * @return mixed
     */
    private function request($url) {
        $secureParam = array(
          'secure_auth_key' => $this->apiKey
        );
        if (isset(parse_url($url)['query'])) {
            $url .= '&' . http_build_query($secureParam);
        } else {
            $url .= '?'. http_build_query($secureParam);
        }
        $headers[] = "Content-Type: application/x-www-form-urlencoded";
        $curl = curl_init();
        curl_setopt ($curl, CURLOPT_URL, $url);
        curl_setopt ($curl, CURLOPT_HEADER, 0);
        curl_setopt ($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt ($curl, CURLOPT_HTTPGET, 1);
        curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
        $body = curl_exec ($curl);
        $error = json_decode($body, true);
        $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        if ($httpcode == 200) {
            return json_decode($body);
        } else {
            throw new RuntimeException(isset($error['errorMessage'])?$error['errorMessage'] : 'Other Error');
        }
    }

    /**
     * @param string $parent
     * @return array|mixed
     */
    public function getCategories($parent = null)
    {
        $url = self::BASE_REQUEST_URL . "/" . $this->storeId . "/categories";
        if ($parent) {
            $url .= '?'. http_build_query(array('parent' => (string) $parent));
        }
        $categories = $this->request($url);
        return $categories;
    }

    /**
     * @return array|mixed
     */
    public function getProducts()
    {
        $url = self::BASE_REQUEST_URL . "/" . $this->storeId . "/products";
        $products = $this->request($url);
        return $products;
    }
}

Применить сие творение можно, например, так:

example.php
1
2
3
4
5
 <?php
 require_once 'EcwidClient.php';` <br/>
 $client = new EcwidClient('storeId', 'ApiKey');
 $categories = $client->getCategories();
 $products   = $client->getProducts();

Как видно из кода, здесь лишь минимальный набор методов, который позволит вытащить нам каталог категорий и товаров.
Если понадобится, то допишу еще методы, их создание будет лишь дело необходимости.
Быть может, многие скажут, что скорее всего уже есть подобные клиенты и я изобрел очередной велосипед. И это правда. Но мне так захотелось.

Пора спать…

На этом всё, что я хотел написать - написано. Надеюсь вам эта статья покажется полезной.

Комментарии