Перейти к содержанию
View in the app

A better way to browse. Learn more.

Русскоязычное сообщество Opencart

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

В связи с блокировкой банка QIWI оплата через сайт не возможна.
Для оплаты и получения дополнений просьба писать в личные сообщения 
Admin*у
или в Телеграмм https://t.me/pascha_opencart
После оплаты Вам так же будет доступно скачивание дополнений и обновлений на данном форуме

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

Вот и все. 

Последние посетители 0

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.