
- MODX 3
- PHP 8.2
- miniShop3


Нужны только шаги без разбора API — смотрите Быстрый старт.
Ниже сопоставлены шаги из документации ЮKassa и реализация в msp3YooKassa (платёж, return_url, webhook, чеки) для MiniShop3.
| Шаг по Quick start | Реализация в msp3YooKassa |
|---|---|
Создать платеж (POST /v3/payments), указать amount, capture, confirmation.type = redirect, return_url | YooKassaPayment::send() — createPayment() через SDK, confirmation.return_url из метода getReturnUrl() (настраиваемые success_url / fail_url или страница благодарности MS3) |
| Ключ идемпотентности | UUID заказа или уникальный префикс (idempotenceKey) |
Редирект на confirmation_url | Ответ обработчика оплаты с redirect / payment_link и идентификаторами заказа (см. ответ send()) |
Дождаться succeeded / обработать отмену | В первую очередь HTTP-уведомления → webhook.php → WebhookHandler |
Как пользователь подтверждает оплату при redirect, разобрано в «Процесс платежа». Одно- и двухстадийный режим — это capture: true в YooKassaPayment, false в YooKassaTwoStagePayment.
В кабинете ЮKassa: Интеграция → HTTP-уведомления (в интерфейсе формулировка может отличаться, см. документацию по вебхукам).
Укажите URL вашего сайта:
https://ваш-домен.ru/assets/components/msp3yookassa/webhook.phpЮKassa позволяет отладить интеграцию без реальных списаний: используйте тестовый магазин и тестовые ключи (идентификатор и секретный ключ с префиксом test_). Подставьте их в настройки msp3yookassa_shop_id и msp3yookassa_secret_key.
Для оплаты картой в тесте — номера тестовых карт (срок, CVC и 3‑D Secure — по справке ЮKassa). В тестовом магазине нельзя платить обычной картой.
После перехода в боевой режим замените ключи на боевые из профиля реального магазина, как описано в «Быстром старте».
Если вы обязаны передавать данные для чека, включите msp3yookassa_payment_receipt и задайте msp3yookassa_vat_code. В запрос создания платежа передаётся объект receipt (позиции из состава заказа, доставка при delivery_cost > 0, email покупателя). Основы формата — в документации по чекам.
В кабинете тестового магазина можно включить проверку чеков: до ОФД данные не доходят, но по ответу ЮKassa видно, что структура запроса верная (подробнее — тестирование).
В коде чека фиксирован tax_system_code: 1 (общая СНО в терминах API). При необходимости другой системы налогообложения расширяйте логику через событие или форк ReceiptBuilder.
Карта, СБП или кошелёк покупатель выбирает уже на стороне ЮKassa после перехода по confirmation_url. Виджет на сайте не встраиваем — только redirect, как в базовом примере.
send() и фронтенд После успешного createPayment и сохранения заказа с yookassa_payment_id в properties успешный JSON от MS3 (и полезная нагрузка для кастомного фронтенда) включает в том числе:
| Поле | Смысл |
|---|---|
redirect / payment_link | URL страницы оплаты ЮKassa |
payment_id | Идентификатор платежа в API ЮKassa |
order_id | Числовой ID заказа MiniShop3 |
order_num | Номер заказа (строка) |
msorder | UUID заказа (как в return_url и ссылке «спасибо») |
Если сохранить заказ с yookassa_payment_id не удалось, возвращается ошибка с текстом вроде «Could not save order after payment creation» — повторяйте попытку или проверьте целостность заказа. Платёж в ЮKassa при этом уже мог быть создан (разбирайте в кабинете ЮKassa).
Штатные сообщения отладки в лог MODX (в т.ч. тело запроса к API с меткой YooKassa createPayment request) пишутся только при msp3yookassa_debug = «Да».
YooKassaPayment::send() создаёт платеж в API ЮKassa (capture: true), сохраняет yookassa_payment_id в properties заказа и возвращает фронтенду redirect на страницу оплаты.assets/components/msp3yookassa/webhook.php.WebhookHandler находит заказ по metadata.order_id / order_num, сверяет order_hash, при статусе succeeded выставляет заказу status_id = ms3_status_paid.success_url или страницу благодарности MiniShop3.Факт оплаты для магазина фиксируйте по webhook, а не по одному только возврату браузера на сайт.
https://<домен>/assets/components/msp3yookassa/webhook.phpevent, object с status, id, metadata).succeeded — заказу ставится ms3_status_paid, в properties пишется yookassa_payment_id.canceled — заказу ставится ms3_status_canceled.msp3yookassa_debug и не меняют заказ.ms3_status_paid, статус не дублируется.order_hash в metadata сверяется с getOrderHash() у обработчика — это защита от чужого JSON с подставным заказом. Про подпись и прочие проверки — в справочнике по вебхукам. При появлении требований с вашей стороны правьте webhook.php под них.
Способ оплаты «Оплата через ЮKassa (двухстадийная)» (YooKassaTwoStagePayment) создаёт платеж с capture: false: средства блокируются до подтверждения (capture) или отмены.
waiting_for_capture. Текущая реализация webhook не меняет статус заказа в MODX на таких событиях — заказ остаётся в прежнем статусе до succeeded или canceled.ms3_status_paid.canceled — заказ получает ms3_status_canceled.Решите заранее, кто подтверждает списание: например, менеджер в MODX после просмотра заказа или ваш скрипт по событию.
Класс: Msp3YooKassa\Processors\CaptureProcessor. Файл: core/components/msp3yookassa/processors/capture.class.php.
Условия:
Msp3YooKassa\Payment\YooKassaTwoStagePayment.properties заказа есть yookassa_payment_id.msp3yookassa_shop_id и msp3yookassa_secret_key.Строка в лог MODX при неудачном capture пишется только при включённом msp3yookassa_debug. Текст ошибки по-прежнему возвращается в ответе процессора менеджеру.
Параметр: order_id — числовой ID заказа MiniShop3.
Пример вызова из PHP (консоль, сниппет, своё меню):
$corePath = $modx->getOption('msp3yookassa_core_path', null, MODX_CORE_PATH . 'components/msp3yookassa/');
$response = $modx->runProcessor('capture', [
'order_id' => 123,
], [
'processors_path' => $corePath . 'processors/',
]);
if ($response->isError()) {
$modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
} else {
// Списание подтверждено, заказ переведён в ms3_status_paid
}Тексты ошибок процессора вынесены в лексикон msp3yookassa (например, неверный ID заказа, не двухстадийный способ оплаты, нет yookassa_payment_id).
Перед добавлением позиции товара в чек вызывается системное событие MODX с именем mspYooKassaOnPreparePaymentReceiptItem (так оно задано в коде пакета — подключайте плагин на нём, если нужно менять позиции).
Передаваемые поля: order, orderProduct, item (массив позиции по контракту ЮKassa, изменяемый по ссылке).
Нужны свои description, vat_code, payment_subject / payment_mode — правьте item в плагине на этом событии.
createPayment — UUID заказа или уникальный префикс, чтобы повторное оформление не плодило дубли при сбоях.vendor/autoload.php компонента. При сборке пакета зависимости Composer должны попадать в транспорт.