Getproducts opencart: ModelCatalogProduct::getProducts(…) > OpenCart документация разработчика

Интеграция Опенкарт с учетными системами / Хабр

Опенкарт — один из самых распространенных интернет-магазинов. Во многих случаях возникает задача интеграции со складской учетной системой (чаще всего с 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://
Дом
Просмотр:
Продавцы
Товары
Уязвимости по дате
Уязвимости по типу
Отчеты:
Отчет о результатах CVSS
Распределение баллов CVSS
Поиск :
Поиск продавца
Поиск продукта
Поиск версии
Поиск уязвимостей
По ссылкам Microsoft
Топ 50 :
Поставщики
Оценки поставщика Cvss
Товары
Оценка Cvss продукта
Версии
Другое :
Бюллетени Майкрософт
Записи об ошибках
Определения CWE
О нас и контакты
Обратная связь
CVE-справка
Часто задаваемые вопросы
Статьи
Внешние ссылки:
Веб-сайт NVD
Веб-сайт CWE

Метод Cart::getProducts в system/library/cart. php в OpenCart 1.5.6.4 и более ранних версиях позволяет удаленным злоумышленникам проводить атаки с подделкой запросов на стороне сервера (SSRF) или, возможно, проводить атаки XML External Entity (XXE) и выполнять произвольный код через созданный сериализованный объект PHP, связанный с параметром количества в запросе на обновление.
Дата публикации: 20 марта 2018 г. Дата последнего обновления: 25 апреля 2019 г.

Прокрутить до

Заявления поставщиков(0)
Дополнительные данные о поставщике(0)
Определения ОВАЛ(0)
Уязвимые продукты(0)
# Vulns по продуктам
Ссылки(0)
Модули Metasploit(0)

Комментарии

Внешние ссылки

Советы Secunia
Рекомендации XForce
Подробности об уязвимости в NVD
Подробная информация об уязвимости в Mitre
Плагины Nessus

Первое руководство по CVSS

Поиск в Твиттере

Поиск на YouTube

Искать в Google


Оценки CVSS и типы уязвимостей

Оценка CVSS

7,5

Влияние на конфиденциальность Частично
(Имеется значительное раскрытие информации. )
Влияние целостности Частично
(Возможна модификация некоторых системных файлов или информации, но злоумышленник не имеет контроля над тем, что может быть изменено, или область действия, на которую может повлиять злоумышленник, ограничена.)
Влияние доступности Частично
(Снижение производительности или перебои в доступности ресурсов.)
Сложность доступа Низкий
(Специальных условий доступа или смягчающих обстоятельств не существует. Для использования требуется очень мало знаний или навыков.)
Аутентификация Не требуется
(Аутентификация не требуется для использования уязвимости.)
Доступ получен Нет
Тип(ы) уязвимости Выполнить код
CWE ID 611


Продукты, затронутые CVE-2014-3990

# Тип продукта Поставщик Продукт Версия Обновление Издание Язык
1 Заявка Опенкарт Опенкарт * * * * Сведения о версии&nbspУязвимости


Количество затронутых версий по продукту

Продавец Товар Уязвимые версии
Опенкарт Открытая тележка 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:

НИСТ: НВД

База
Оценка:
  9,8 КРИТИЧЕСКИЙ

Вектор:
CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Аналитики NVD используют общедоступную информацию для сопоставления векторных строк и показателей CVSS. Мы также отображаем любую информацию CVSS, представленную в списке CVE от CNA.

Примечание. Аналитики NVD опубликовали оценку CVSS для этого CVE на основе общедоступной информации на момент проведения анализа. CNA не предоставил оценку в списке CVE.

Перечень слабых сторон

CWE-ID CWE Имя Источник
КВЕ-918

Подделка запросов на стороне сервера (SSRF)

НИСТ

КВЕ-611

Неверное ограничение ссылки на внешний объект XML

НИСТ

Известные уязвимые конфигурации программного обеспечения Коммутатор


к CPE 2.2

CPE загружаются, подождите.


Обозначает уязвимое программное обеспечение
Здесь отсутствует CPE? Пожалуйста, дайте нам знать.