Рекуррентные платежи
Рекуррентные платежи (автоплатежи) — это платежи, которые происходят регулярно или автоматически по инициативе продавца, без необходимости повторного ввода данных со стороны покупателя. Такая механика платежей подходит продавцам, которые предлагают подписку на свои товары или услуги.
Важно
Рекуррентные платежи:
- не поддерживают способ оплаты Сплит;
- работают в ограниченном режиме и могут быть доступны не всем партнерам.
Как это работает?
Рекуррентные платежи своей функциональностью дополняют базовую механику. Ознакомьтесь с ней, чтобы лучше понимать, как все работает. Подробнее о механиках оплаты читайте в разделе Способы оплаты и платежные механики.
Совет
Для знакомства с платежными механиками API Яндекс Пэй используйте готовую Postman-коллекцию.
Этап 1. Оформление подписки
Схема

-
Настройте процесс формирования корзины товаров так, чтобы у покупателя была возможность выбрать вариант подписки и ее условия:
- период в единицах измерения времени и их количество;
- сумма следующих списаний;
- наличие пробного периода (триала): до конкретной даты или период с единицей измерения.
-
Разместите кнопку оплаты Яндекс Пэй согласно общим рекомендациям. Нажатие на кнопку вызывает сallback на фронтенде партнера.
-
Настройте фронтенд магазина так, чтобы после нажатия кнопки оплаты Яндекс Пэй он создавал заказ на бэкенде магазина.
-
Настройте бэкенд магазина так, чтобы при выборе варианта подписки он передавал заказ в бэкенд Яндекс Пэй методом /subscriptions. В запросе должны быть параметры:
Параметр и значение
Описание
isBinding: falseПозволяет передавать данные о корзине и условиях подписки
currencyCode: RUBТрехбуквенный код валюты заказа
orderIdУникальный идентификатор заказа, будет использоваться в дальнейшем для списания средств
redirectUrlsСсылки для переадресации пользователя с формы оплаты. Обязательно для онлайн-магазинов
cartДанные корзины
intervalCountКоличество периодов подписки в единицах времени, указанных в
intervalUnitintervalUnitЕдиница времени для периодичности подписки
futureWriteOffAmountСумма, которая будет списываться в будущем
trialUnitиtrialCountПробный период, если есть (в единицах измерения времени и их количество)
trialEndAtДата окончания пробного периода, если есть
Полный список параметров и значений см. в Документации бэкенда.
-
В ответ бэкенд Яндекс Пэй вернет:
paymentUrl— ссылку на форму оплаты Яндекс Пэй. Настройте передачу этой ссылки на фронтенд магазина.subscriptionId— идентификатор подписки. Используйте его для проверки привязки карты и получения информации по подписке.
Пример ответа
{ "code": 200, "status": "success", "data": { "paymentUrl": "https://sandbox.pay.ya.ru/l/xxxxxx", "subscriptionId": "30b3579e-3baa-4a82-8fcc-02551b42ef40" } } -
Настройте фронтенд магазина так, чтобы он транслировал полученную ссылку на оплату в SDK Яндекс Пэй.
-
SDK Яндекс Пэй загружает с бэкенда Яндекс Пэй информацию о корзине товаров и отображает покупателю форму оплаты с информацией о корзине товаров и условиями подписки.
- для Web SDK: происходит перенаправление на полученную ссылку для оплаты;
- для Mobile SDK: открывается формы для оплаты.
-
Покупатель приступает к оплате:
1. Открывает ссылку на оплату.
2. Авторизуется с Яндекс ID, если не был авторизован ранее.
3. Выбирает способ оплаты и нажимает кнопку оплаты (в случае полной оплаты с кешбэком выбирает сохраненную в Яндексе карту или СБП-привязку к счету).
4. При покупке товара или услуги с пробным периодом проходит процедуру привязки карты и подтверждает списание тестовой суммы (11 рублей) для проверки 3ds. Сумма (11 рублей) будет возращена после прохождения проверки.
-
Яндекс Пэй проводит платеж, списывая денежные средства с выбранной карты покупателя.
Если оплата прошла успешно, заказ перейдет в статус
CAPTURED. Отслеживать статус заказа можно через:Уведомления
Для оповещения об изменениях статуса заказа или операции настройте обратный вызов (/webhook) от бэкенда Яндекс Пэй:
- Укажите публично доступный HTTPS URL-адрес бэкенда магазина в поле Callback URL в личном кабинете Яндекс Пэй в разделе Настройки.
- Настройте бэкенд магазина таким образом, чтобы он принимал запросы от бэкенда Яндекс Пэй. Подробнее о требованиях читайте в документации Merchant API.
- Посмотрите примеры нотификаций.
Поллинг статуса заказа
Настройте регулярную отправку запросов о статусе заказа /orders/{order_id} к бэкенду Яндекс Пэй.
Возможные статусы заказа при проведении оплаты:
PENDINGОплата в процессе
CAPTUREDОплачен
FAILEDОплата не прошла. В этом случае в поле
reasonбудет указана причина ошибки -
Деньги за покупку поступят на следующие сутки.
Примечание
Если у подписки был пробный период (триал), то денежные средства за покупку не перечисляются, продавцу нужно списать деньги самостоятельно в дату завершения пробного периода.
Этап 2. Списание средств продавцом
Продавец инициирует списание денежных средств, если у клиента закончилась предыдущая подписка или завершился пробный период.
Для списания средств настройте бэкенд магазина так, чтобы после формирования корзины товаров он вызывал метод /subscriptions/recur и передавал в поле parentOrderId значение orderId, заданное ранее при привязке карты.
Сумма заказа будет списана с карты, привязанной ранее. Если операция прошла успешно, заказ перейдет в статус CAPTURED, а деньги за покупку поступят продавцу на следующие сутки.
Отслеживать статус заказа можно через:
Уведомления
Для оповещения об изменениях статуса заказа или операции настройте обратный вызов (/webhook) от бэкенда Яндекс Пэй:
- Укажите публично доступный HTTPS URL-адрес бэкенда магазина в поле Callback URL в личном кабинете Яндекс Пэй в разделе Настройки.
- Настройте бэкенд магазина таким образом, чтобы он принимал запросы от бэкенда Яндекс Пэй. Подробнее о требованиях читайте в документации Merchant API.
- Посмотрите примеры нотификаций.
Поллинг статуса заказа
Настройте регулярную отправку запросов о статусе заказа /orders/{order_id} к бэкенду Яндекс Пэй.
Возможные статусы заказа при проведении оплаты:
|
|
Оплата в процессе |
|
|
Оплачен |
|
|
Оплата не прошла. В этом случае в поле |
Проверка привязки карты
Чтобы проверить, привязана ли карта к аккаунту в магазине или сервису, используйте метод /subscriptions/{customer_subscription_id}. В запросе передайте параметры:
subscriptionId— идентификатор подписки, полученный при привязке карты в ответе на запрос /subscriptions;check_card_active: true— чтобы проверить привязку карты.
Если в ответе вернулся параметр isCardActive: null, то привязанных карт нет.
Возврат средств
Провести возврат можно двумя способами:
Минимальная сумма возврата — 1 рубль.
Статусы, которые мы высылаем в интеграции
Примечание
Статусы платежа AUTHORIZED, VOIDED и CONFIRMED в текущей интеграции не используются.
Статусы платежа при проведении оплаты:
|
|
Оплата еще в процессе, нужно запросить статус платежа позже. Не отправляется в нотификации. |
|
|
Оплата завершилась неудачно. Терминальный неуспешный статус. |
|
|
Оплата совершена. Терминальный успешный статус. |
Статусы платежа при проведении возврата:
|
|
Процедура возврата неуспешна. Терминальный неуспешный статус. |
|
|
Возврат совершен. Терминальный успешный статус. |
|
|
Частичный возврат совершен. Терминальный успешный статус. |
Статусы операций:
|
Статус в карточке заказа |
Тип операции в API (operationType) |
Статус в API (status) |
Описание |
|
Возврат в процессе |
|
|
Возврат обрабатывается. |
|
Возвращён |
|
|
Средства переведены на карту или счет покупателя. |
|
Ошибка при проведении возврата |
|
|
При возврате платежа произошла ошибка. |
|
Авторизация платежа в процессе |
|
|
Средства списываются с карты или счета покупателя. |
|
Платеж авторизован |
|
|
Средства списаны с карты или счета покупателя. |
|
Ошибка при авторизации платежа |
|
|
При списании средств с карты или счета покупателя произошла ошибка. |
|
Привязка карты в процессе |
|
|
Идет процесс привязки карты. |
|
Карта привязана |
|
|
Карта привязана. |
|
Ошибка привязки карты |
|
|
При привязке карты произошла ошибка, или покупатель не успел привязать свою карту за отведенное время. |
|
Оплата в процессе |
|
|
Платеж обрабатывается. |
|
Оплачен |
|
|
Платеж проведен, средства списаны с карты или счета покупателя. |
|
Ошибка при проведении платежа |
|
|
При проведении платежа произошла ошибка. |
Примеры нотификаций
Оформление подписки
После оформления подписки методом /subscriptions вам придет одна нотификация ORDER_STATUS_UPDATED со статусом заказа (платежа).
Здесь orderId — идентификатор заказа, который вы передали при оформлении подписки.
Заказ перешел в статус CAPTURED:
{
"event": "ORDER_STATUS_UPDATED",
"eventTime": "2025-12-23T10:48:47.566064+00:00",
"merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx",
"order": {
"orderId": "order-inbv306r",
"paymentStatus": "CAPTURED"
}
}
Заказ перешел в статус FAILED:
{
"event": "ORDER_STATUS_UPDATED",
"eventTime": "2025-12-23T10:48:47.566064+00:00",
"merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx",
"order": {
"orderId": "order-inbv306r",
"paymentStatus": "FAILED"
}
}
Списание по подписке
После списания средств методом /subscriptions/recur вам придет несколько нотификаций.
Здесь:
orderId— идентификатор заказа, который вы передали при списании средств по подписке;customerSubscriptionId— идентификатор подписки из ответа метода /subscriptions.
-
OPERATION_STATUS_UPDATED— операция списания средств завершилась успешно:{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "OPERATION_STATUS_UPDATED", "eventTime": "2025-12-23T10:50:24.14437+00:00", "operation": { "operationId": "fda09bbf-3907-4d51-9989-bf19bcf18ee6", "operationType": "RECURRING", "orderId": "order-inbv306r2", "status": "SUCCESS" } } -
ORDER_STATUS_UPDATED— заказ перешел в статусCAPTURED:{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "ORDER_STATUS_UPDATED", "eventTime": "2025-12-23T10:50:24.066857+00:00", "order": { "orderId": "order-inbv306r2", "paymentStatus": "CAPTURED" } } -
SUBSCRIPTION_STATUS_UPDATED— подписка перешла в статусACTIVE:{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "SUBSCRIPTION_STATUS_UPDATED", "eventTime": "2025-12-23T10:50:24.377832+00:00", "subscription": { "subscriptionPlanId": "9856abfb-1eb1-4750-a7c4-781202928d74", "customerSubscriptionId": "30b3579e-3baa-4a82-8fcc-02551b42ef40", "status": "ACTIVE" } }
-
OPERATION_STATUS_UPDATED— операция списания средств завершилась неуспешно:{ "event": "OPERATION_STATUS_UPDATED", "eventTime": "2025-05-26T21:02:03.343994+00:00", "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "operation": { "operationId": "eba91cce-6723-4c7b-ae28-bd2fe39de287", "operationType": "RECURRING", "orderId": "667683695ORG1393TO285518--1748293320", "status": "FAIL" } } -
ORDER_STATUS_UPDATED— заказ в перешел в статусFAILED:{ "merchantId": "xxxxxxxxx-xxx-5xxx-xxxxx-xxxxxxxx", "event": "ORDER_STATUS_UPDATED", "eventTime": "2025-05-26T21:42:03.343994+00:00", "order": { "orderId": "667683695ORG1393TO285518--1748293320", "paymentStatus": "FAILED" } }
Сценарии тестирования механики
Для качественной работы сервиса протестируйте его в тестовой и боевой среде перед приемом платежей пользователей.
Если вы настроили интеграцию по API Яндекс Пэй, в ходе тестирования рекомендуем использовать тестовые сценарии:
|
Сценарий |
Действия |
Ожидаемый результат |
Среда |
|
Успешная оплата подписки. Callback URL задан в ЛК |
|
|
Test |
|
Успешная оплата подписки. Callback URL не задан в ЛК |
|
|
Test |
|
Частичный возврат подписки через API |
|
|
Test, Prod |
|
Полный возврат подписки через API |
|
|
Test, Prod |
|
Успешное продление подписки |
|
|
Test, Prod |
|
Недостаточно средств при продлении подписки |
|
|
Test |
|
Частичный возврат продления подписки через API |
|
|
Test, Prod |
|
Полный возврат продления подписки через API |
|
|
Prod |
|
Частичный возврат любого способа оплаты через ЛК (опционально: если не используется API) |
|
|
Prod |
|
Полный возврат любого способа оплаты через ЛК (опционально: если не используется API) |
|
|
Prod |
|
Успешная оплата СБП |
|
|
Prod |
|
Успешная оплата банковской картой |
|
|
Prod |
|
Проверка ежедневного отчета о продажах |
Оставьте без возврата успешные продажи на сумму не менее 500 рублей. |
На следующий день после тестов получен ежедневный отчет с операциями. Проверьте начисленную комиссию за успешную оплату. |
Prod |