Qut Pay Сайт Кабинет База знаний Инструкции Документация API ҚАЗРУС
ГлавнаяБаза знаний → Справочник

Расширение OpenCart 4

Обновлено: 2026-09-14 · Версия в Markdown

Коротко

Расширение добавляет в OpenCart 4 способ «Оплата через Kaspi (QR)»: покупатель подтверждает заказ → попадает на страницу оплаты Qut Pay (QR и ссылка Kaspi) → платит в приложении Kaspi.kz. Статус заказа обновляется автоматически по вебхуку, деньги приходят напрямую на ваш Kaspi Pay.

Загрузка: https://api.qut.kz/downloads/qutpay.ocmod.zip

Имя архива важно: OpenCart берёт код расширения (qutpay) из имени файла. Не переименовывайте его.

Требования

ЧтоЗначение
OpenCart4.0.2.0 и новее
PHP8.0 и новее с расширениями curl и json
Валюта магазинаKZT (₸). При другой валюте способ оплаты не показывается
Сайтдолжен быть доступен из интернета по https, иначе в проде не дойдёт вебхук
Qut Payорганизация с подключённым кассиром Kaspi (для песочницы кассир не нужен)

Шаг 1. Установка

  1. Админка → Extensions → InstallerUpload → выберите qutpay.ocmod.zip. После загрузки нажмите зелёную кнопку Install напротив «Qut Pay (Kaspi QR)».
  2. Extensions → Extensions → Payments → найдите в списке «Qut Pay (Kaspi QR)» и нажмите зелёный плюс. На этом шаге создаётся таблица oc_qutpay_invoice.
  3. Там же нажмите Edit и переходите к настройкам.

Шаг 2. Ключ и вебхук

Кабинет: https://qut.kz/app

  1. Интеграции → API-ключи → назовите ключ именем магазина → Создать. Ключ показывается один раз — скопируйте сразу.
  2. Поле «Адрес webhook» в настройках расширения доступно только для чтения — скопируйте его. Выглядит оно так:

`` https://ВАШ-МАГАЗИН/index.php?route=extension/qutpay/payment/qutpay.webhook ``

  1. Кабинет → Интеграции → Вебхуки → добавьте этот адрес, в списке «Ключ» выберите созданный ключ → Создать. Показанный секрет скопируйте в поле «Секрет webhook» расширения.

Без секрета заказы не будут отмечаться оплаченными автоматически — расширение вернёт 503, а мы будем повторять доставку.

Шаг 3. Настройка

ПолеЧто указать
API-ключКлюч из шага 2. Кнопка «Проверить ключ» рядом делает реальный запрос к API и проверяет его
Адрес webhookТолько для чтения. Скопируйте в кабинет
Секрет webhookЗначение, показанное один раз при добавлении адреса
Адрес APIhttps://api.qut.kz — не менять
Ожидание оплатыСтатус сразу после подтверждения заказа, когда покупатель ушёл на страницу оплаты
ОплаченСтатус после подтверждения оплаты. Для цифровых товаров обычно «Выполнен»
Счёт истёк / Счёт отменён / ВозвратСоответствующие статусы. Можно выбрать «не менять статус заказа»
Геозона, Статус, Порядок сортировкиКак у остальных способов оплаты
Лог отладкиВключите на время настройки: записи идут в storage/logs/qutpay.log

Включите переключатель Статус и сохраните.

Значения статусов по умолчанию соответствуют стандартной установке OpenCart (1 Pending, 2 Processing, 14 Expired, 7 Canceled, 11 Refunded). Если статусы в магазине переопределены, выберите нужные вручную.

Как меняются статусы заказа

  1. На шаге подтверждения покупатель нажимает кнопку. Расширение вызывает POST /api/v1/invoices: сумма, описание «Название магазина — заказ №N», externalOrderId — номер заказа, customer (телефон нормализуется до 7XXXXXXXXXX), в metadata — метки магазина и заказа, заголовок Idempotency-Key вида oc-{заказ}-….
  2. Счёт сохраняется в oc_qutpay_invoice, заказу ставится «Ожидание оплаты», покупателя перебрасывает на payUrl. Если покупатель вернулся и нажал кнопку снова, а прежний счёт ещё открыт и сумма не менялась, переиспользуется тот же payUrl.
  3. Вебхук проверяется по сырому телу запроса, отметки времени старше 5 минут отклоняются. Обработка идемпотентна по паре (счёт, статус).
СобытиеЧто происходит
paidСтатус «Оплачен», в историю пишется номер и ссылка чека. Если сумма счёта не совпала с суммой заказа — статус не меняется, в историю добавляется предупреждение
expired / cancelledСоответствующий статус, но только если менеджер ещё не перевёл заказ в processing/complete
refundedСтатус «Возврат»
partially_refundedТолько запись в историю
Поздняя оплата (late: true)Заказ отмечается оплаченным даже по истёкшему счёту
  1. Когда покупатель возвращается, расширение запрашивает GET /api/v1/invoices/{id}?live=1. Если счёт оплачен — отправляет на стандартную страницу checkout/success (корзина очищается). Иначе показывает страницу ожидания с кнопками «Проверить ещё раз» (автообновление каждые 8 секунд), «Открыть страницу оплаты Kaspi» и «Вернуться к оформлению».

Ответы обработчика вебхука: 200 — принято, 401 — плохая подпись, 400 — битое тело, 503 — расширение выключено или не задан секрет.

Возвраты

Из админки OpenCart возврат не делается. Возврат оформляйте в кабинете Qut Pay: Счета → откройте счёт → Возврат. После этого придёт событие invoice.refunded, и заказ в OpenCart перейдёт в выбранный вами статус «Возврат».

При частичном возврате статус заказа не меняется — добавляется только запись в историю. Подробнее: API возвратов.

Проверка

Сделайте заказ с ключом песочницы (qp_test_…). На странице оплаты есть кнопка «[Sandbox] оплатить», которая имитирует платёж — вебхук при этом уходит по-настоящему, так что переходы статусов проверяются целиком.

Переходя в боевой режим, вставьте ключ qp_live_… и проведите один заказ на небольшую сумму.

Частые проблемы

СимптомПричина и решение
Способ не появляется в кассеВалюта не KZT; расширение не установлено в списке Payments; выключен Статус; не совпадает геозона
Заказ зависает в «Ожидание оплаты»Вебхук не зарегистрирован, неверный адрес или не совпадает секрет. Смотрите журнал доставок в кабинете
В журнале 503Расширение выключено либо пустое поле «Секрет webhook»
В журнале 401Неверный секрет. Добавьте адрес заново и вставьте новый секрет
Вебхук вообще не приходитМагазин в режиме Maintenance — он блокирует входящие запросы. После выхода из режима статус подтянется и при возврате покупателя
«Проверить ключ» выдаёт ошибкуКлюч скопирован неверно или не тот режим: для песочницы qp_test_…, для боевого qp_live_…
Адрес вебхука неверныйАдрес строится из HTTP_CATALOG админки. Если магазин за прокси или на другом домене, поправьте адрес вручную и зарегистрируйте в кабинете правильный
Расширения нет в InstallerАрхив переименовали. Файл должен называться qutpay.ocmod.zip

Полная диагностика: Плагин не работает.

Вопросы и ответы

Заработает ли на OpenCart 3? Нет. Расширение написано под OpenCart 4.0.2.x. На третьей версии можно обращаться к API напрямую: PHP SDK.

Можно ли вести два магазина на одном API-ключе? Да: расширение хранит метку заказа в metadata счёта и сверяет её в вебхуке, поэтому события чужого магазина игнорируются. Но удобнее выдать каждому магазину свой ключ.

Где смотреть лог? При включённом «Логе отладки» — storage/logs/qutpay.log.

Что будет, если покупатель ушёл, не оплатив? Счёт в свой срок станет expired, заказ перейдёт в выбранный вами статус. Покупатель может открыть заказ заново и получить новый счёт.

А что есть для WordPress? Плагин для WooCommerce: Плагин WooCommerce.

Связанные статьи

Плагин WooCommerce или OpenCart не работаетЕсли плагин не создаёт счета или статус заказа не меняется, проверять нужно четыре вещи: ключ, совпадение режимов, публичную доступность адреса вебхука и журнал магазина.Настройка вебхуковКак добавить адрес вебхука в кабинете, выбрать события и сохранить секрет, какие приходят заголовки и тело, как устроены 11 повторов, как читать журнал, протестировать адрес и что с редиректами.API-ключи — создание, хранение, ротацияЧем отличаются ключи qp_live_ и qp_test_, как создать ключ в кабинете, где его хранить и где хранить категорически нельзя, зачем отдельный ключ на каждую интеграцию, как заменить ключ без простоя и что происходит при удалении.API возвратов — полный и частичный возвратСправочник по методу POST /invoices/{id}/refund: поля запроса, полный и частичный возврат, ограничение суммы, все коды ошибок, что делать при refund_unknown и какие события приходят после возврата.Приём Kaspi для интернет-магазинаПолная схема от корзины до статуса «оплачен»: счёт, страница оплаты, вебхук. Способы без кода для Tilda, WooCommerce и OpenCart, и путь через API для самописного сайта.

Остались вопросы? WhatsApp +77788813333 · kazprose@gmail.com
Написать можно и из кабинета: Поддержка.

Qut Pay — независимый сервис, не аффилирован с АО «Kaspi Bank». Kaspi и Kaspi Pay — товарные знаки их правообладателя.