Перейти к содержанию
  • В связи с блокировкой банка QIWI оплата через сайт не возможна.
    Для оплаты и получения дополнений просьба писать в личные сообщения
    Admin*у
    После оплаты Вам так же будет доступно скачивание дополнений и обновлений на данном форуме

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


Рекомендуемые сообщения

Речь в этой статтье пойдет о 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.

И так :

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

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

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

if (!isset($this->request->get[‘api_token’])) { $this->request->get[‘api_token’] = ”; }

2. идем в файл catalog/model/account/api.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'");

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

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

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

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

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

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

Представим что у нас есть

Сайт-1 – сайт где надо обновить данные по товарам 

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

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

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

 

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

$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);

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

Идем в раздел System -> Users -> API

Screenshot_1-1024x452.jpg

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

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

Итак идем в папку catalog/controller/api на Сайте-1 и создаем файл updateproduct.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));
}
}

Вот и все. 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...