Подписка картой и СБП
Вместо подтверждения по SMS абонент привязывает банковскую карту или платит по QR-коду СБП. Отдельного метода у этого сценария нет: тот же CreateSubscription с CustomerType=Card, а СБП — это параметр на странице оплаты.
Мерчант Subscription Service Абонент
│ │ │
│ 1. CreateSubscription ───►│ │
│ CustomerType=Card │ │
│◄── SubscriptionID + │ │
│ AuthorizeUrl ──────────│ │
│ 2. редирект на AuthorizeUrl ────────────────────────►│
│ │◄── карта или QR СБП ─────│
│◄─ SubscriptionStatusNotification (APPROVED) ─────────│CreateSubscriptionсCustomerType=CardиCustomerId. В ответе —AuthorizeUrl,SubscriberAcceptanceChannel=AUTH_PAGEиSubscriptionStatus=Pending.- Перенаправьте абонента на
AuthorizeUrl. Для оплаты через СБП добавьте к адресу?useSbpQr=True— вместо формы карты откроется СБП-сценарий, свой для десктопа и телефона (см. ниже). - Абонент платит. Реквизиты в песочнице не проверяются: подойдёт любой номер карты и любой PIN. Чтобы получить отказ, используйте карту с последними 4 цифрами
0001…0005. - Подписка активируется: статус
Active, приходит коллбекEventType=APPROVED. При отказе карты —ApprovingFailedиEventType=REJECTED.ApproveSubscriptionв этом сценарии не вызывается.
Сценарий СБП зависит от устройства
| Устройство | Что видит абонент |
|---|---|
| Десктоп | Универсальный QR-код. Абонент сканирует его телефоном и подтверждает оплату в приложении своего банка — банк на странице не выбирается |
| Телефон | Список банков. QR сканировать нечем, поэтому абонент выбирает банк и переходит в его приложение по диплинку |
Экран выбирается по User-Agent; чтобы посмотреть оба с одной машины, добавьте к адресу ?view=qr или ?view=banks.
На экране оплаты видны условия подписки: сумма текущего списания, дальнейшая сумма с периодичностью и пометка об автопродлении — без них плательщик видел бы только разовую сумму. Период берётся из ручки BillingPeriodSeconds, если она задана.
СБП и SberPay мок не различает — оба ведут на один QR-экран. Ссылка одноразовая и живёт 15 минут, как и checkout разовых платежей.
Экраны оплаты двуязычные. Язык определяется автоматически по Accept-Language браузера абонента — ни к AuthorizeUrl, ни к странице WAP-подтверждения дописывать ничего не нужно. Чтобы открыть конкретную версию, добавьте ?lang=en или ?lang=ru (сочетается с ?useSbpQr=True и ?view=): явный выбор важнее заголовка и держится до конца сценария. Язык, которого нет, даёт русский.
<Request>
<SubscriptionProjectID>2001</SubscriptionProjectID>
<CustomerType>Card</CustomerType>
<CustomerId>12345</CustomerId>
<Now>20260625120000</Now>
<Signature>d2f36558ca5455be...</Signature>
</Request>Sandbox
<Response>
<StatusID>0</StatusID>
<StatusName>REQUEST_ACCEPTED</StatusName>
<SubscriptionID>10000002</SubscriptionID>
<SubscriptionStatus>Pending</SubscriptionStatus>
<SubscriberAcceptanceChannel>AUTH_PAGE</SubscriberAcceptanceChannel>
<AuthorizeUrl>https://subs-sandbox.digitalspb.com/Cards/TB/8c0c8870-.../Init</AuthorizeUrl>
<PaidUntil>2026-09-16T12:00:00+03:00</PaidUntil>
<TrialExists>false</TrialExists>
</Response>Sandbox
# к AuthorizeUrl добавляется параметр
https://subs-sandbox.digitalspb.com/Cards/TB/8c0c8870-.../Init?useSbpQr=TrueSandbox
0001 — недостаточно средств
0002 — карта заблокирована
0003 — превышен лимит
0004 — отклонено банком
0005 — истёк срок действия