Содержание
Интеграция Опенкарт с учетными системами / Хабр
Опенкарт — один из самых распространенных интернет-магазинов. Во многих случаях возникает задача интеграции со складской учетной системой (чаще всего с 1С).
Интеграция предполагает, как минимум, передачу заказов с ИМ в складскую систему для их обработки и отправки товаров покупателю и обновление количества товаров в ИМ в соответствии с реальным наличием на складе.
Также часто стоит задача засинхронизировать сами товары, их параметры, фотографии и так далее.
Сложность в том что, как правило, изменения нужно делать и в ИМ и в складской системе а значит, разработчик должен знать обе системы или нужно привлекать еще одного разработчика. Существуют готовые решения но они обычно требуют допиливания или платные и все равно требуют допиливания.
Для решения данной проблемы создан модуль к Опенкарт который расширяет API опенкарта позволяя вносить изменения только на стороне учетной системы.
Модуль бесплатный с открытым кодом, расположен на гитхабе.
Модуль разрабатывался под конкретную учетную систему, но написан так, что может использоваться любыми другими сторонними программами.
Устанавливается модуль в ИМ либо стандартным образом через админку либо простым копированием в папку catalog/controller/api. Модуль состоит из одного файла. Никаких изменений в настройках или структуре опенкарта не требуется.
Разумеется, в админке нужно сгенерить API KEY который потом будет задан в настройках складской системы для залогинивания в API перед обращением к нему.
Работа проверена с Опенкарт 2.3 и 3.0
Модуль предоставляет несколько функций API для работы с заказами и товарами.
В соответствии с соглашениями опенкарт, параметры передаются методом POST и перед обращением к API должен быть получен специальный токен. Обмен данными производится в формате JSON. Все это стандартные средства работы с API Опенкарта.
Работа с заказами
Когда в ИМ появляются новые заказы они должны импортироваться в складскую систему, то есть на их основе должны быть созданы соответствующие документы (записи и т. д.) в складской системе, обработаны и отправлены заказчику
Импорт заказов выполняется вызовом функции orders().
Чтобы получить только нужные ордера передается параметр status_id со статусом ордеров. Поскольку статусы в опенкарте создаются админке и могут быть какими угодно, то предварительно нужно получить список статусов методом statuses(), возвращающим массив ключ-значение с идентификаторами и названиями статусов.
Эти статусы учетная система предъявяет для уточнения в каком нибудь выпадающим списке. Менеджер выбирает с этих статусов тот, что соответствует новому заказу.
С заказом приходит список товаров и данные клиента для доставки.
Для идентификации заказов ИМ учетная система должна записать ID заказов в какой то атрибут внутреннего заказа. По этим идентификаторам обновляются статусы в ИМ а также проверяется что данный заказ уже импортирован.
Обновление статусов в ИМ производится функцией updateorder()
Менеджер выбирает нужные заказы (учетной системы) в нужном состоянии(например заказ в обработке) и обновляет статусы соответствующих исходных заказов в ИМ. Передается массив ключ-значение — идентификатор заказа ИМ и id статуса ИМ из предложенного системой выпадающего списка.
Например заказы могут быть обновлены после того как приняты в обработку, отправлены клиенту, доставлены клиенту и закрыты. Это на усмотрение менеджера.
Разумеется если статусы в обоих системах четко определены и не меняются то вызовы API с фиксированными статусами можно повесить на какой либо планировщик и вызывать автоматически.
Работа с товарами
При работе с товарами чаще всего необходимо обновлять в магазине актуальное количество товара на складе а также цены.
Чтобы выполнять обмен данными товары в ИМ должны быть засинхронизированы с товарами на складе. Соответствие обеспечивается артикулом, но при желании можно скорректировать код и использовать другой параметр, например название (хоть это и не лучшая идея).
Для добавления товаров в магазин служит функция addproducts().
В магазин передаются товары, которых там еще нет. Для того чтобы не передать дубли можно получить с магазина список существующих там артикулов методом articles().
Чтобы товары попали сразу в нужную категорию нужно предварительно получить список категорий методом cats() и дать менеджеру возможность выбрать нужную категорию из списка. После этого товары дооформляются стандартными средствами в админ панели Опенкарт.
Товар передается в виде наименования, артикула, описания (если есть), цены и количества. В ряде случаев стоит задача передать со склада атрибуты, все описания, фотографии и так далее. Но на этот счет есть сомнения в целесообразности создавать все это на стороне учетной системы.
Во первых, для классического складского учета достаточно названия и артикула, то есть тех данных, которые используются в накладных и заказах.
Во вторых, в админке ИМ уже есть штатные средства для формирования карточек товара.
В третьих, передача и согласование таких сложных структур как дерево категорий, атрибуты, изображения и так далее дело весьма хлопотное и как следует из вышеуказанного, не нужное.
Подобные решения имеют смысл если учетная система работает и с другими ресурсами, выгружает данные в маркетплейсы например. Хотя уверен, есть модули к опенкарту, которые выгружают характеристики и фотографии товары в маркетплейсы с опенкарта.
Если оказалось что в ИМ уже есть какие то товары на момент внедрения складской системы то можно получить список товаров из ИМ методом getproducts() и добавить в справочник товаров учетной системы. Уникальность так же проверяется по артикулу.
Далее основные функции updatequantity() и updateprice() для обновления количества и цены в ИМ в соответствии с данными склада. Функции передают массив ключ значение (артикул-количество или цена) и не требуют параметров то есть могут запускаться планировщиком.
Как уже упоминалось, преимущество модуля — отсутствие каких либо изменений в коде Опенкарта. При необходимости модуль легко дорабатывается — чтобы передать дополнительные данные нужно просто добавить новый ключ в соответствующий ассоциативный массив. Данные будут упакованы и затем распакованы в том же виде на приемной стороне.
На случай если учетная система написана на PHP есть готовая функция для вызова API опенкарта (строчку сообщения системе об ошибке просто убрать).
Как вывести товары с нулевой ценой в конце списка?
Уроки по Opencart
Урок 21 Товары с «нулевой» ценой в конце списка
valdemariuses
|
Янв 28, 2020
Нулевая цена для товара в магазине на базе opencart (ocstore) может использоваться для решения разных задач. Например, в качестве основной цены используется цена опции. А иногда нулевую цену используют как условия для запрета совершения покупки данного товара, оставляя при этом товар в каталоге для расширения семантики магазина.
Однако наличие таких товаров вперемешку с товарами, которые можно приобрести, портит визуальную картину и раздражает покупателей. Чтобы исправить ситуацию, такие товары лучше всего выводить в конце общего списка доступных к покупке товаров. И сделать это очень просто. Изменения вносятся только в один файл, а именно в модель продукта по адресу
| catalog/model/catalog/product.php |
В ocstore 2.1 примерно строка 160 метод getProducts(), ocstore 2.3 примерно строка 169 метод getProducts()
Находим код
1 2 3 4 5 6 7 8 9 10 11
| if (isset($data[‘sort’]) && in_array($data[‘sort’], $sort_data)) { if ($data[‘sort’] == ‘pd.name’ || $data[‘sort’] == ‘p.model’) { $sql . = » ORDER BY LCASE(» . $data[‘sort’] . «)»; } elseif ($data[‘sort’] == ‘p.price’) { $sql .= » ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)»; } else { $sql .= » ORDER BY » . $data[‘sort’]; } } else { $sql .= » ORDER BY p.sort_order»; } |
и меняем его на следующий
1 2 3 4 5 6 7 8 9 10 11
| if (isset($data[‘sort’]) && in_array($data[‘sort’], $sort_data)) { if ($data[‘sort’] == ‘pd.name’ || $data[‘sort’] == ‘p.model’) { $sql .= » ORDER BY IF(p.price = ‘0’, 1, 0), LCASE(» . $data[‘sort’] . «)»; } elseif ($data[‘sort’] == ‘p.price’) { $sql .= » ORDER BY IF(p.price = ‘0’, 1, 0), (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p. price END)»; } else { $sql .= » ORDER BY IF(p.price = ‘0’, 1, 0), » . $data[‘sort’]; } } else { $sql .= » ORDER BY IF(p.price = ‘0’, 1, 0), p.sort_order»; } |
И сохраняем. Если используются модификаторы, не забываем обновлять кеш модификаторов. Смотрим и радуемся результату. Также как всегда выкладываю готовый модификатор.
СКАЧАТЬ МОДИФИКАТОР
Метод getProducts в system/library/cart.php в OpenCart 1.5.6.4 и более ранних версиях позволяет удаленным злоумышленникам проводить
CVE-2014-3990 : Метод Cart::getProducts в system/library/cart.php в OpenCart 1.5.6.4 и ранее позволял удаленным злоумышленникам проводить
(например: CVE-2009-1234 или 2010-1234 или 20101234)
Переключитесь на https:// |
— |
# | Тип продукта | Поставщик | Продукт | Версия | Обновление | Издание | Язык | |
---|---|---|---|---|---|---|---|---|
1 | Заявка | Опенкарт | Опенкарт | * | * | * | * | Сведения о версии Уязвимости |
—
Количество затронутых версий по продукту
Продавец | Товар | Уязвимые версии |
---|---|---|
Опенкарт | Открытая тележка | 1 |
—
Ссылки для CVE-2014-3990
https://github. com/opencart-ce/opencart-ce/commit/c2aafc823bd85876f5e888f8ebc421069a5e076f ПОДТВЕРЖДЕНИЕ |
http://www.securityfocus.com/bid/68529 BID 68529 |
http://seclists.org/fulldisclosure/2014/Jul/67 FULLDISC 20140714 [KIS-2014-08] OpenCart <= 1.5.6.4 (cart.php) Уязвимость PHP, связанная с внедрением объектов |
http://packetstormsecurity.com/files/127460/OpenCart-1.5.6.4-PHP-Object-Injection.html |
http://karmainsecurity.com/KIS-2014-08 |
http://www.securityfocus.com/archive/1/532763/100/0/threaded BUGTRAQ 20140714 [KIS-2014-08] OpenCart <= 1.5.6.4 (cart.php) Уязвимость PHP, связанная с внедрением объектов |
—
Модули Metasploit, связанные с CVE-2014-3990
Нет никаких модулей metasploit, связанных с этой записью CVE (пожалуйста, посетите www.metasploit.com для получения дополнительной информации)
CVE является зарегистрированным товарным знаком корпорации MITRE, а официальным источником содержания CVE является
CVE-сайт MITRE.
CWE является зарегистрированным товарным знаком корпорации MITRE, а официальным источником контента CWE является
Веб-сайт CWE MITRE.
OVAL является зарегистрированным товарным знаком The MITRE Corporation, а официальным источником контента OVAL является
Веб-сайт MITRE OVAL.
Использование этой информации означает согласие на использование в состоянии КАК ЕСТЬ.
НИКАКИХ гарантий, подразумеваемых или иных, в отношении этой информации или ее использования.
Любое использование этой информации осуществляется на риск пользователя.
Пользователь несет ответственность за оценку точности, полноты или полезности любой информации, мнения, совета или другого контента.
КАЖДЫЙ ПОЛЬЗОВАТЕЛЬ НЕСЕТ ЕДИНСТВЕННУЮ ОТВЕТСТВЕННОСТЬ ЗА ЛЮБЫЕ последствия его или ее прямого или косвенного использования данного веб-сайта.
ОТ ВСЕХ ГАРАНТИЙ ЛЮБОГО РОДА ЯВНО ОТКАЗЫВАЕТСЯ. Этот сайт НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ,
КОСВЕННЫЕ или любые другие потери.
НВД — cve-2014-3990
Текущее описаниеМетод Cart::getProducts в system/library/cart. php в OpenCart 1.5.6.4 и более ранних версиях позволяет удаленным злоумышленникам проводить атаки с подделкой запросов на стороне сервера (SSRF) или, возможно, проводить атаки XML External Entity (XXE) и выполнить произвольный код с помощью созданного сериализованного объекта PHP, связанного с параметром количества в запросе на обновление. Просмотр описания анализа СерьезностьСерьезность и показатели CVSS 3.x: НИСТ: НВД База Вектор: Аналитики NVD используют общедоступную информацию для сопоставления векторных строк и показателей CVSS. Мы также отображаем любую информацию CVSS, представленную в списке CVE от CNA. Примечание. Аналитики NVD опубликовали оценку CVSS для этого CVE на основе общедоступной информации на момент проведения анализа. CNA не предоставил оценку в списке CVE. Перечень слабых сторон
Известные уязвимые конфигурации программного обеспечения Коммутатор
CPE загружаются, подождите. |