OpenCart Club

Разработка под Opencart

API Opencart 3.* от А до Я как работает и как использовать

Приветствую всех читателей.

Давно я уже не писал ничего интересного, что-то забегался. Но вот подвернулась интересная задача которую надо было реализовать, и чесно говоря я ужедавно хотел разобраться в этом функционале opencart? но все никак не доходили руки.

Речь в этой статтье пойдет о API opencart 3.* Насколько я понял , то само АПИ 3.* и 2.3 не особо отличаются, но я разбирал именно opencart 3.0.2.1 с большой вероятностью в ocstore 3.0 апи точно такой же и эта статья подойдет и для тех кто использует русскую сборку данного движка. Но все же могут быть отличия так-что разбирайтесь сравнивайте и реализуйте.

И так, ближе к делу, как говорится. Поступила заявка реализовать обновление количества товаров в магазине с 1С. Причем я уже делал данную процедуру, но только магазин выступал клиентом а 1С  – сервером. Тоесть я с магазина делал запрос к API 1C и в ответ получал данные которые обрабатывал уже в своем скрипте. Но сейча какраз все наоборот. 1С делает запрос к REST API opencart и отдает мне данные с которыми я должен работать.

Сначала опишу в двух словах как это работает пошагово.

Шаг №1 Подключение со стороны 1С к сайту

Шаг №2 Сайт проверяет логин и пароль и в ответ отдает токен сесии

Шаг 3 1С делает повторный запрос но уже к контроллеру обновления даннх товаров

По сути все довольно просто и можно было бы написать самостоятельно все нужные контроллеры. НО зачем? Ведь в опенкарт 3 уже есть REST API в которого уже есть функционал авторизации. И осталось только написать обновление товаров. Но не тут то было. Разработчики движка наверное уж большо спешили выпустить новый релиз и наделали ошибок. Да и в документации по использованию API привелм примеры не на php, как мне бы хотелось, а на piton ) Ну ничего. Сейчас со всем разберемся.

 

Но перед тем как начать писать свое АПИ подключение надо бы поправить баги которые допустили разработчики в opencart 3/ БУдем надеятся что они хи исправят но поканужно внести пару парвок. Если этого не сделать то в момент подключения вы будете получать ошибку Notice: Undefined index: api_token in /catalog/controller/startup/session.php on line 8.

И так :

  1. идем  в файл /catalog/controller/startup/session.php и ищем строку

[php]$this->db->query(“DELETE FROM `” . DB_PREFIX . “api_session` WHERE TIMESTAMPADD(HOUR, 1, date_modified) < NOW()”);[/php]

и перед этой сторокой надо добавить:

[php]if (!isset($this->request->get[‘api_token’])) { $this->request->get[‘api_token’] = ”; } [/php] 2. идем в файл catalog/model/account/api.php и ищем строку:

[php]$query = $this->db->query(“SELECT * FROM `” . DB_PREFIX . “api` WHERE `username` = ‘” . $this->db->escape($username) . “‘ AND `key` = ‘” . $this->db->escape($key) . “‘ AND status = ‘1’”); [/php] в этой строке также допущена ошибка пропущен and. Ниже я указал правильную строку, просто замените на нее: [php] $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "api` WHERE `username` = '" . $this->db->escape($username) . "' AND `key` = '" . $this->db->escape($key) . "' AND status = '1'"); [/php]

3. Последний шаг и можно приступать. Идем в файл /catalog/controller/api/login.php и ишем там строку :

[php]$session = new Session($config->get('session_engine'), $registry);[/php]

 

И тут разработчики чуток на путали. правильный синтаксис такой :

[php]

$session = new Session($this->config->get('session_engine'), $this->registry);

[/php]

Вот и все. Можно идти дальше и сделать само потключение.

И так поехали.

Представим что унас есть Сайт-1 – сайт где надо обновить данные по товарам и Сайт-2 – откуда надо подключится и выслать те самые данные.

Подключение к API opencart 3

Для начала на Сайте-2 (откуда мы хотим подключится) создадим простой файл в корне (разместить вы его можете где угодно, но для примера я выбрал именно корень сайта). И так создадим файл connect.php. Я решил использовать для соединения с другим сайтом CURL. И в этом файле описываю саму функцию присоединения к удаленному сайту – Сайт-1

текст файл выглядит так:

[php]

$apiKey = "r9DkS8KmRO5YNCHoQFh16ZQwHW5f3yf9ClETja06un2dk17Q078AoSWoAjLCx7zNUhbT2oSsq8xdYg7iUt0267aRPoaCCA4jdkHEjXI1RZ9IcVWHQE7lClm5dCHpdwo6gAfJC9pJUUNVA7WZkl1jDDicTchVsGkcXXzgKjULfBLuSpdkbtOFUEl3wmy9OWzFR01r0zGsp6gmjfNBmjlUtxtS8RxydlsSyrO0effEBWJkU4sfNDPfbmF6LiFOAyoa"; //Whatever you put in System -> Users -> API
$url = "http://opencart3.myopencart.club/index.php?route=api/login";
$curl = curl_init($url);

$post = array (
    'username' => 'Default',
    'key' => $apiKey
);
curl_setopt_array( $curl, array(
    CURLOPT_RETURNTRANSFER=> TRUE,
    CURLOPT_POSTFIELDS      => $post
) );

$raw_response = curl_exec( $curl );
//var_dump($raw_response);
$response = json_decode($raw_response);
curl_close($curl);
$api_token = $response->api_token;
// создем масив товаров для обновления информации
$products = Array (
    '123' => Array (
            'price' => 350,
            'quantity' => 10,
            'product_discount' => 100
             ),
    '555' => Array (
            'quantity' => 44
            )
);
// подключаемся к сайту 2 и к вновь созданному файлу которій будет отвечать за обновление товаров. Создание его я опишу ниже.
$url = "http://opencart3.myopencart.club/index.php?route=api/updateproduct&api_token=".$api_token;
$post = $products;

$curl = curl_init($url);
curl_setopt_array( $curl, array(
CURLOPT_RETURNTRANSFER=> TRUE,
CURLOPT_POSTFIELDS => $post
) );
$raw_response = curl_exec( $curl );
var_dump($raw_response);

[/php]

Имя пользователя и пароль берем в админке Сайта-1.
Идем в раздел System -> Users -> API

opencart api key



И так на данный момент у нас готова  часть которая отвечает за подключени и отправку данных по API.

Теперь осталось создать файл который будет обрабатывать полученные данный с сайта-2 на сайте-1.

Итак идем в папку catalog/controller/api на Сайте-1 и создаем файл updateproduct.php

Саму логику обновлеия данных по товарам я не буду описывать.

Просто приведу пример получения данных и отправки ответа.

[php]

<?php
class ControllerApiUpdateproduct extends Controller {
public function index() {
$this->load->language(‘api/currency’);

$json = array();

if (!isset($this->session->data[‘api_id’])) {
$json[‘error’] = $this->language->get(‘error_permission’);
} else {
$this->load->model(‘catalog/product’);

if ($this->request->post[‘product’]) {
// Здесь будет ваша логика обработки полученных товаров

$json[‘success’] = $this->language->get(‘text_success’);
} else {
$json[‘error’] = $this->language->get(‘error_currency’);
}
}

if (isset($this->request->server[‘HTTP_ORIGIN’])) {
$this->response->addHeader(‘Access-Control-Allow-Origin: ‘ . $this->request->server[‘HTTP_ORIGIN’]);
$this->response->addHeader(‘Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS’);
$this->response->addHeader(‘Access-Control-Max-Age: 1000’);
$this->response->addHeader(‘Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With’);
}

$this->response->addHeader(‘Content-Type: application/json’);
$this->response->setOutput(json_encode($json));
}
}

[/php]

 

Вот и все. Готово. Все должно работать как часы )))

Хорошего все мдя. Пишите комменты. и свое мнение.

1 Discussion on “API Opencart 3.* от А до Я как работает и как использовать”
  • Спаcибо. Немного подправлю для копипастеров. Если на сервере проверяем в посте product, то и добавить его надо
    $products = array (
    ‘product’=>array(
    ‘851’ => array (
    ‘price’ => 350,
    ‘quantity’ => 10,
    ‘product_discount’ => 100
    ),
    ‘859’ => array (
    ‘quantity’ => 44
    )
    )
    );
    А чтоб нормально отправился
    CURLOPT_POSTFIELDS => http_build_query($products)

Напишите

Ваш email никому не покажем