Не работает корзина или оформление заказа в OpenCart: причины и решение
Корзина — самое дорогое место магазина: каждая поломка здесь означает потерянные заказы. В OpenCart и ocStore проблемы с корзиной почти всегда связаны с одним из пяти мест: JavaScript, модификаторы, сессии, модули оплаты и доставки или ошибки PHP. Разберу, как быстро понять, где именно.
Как определить, на каком шаге проблема
Пройдите путь покупателя сами в окне инкогнито и запишите, где он обрывается:
- Кнопка «Купить» в категории или карточке.
- Мини-корзина в шапке обновляется.
- Страница корзины показывает товары.
- Переход к оформлению.
- Выбор доставки и оплаты.
- Кнопка «Подтвердить заказ».
- Страница «Заказ оформлен» и письмо.
- Заказ в админке.
Сразу держите открытой консоль браузера (F12): вкладки Console и Network покажут большую часть ошибок.
Товар не добавляется в корзину
Ошибка JavaScript
В консоли видна красная ошибка вида «Uncaught TypeError» или «$ is not defined». Причины:
- модуль подключил свою версию jQuery, и она конфликтует с той, что в шаблоне;
- модуль оптимизации объединил или отложил скрипты, и обработчик кнопки загрузился раньше библиотеки;
- в шаблоне сломался скрипт после правки.
Отключите модуль оптимизации или сжатия скриптов и проверьте снова.
Запрос возвращает ошибку
Во вкладке Network при нажатии «Купить» уходит запрос index.php?route=checkout/cart/add (в OpenCart 4 — checkout/cart.add). Посмотрите ответ:
- JSON с полем success — товар добавлен, проблема в отображении;
- JSON с полем error — например, не выбрана обязательная опция или товара нет в нужном количестве;
- HTML или текст ошибки PHP — ошибка на сервере, смотрите журнал ошибок.
Обязательные опции
Если у товара есть обязательная опция (размер, цвет), а кнопка «Купить» в категории добавляет без выбора, OpenCart вернёт ошибку и перебросит на карточку. Некоторые шаблоны не показывают сообщение, и кажется, что кнопка не работает.
Корзина пустеет
- Сайт открывается по разным адресам — с www и без, по http и https. Cookie сессии привязаны к адресу. Настройте один редирект на основной адрес и проверьте HTTP_SERVER и HTTPS_SERVER в config.php.
- Проблемы с сессиями на сервере — папка сессий недоступна для записи или переполнена. В OpenCart 3 и 4 сессии могут храниться в базе — проверьте таблицу oc_session и её размер.
- Кэширование страниц — серверный кэш или CDN отдаёт страницу корзины, закэшированную для другого посетителя.
Оформление заказа зависает
Посмотрите ответ сервера
При подтверждении заказа уходит несколько AJAX-запросов: сохранение адреса, способа доставки, способа оплаты, подтверждение. Найдите в Network тот, что вернул ошибку или висит долго.
Модули доставки
Модуль, который рассчитывает стоимость через API службы доставки, при недоступности API может ждать ответа до таймаута. Покупатель видит бесконечную загрузку. Решения:
- задать в модуле таймаут запроса в несколько секунд;
- показывать резервную фиксированную цену при ошибке;
- кэшировать результаты расчёта.
Модули оплаты
Платёжный модуль создаёт заказ у провайдера и перенаправляет покупателя. Если ключи неверные, модуль устарел или провайдер сменил API, переход не происходит. Смотрите журнал модуля, если он есть, и журнал ошибок OpenCart.
Упрощённое оформление
Модули «быстрого» или упрощённого оформления заказа полностью заменяют стандартный процесс. Они чаще всего конфликтуют с модулями доставки и оплаты, особенно после обновления любого из них.
Заказ создаётся, но не виден в админке
Это классическая особенность OpenCart: заказ со статусом «0» (отсутствующий) не показывается в списке заказов. Так происходит, когда покупатель ушёл на оплату и не вернулся, либо уведомление от платёжной системы не дошло. Проверить:
SELECT order_id, date_added, total, payment_method FROM oc_order WHERE order_status_id = 0 ORDER BY order_id DESC LIMIT 20;
В OpenCart такие заказы можно увидеть фильтром «Отсутствующие заказы» в списке заказов. Если их много при реальных оплатах — проблема в callback платёжной системы.
Не приходят письма о заказе
- Проверьте настройки почты в Система — Настройки — Почта: протокол SMTP, сервер, порт, логин и пароль.
- Адрес отправителя должен быть на домене магазина.
- На домене нужны записи SPF и DKIM.
- Проверьте, не попадают ли письма в спам у покупателя и администратора.
Подробно о доставке писем — в статье почему не приходят заявки с сайта, принципы те же.
Ошибки PHP
Журнал ошибок OpenCart находится в Система — Обслуживание — Журнал ошибок, файл — в storage/logs/error.log (или system/storage/logs в OpenCart 3). Частые ошибки после смены версии PHP:
- Undefined array key — модуль не проверяет наличие данных;
- Unsupported operand types — устаревший код калькуляции в модулях скидок и доставки;
- Call to undefined function — модуль использует функцию, удалённую в новой версии PHP.
Если ошибка в модуле — обновите модуль или исправьте через свой модификатор.
Модификаторы
После установки нового модуля или обновления старого в Расширения — Модификаторы нажмите «Обновить» и очистите кэш шаблонов. Откройте лог модификаторов: строки «NOT FOUND» означают, что модификатор не применился к файлу корзины или оформления. Это частая причина, когда два модуля меняют один и тот же фрагмент.
Как проверить безопасно
Не экспериментируйте на рабочем магазине в разгар продаж:
- Сделайте копию файлов и базы на поддомене.
- Отключайте модули по одному, нажимая «Обновить» в модификаторах.
- Найдя виновника, решите — обновить, заменить или поправить своим модификатором.
- Перенесите исправление на рабочий магазин в спокойное время.
Типичный сценарий поломки
Магазин на ocStore 3 после обновления модуля СДЭК перестаёт оформлять заказы: на шаге выбора доставки крутится загрузка. Разбор:
- В Network запрос расчёта доставки висит 30 секунд и возвращает ошибку 504.
- В журнале ошибок OpenCart — превышение времени ожидания при обращении к API.
- В новой версии модуля изменился формат ключей доступа, а в настройках остались старые.
- После ввода новых ключей расчёт работает, но для страховки в модуле задаётся таймаут и резервная цена.
Пока доставка не работала, покупатели не могли оформить заказ вообще — поэтому для каждого модуля, который зависит от внешнего API, нужен запасной вариант.
Как узнать о поломке раньше покупателей
- Раз в день или после каждого обновления оформляйте тестовый заказ с оплатой «Наличными при получении» и удаляйте его.
- Следите за количеством заказов: если обычно приходит несколько в день, а за сутки ни одного — повод проверить.
- Настройте уведомления о новых заказах в Telegram — так пропажа заказов заметна сразу.
- Смотрите журнал ошибок после любых изменений.
Совет по модулям оформления
Если используете модуль упрощённого оформления, после каждого обновления модулей доставки или оплаты проходите оформление со всеми их комбинациями. Именно здесь конфликты проявляются чаще всего.
Чек-лист проверки корзины
- Путь покупателя пройден в инкогнито, найден шаг поломки.
- Консоль браузера без ошибок JavaScript.
- Ответы AJAX-запросов — JSON без ошибок PHP.
- Один основной адрес сайта, правильный config.php.
- Модули доставки с таймаутом и резервной ценой.
- Платёжный модуль актуален, ключи верные.
- Лог модификаторов без NOT FOUND.
- Журнал ошибок чист.
- Письма о заказе приходят.
Частые вопросы
Почему корзина работает у меня, но не у покупателей?
Вы залогинены в админке или у вас закэширована старая версия скриптов. Проверяйте в окне инкогнито и с телефона через мобильный интернет.
Что такое «отсутствующие заказы» в OpenCart?
Заказы со статусом 0: покупатель дошёл до оплаты, но не завершил её, или уведомление от платёжной системы не дошло. Они не показываются в обычном списке заказов.
Можно ли починить корзину, не обновляя модули?
Часто да: правкой через собственный модификатор, без изменения файлов модуля. Но если модуль давно не поддерживается, лучше заменить его актуальным.
Сколько времени занимает исправление?
Если причина в одном модуле или настройке — от часа. Если конфликтуют несколько модулей оформления, доставки и оплаты — до нескольких дней с проверкой на копии.
Нужна помощь?
Если не хочется разбираться самому или не получилось — напишите мне. Посмотрю задачу и скажу, что нужно сделать, сколько это займёт и сколько будет стоить.
Связанные услуги
