admin Опубликовано 19 марта, 2022 Поделиться Опубликовано 19 марта, 2022 Речь в этой статтье пойдет о 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 И так на данный момент у нас готова часть которая отвечает за подключени и отправку данных по 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 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.