Интеграция mspYandexPay
Нужны только шаги установки? Откройте Быстрый старт. Ниже сопоставлены методы Merchant API и классы mspYandexPay для MiniShop3.
API ↔ код
| Метод / точка | Класс / файл | Назначение |
|---|---|---|
POST /orders | YandexPayClient::createOrder(), YandexPay*Payment::send(), PaymentService | Создание заказа, получение paymentUrl |
GET /orders/{id} | YandexPayClient::getOrder() | Статус заказа в API |
| Capture | YandexPayClient::captureOrder(), processor capture | Списание после AUTHORIZED |
| Cancel / VOID | YandexPayClient::cancelOrder(), processor cancel | Отмена холда |
| Refund (v2) | YandexPayClient::refundOrder(), processor refund | Полный или частичный возврат |
| Webhook JWT | webhook.php, JwtVerifier, WebhookService | Уведомления, смена статуса MS3 |
| Cash Register / QR | CashRegisterClient, YandexPayQrPayment | Заказ с orderSource=QR |
| Кнопка на сайте | сниппет mspYandexPayButton, connector payment/create | Создание paymentUrl с витрины |
Webhook
URL на сайте:
https://ваш-домен.ru/assets/components/mspyandexpay/webhook.phpОфициально: Webhook Merchant API.
Обработка:
- Тело запроса — JWT (
Content-Type: application/octet-stream). JwtVerifierпроверяет ES256 по JWKS текущей среды иmerchantId/exp.WebhookServiceобрабатывает события и пишет идемпотентность вmsp_yandex_pay_webhook_events(UNIQUEevent_key).- Повтор того же события → HTTP 200 без повторной смены статуса.
| Событие | Действие |
|---|---|
ORDER_STATUS_UPDATED | маппинг paymentStatus → статус MS3 |
OPERATION_STATUS_UPDATED + SUCCESS | CAPTURE → CAPTURED, REFUND → REFUNDED, VOID/CANCEL → VOIDED |
| Статус Yandex | Действие MS3 |
|---|---|
CAPTURED, CONFIRMED | ms3_status_paid |
FAILED, VOIDED | ms3_status_canceled |
REFUNDED | mspyandexpay_refunded_status_id или ms3_status_canceled |
PENDING, AUTHORIZED, PARTIALLY_REFUNDED | без смены статуса |
Заказ не помечается оплаченным при получении paymentUrl. AUTHORIZED (холд) тоже не paid.
IP whitelist не заменяет проверку JWT.
Поток одностадийной оплаты
- Покупатель оформляет заказ и выбирает Яндекс Пэй.
YandexPayPayment::send()собирает сумму изmsOrder(OrderBuilder) и вызываетPOST /orders.- Компонент сохраняет транзакцию в
msp_yandex_pay_transactionsи отдаёт redirect наpaymentUrl. - Покупатель платит в форме Яндекс Пэй.
- Webhook приносит
CAPTURED/CONFIRMED. OrderStatusUpdaterвыставляетms3_status_paid.
Двухстадийная схема
- В кабинете Яндекс Пэй включите двухстадийные платежи.
- Используйте способ «Яндекс Пэй (двухстадийная)» (
YandexPayTwoStagePayment). - После оплаты webhook приносит
AUTHORIZED. Заказ в MS3 ещё не paid. - Спишите или отмените холд через connector (нужна mgr-сессия):
assets/components/mspyandexpay/connector.php?action=capture&order_id=<id>&ctx=mgr
assets/components/mspyandexpay/connector.php?action=cancel&order_id=<id>&reason=...&ctx=mgrОпционально передайте amount для partial capture. Финальный статус также приходит webhook’ом (CAPTURE / VOID).
Возврат
После CAPTURED / CONFIRMED (и при PARTIALLY_REFUNDED для следующего частичного):
assets/components/mspyandexpay/connector.php?action=refund&order_id=<id>&ctx=mgr
assets/components/mspyandexpay/connector.php?action=refund&order_id=<id>&amount=10.00&ctx=mgrЧастичный возврат собирает targetCart. Полный — статус из mspyandexpay_refunded_status_id.
Split
- Глобально:
mspyandexpay_payment_methods=CARD,SPLIT(или толькоSPLIT) и при необходимостиpreferred_payment_method=SPLIT. - Или способ «Яндекс Пэй + Сплит»: методы
CARD+SPLIT, preferredSPLIT. mspyandexpay_is_prepayment=falseтипичен для оплаты при получении.
QR / Cash Register
- Включите
mspyandexpay_qr_enabled. - Активируйте способ «Яндекс Пэй QR» и привяжите к доставкам.
YandexPayQrPayment::send()создаёт заказ сorderSource=QRи channel в metadata.
Кнопка на витрине
Сниппет mspYandexPayButton регистрирует button.js и кнопку, которая дергает connector payment/create и редиректит на paymentUrl.
Параметры:
| Параметр | Описание |
|---|---|
order_id | ID заказа MS3. Если пусто, берётся msorder.id или заказ по ?msorder=<uuid>. |
text | Текст кнопки (по умолчанию «Оплатить Яндекс Пэй»). |
class | CSS-класс (по умолчанию ms3yp-button). |
{'!mspYandexPayButton' | snippet : [
'order_id' => $id,
'text' => 'Оплатить Яндекс Пэй',
]}[[!mspYandexPayButton?
&order_id=`[[+id]]`
&text=`Оплатить Яндекс Пэй`
]]Показывайте кнопку только для заказов, которые ещё нужно оплатить. Повторный send при существующей транзакции переиспользует payment_url (idempotency).
Checkout (MVP)
Endpoints для сценария Yandex Checkout по уже существующему заказу MS3 (ms3-{id} / cart.externalId):
https://ваш-домен.ru/assets/components/mspyandexpay/checkout/render.php
https://ваш-домен.ru/assets/components/mspyandexpay/checkout/create.phpАвторизация: JWT в Authorization: Bearer …. Полная доставка Yandex Logistics в пакет не входит.
Хранение транзакций
| Таблица | Назначение |
|---|---|
{prefix}msp_yandex_pay_transactions | order_id, UNIQUE yandex_order_id, payment_url, статусы, сумма, environment |
{prefix}msp_yandex_pay_webhook_events | идемпотентность webhook (UNIQUE event_key) |
В msOrder.properties пишутся yandex_pay_order_id, yandex_pay_payment_url, статусы после webhook / операций.
Безопасность
- JWT обязателен. IP whitelist не заменяет подпись.
- Сумма заказа берётся с сервера из
msOrder, не из request покупателя. - API key не попадает во frontend и маскируется в логах.
- Capture / cancel / refund через connector требуют сессию mgr.
- Default environment — sandbox.
Ограничения
- Фискализация чеков настраивается в кабинете Yandex или своим ОФД, не в payload компонента.
- Two-stage и часть sandbox-сценариев могут требовать включения у поддержки Yandex.
- Checkout — MVP без логистики Yandex.
- Ядро MiniShop3 пакет не меняет.
Что дальше
- Системные настройки
- FAQ
- Официально: план интеграции, фискализация
