Подписки
Подписки позволяют организовать регулярные списания средств с карты клиента по заранее заданной сумме и периодичности.
При создании подписки регистрируется заказ для первичной оплаты и возвращается ссылка на платежную страницу. После успешной первичной оплаты подписка становится активной, а последующие платежи выполняются автоматически с периодичностью, заданной в параметрах billingIntervalValue и billingIntervalUnit.
В этом разделе описаны методы создания подписки, получения списка подписок и детальной информации о подписке, отмены подписки и обновления параметров регулярных списаний.
Описание процесса
-
Клиент выбирает подписку в интернет-магазине и нажимает кнопку Подписаться.
-
Сервер интернет-магазина получает запрос на подписку.
-
Сервер интернет-магазина запрашивает регистрацию подписки, отправляя вызов API POST /v1/subscriptions в сервис подписок.
-
Сервис подписок создает новую подписку и отправляет ответ на сервер интернет-магазина. Ответ содержит параметр
checkoutUrl(URL-адрес оплаты, на который интернет-магазин должен перенаправить клиента на шаге 5) и параметрsubscriptionId(уникальный номер подписки). -
Интернет-магазин перенаправляет клиента на URL, полученный в параметре
checkoutUrl. Перенаправление может выполняться как в текущем окне, так и в новом. -
Сервис подписок отображает платежную страницу.
-
Клиент вводит номер своей карты, срок ее действия и CVV/CVC и нажимает Оформить подписку.
-
Сервис подписок обрабатывает запрос на оплату.
-
Клиент перенаправляется на финишную страницу.
-
Интернет-магазин отправляет запрос POST /v1/subscriptions/details в сервис подписок, чтобы проверить статус подписки и убедиться, что первичный платеж прошел успешно. Запрос содержит параметр
subscriptionId, полученный на шаге 4. -
Сервис подписок по расписанию, указанному при создании подписки, проверяет для каких подписок нужно произвести повторные списания.
-
Повторные списания производятся с платежного средства, привязанного на шаге 7.
О том, как просматривать подписки в Личном кабинете, читайте здесь.
Базовый URL:
https://sandbox.rbsuat.com/wheel/v1/subscriptions— для тестовой среды;https://sandbox.rbsuat.com/wheel/v1/subscriptions— для продуктивной среды
При выполнении запроса необходимо использовать заголовок: Content-Type: application/json;charset=UTF-8, метод POST.
Статусы подписки
| Статус | Описание |
|---|---|
INITIATED | Создана, ожидает первичной оплаты |
ACTIVE | Активна, рекуррентные платежи выполняются |
UNPAID | Платёж не прошёл, ожидается повтор |
PAYMENT_FAILED | Первый платёж завершился неудачей |
CANCELLED | Отменена (терминальный статус) |
Создание подписки
Для создания подписки используется метод POST /v1/subscriptions. Регистрируется заказ, создаётся подписка в статусе INITIATED и возвращается ссылка на платежную страницу для первичной оплаты.
Тело запроса
643 — RUB)billingIntervalUnit. Должен быть целым числом больше 0.DAYS / WEEKS / MONTHS / YEARSphone+?[0-9\\s\\-()]{7,20}. Обязателен, если не указан email.Пример запроса создания подписки
curl --request POST \
--url https://sandbox.rbsuat.com/wheel/v1/subscriptions \
--header 'content-type: application/json;charset=UTF-8' \
--data '{
"username": "merchant_login",
"password": "merchant_password",
"customerId": "customer-123",
"email": "customer@example.com",
"phone": "+79001234567",
"amount": 10000,
"currency": 643,
"billingIntervalValue": 1,
"billingIntervalUnit": "MONTHS",
"description": "Ежемесячная подписка",
"successUrl": "https://example.com/success",
"failUrl": "https://example.com/fail"
}'Пример успешного ответа
{
"checkoutUrl": "https://sandbox.rbsuat.com/payment/merchants/ecom2/payment.html?mdOrder=02ea2f54-96a1-7ba5-8cfd-c56c026fc629&language=ru&subscription=true",
"subscription": {
"subscriptionId": "fe10e4c1-015d-4762-8309-89713438e78a",
"merchantLogin": "merchant_login",
"customerId": "customer-123",
"amount": 10000,
"currency": 643,
"email": "customer@example.com",
"phone": "+79001234567",
"billingIntervalValue": 1,
"billingIntervalUnit": "MONTHS",
"description": "Ежемесячная подписка",
"status": "INITIATED",
"mdOrder": "02ea2f54-96a1-7ba5-8cfd-c56c026fc629",
"bindingId": null,
"activeTill": null,
"nextChargeAt": null,
"created": "2026-07-13T15:37:45.359553+03:00"
}
}Примеры ответов с ошибкой
400 Bad Request — ошибка валидации или сбой регистрации в шлюзе
{ "error": "Either email or phone is required" }
{ "error": "Amount must be greater than zero" }
{ "error": "Payment Gateway registration failed: ..." }500 Internal Server Error
{ "error": "Internal server error" }Список подписок
Для получения списка подписок используется метод POST /v1/subscriptions/list. Метод возвращает постраничный список подписок мерчанта с фильтрацией и сортировкой.
Тело запроса
CUSTOMER_ID, SUBSCRIPTION_ID, CREATED, UPDATED, AMOUNT, STATUS, NEXT_CHARGE_AT. Значение по умолчанию: CREATED.ASC, DESC. Значение по умолчанию: DESC.0. Значение по умолчанию: 0.20.Пример запроса списка подписок
curl --request POST \
--url https://sandbox.rbsuat.com/wheel/v1/subscriptions/list \
--header 'content-type: application/json;charset=UTF-8' \
--data '{
"username": "merchant_login",
"password": "merchant_password",
"statuses": ["ACTIVE", "UNPAID"],
"customerId": null,
"amountFrom": 5000,
"amountTo": null,
"createdFrom": "2026-01-01T00:00:00+03:00",
"createdTo": null,
"sortField": "CREATED",
"sortDirection": "DESC",
"page": 0,
"size": 20
}'Пример успешного ответа
{
"items": [
{
"subscriptionId": "550e8400-e29b-41d4-a716-446655440000",
"merchantLogin": "merchant_login",
"customerId": "customer-123",
"amount": 10000,
"currency": 643,
"email": "customer@example.com",
"status": "ACTIVE",
"billingIntervalValue": 1,
"billingIntervalUnit": "MONTHS",
"activeTill": "2026-12-31T23:59:59+03:00",
"created": "2026-01-01T10:00:00+03:00"
}
],
"totalElements": 1,
"totalPages": 1,
"page": 0,
"size": 20
}Примеры ответов с ошибкой
500 Internal Server Error
{ "error": "Internal server error" }Детали подписки
Для получения полной информации о подписке используется метод POST /v1/subscriptions/details. Метод возвращает параметры подписки и список связанных платежей.
Для активной подписки первым элементом в payments возвращается платёж активации (первичная оплата). Последующие элементы — рекуррентные списания.
Тело запроса
Пример запроса деталей подписки
curl --request POST \
--url https://sandbox.rbsuat.com/wheel/v1/subscriptions/details \
--header 'content-type: application/json;charset=UTF-8' \
--data '{
"username": "merchant_login",
"password": "merchant_password",
"subscriptionUuid": "550e8400-e29b-41d4-a716-446655440000"
}'Пример успешного ответа
{
"subscriptionId": "550e8400-e29b-41d4-a716-446655440000",
"merchantLogin": "merchant_login",
"customerId": "customer-123",
"amount": 10000,
"currency": 643,
"email": "customer@example.com",
"phone": "+79001234567",
"billingIntervalValue": 1,
"billingIntervalUnit": "MONTHS",
"description": "Ежемесячная подписка",
"status": "ACTIVE",
"mdOrder": "abc12345-0000-0000-0000-000000000000",
"bindingId": "binding-id-12345",
"activeTill": "2026-12-31T23:59:59+03:00",
"nextChargeAt": "2026-07-01T10:00:00+03:00",
"created": "2026-01-01T10:00:00+03:00"
}Примеры ответов с ошибкой
404 Not Found — подписка не найдена или принадлежит другому мерчанту
{ "error": "Subscription not found: 550e8400-e29b-41d4-a716-446655440000" }500 Internal Server Error
{ "error": "Internal server error" }Отмена подписки
Для отмены подписки используется метод POST /v1/subscriptions/deactivate. Метод переводит подписку в статус CANCELLED и завершает связанный рекуррентный процесс.
Повторная отмена уже отменённой подписки возвращает ошибку 422.
Тело запроса
false — дождаться конца текущего расчетного периода; true — отменить немедленно. Значение по умолчанию: false.Пример запроса отмены подписки
curl --request POST \
--url https://sandbox.rbsuat.com/wheel/v1/subscriptions/deactivate \
--header 'content-type: application/json;charset=UTF-8' \
--data '{
"username": "merchant_login",
"password": "merchant_password",
"subscriptionId": "550e8400-e29b-41d4-a716-446655440000",
"force": false
}'Пример успешного ответа
{
"subscriptionId": "550e8400-e29b-41d4-a716-446655440000",
"status": "CANCELLED"
}Примеры ответов с ошибкой
404 Not Found
{ "error": "Subscription not found: 550e8400-e29b-41d4-a716-446655440000" }422 Unprocessable Entity — подписка уже отменена
{ "error": "Subscription already cancelled: 550e8400-e29b-41d4-a716-446655440000" }500 Internal Server Error
{ "error": "Internal server error" }Обновление подписки
Для обновления подписки используется метод POST /v1/subscriptions/update. Метод изменяет сумму и/или интервал списания. Если опциональное поле не передано, текущее значение этого поля сохраняется.
Подписка в статусе CANCELLED не может быть обновлена.
Тело запроса
billingIntervalUnit. Должен быть целым числом больше 0.DAYS, WEEKS, MONTHS, YEARS.Пример запроса обновления подписки
curl --request POST \
--url https://sandbox.rbsuat.com/wheel/v1/subscriptions/update \
--header 'content-type: application/json;charset=UTF-8' \
--data '{
"username": "merchant_login",
"password": "merchant_password",
"subscriptionId": "550e8400-e29b-41d4-a716-446655440000",
"amount": 15000,
"billingIntervalValue": 1,
"billingIntervalUnit": "MONTHS"
}'Пример успешного ответа
{
"subscriptionId": "550e8400-e29b-41d4-a716-446655440000",
"status": "ACTIVE",
"amount": 15000,
"billingIntervalValue": 1,
"billingIntervalUnit": "MONTHS"
}Примеры ответов с ошибкой
404 Not Found
{ "error": "Subscription not found: 550e8400-e29b-41d4-a716-446655440000" }422 Unprocessable Entity — подписка отменена
{ "error": "Cannot update cancelled subscription: 550e8400-e29b-41d4-a716-446655440000" }500 Internal Server Error
{ "error": "Internal server error" }