Виджет оплаты подписок в песочнице
Виджет оплаты подписок работает в песочнице так же, как в бою: те же embed., mount() / open(), способы оплаты, параметры methods и webview, события и маршрут собственных кнопок. Полное описание параметров — в гайде. Здесь — что подставить в песочнице и как довести начальный шаг до результата без настоящего банка.
success в этом виджете — успешный начальный шаг: первый платёж либо, при отложенной первой оплате, привязка через СБП без списания. Событие браузера не заменяет серверные уведомления об активации и тарификации.
Что нужно
| Что | В песочнице |
|---|---|
| SDK | https://subs-sandbox.digitalspb.com/Cards/Sbp/embed.js |
| Доступы и проект | Демо-доступы из раздела Доступ и тестовые данные |
| Способы оплаты | На демо-проекте подключены sbp, alfapay и sberpay, и экран выбора виден сразу. T-Pay в виджете подписок отключён — как в бою. У остальных проектов по умолчанию только СБП, набор меняется по запросу |
| Токен виджета | Из AuthorizeUrl ответа CreateSubscription |
Шаг 1. Создать подписку
Подписка создаётся на сервере партнёра — тем же CreateSubscription с CustomerType=Card, что в разделе Подписка картой и СБП. Секрет проекта и подпись в браузер не попадают.
<Request>
<SubscriptionProjectID>2001</SubscriptionProjectID>
<CustomerType>Card</CustomerType>
<CustomerId>12345</CustomerId>
<Now>20260625120000</Now>
<Signature>d2f36558ca5455be...</Signature>
</Request>В ответе — AuthorizeUrl и SubscriptionStatus=Pending. Токен для виджета лежит внутри AuthorizeUrl — 32 шестнадцатеричных символа.
Набор способов зависит от условий подписки (§6.8 гайда):
BillingStartTimeUtc в запросе | Ответ | Способы в виджете |
|---|---|---|
| Не передано или время в прошлом | TrialExists=false | Любой из подключённых — первый период оплачивается при оформлении |
| Время в будущем | TrialExists=true | Только СБП — первая оплата отложена, начальный шаг — привязка без списания |
Если встраивается виджет, AuthorizeUrl открывать не нужно — это отдельный сценарий оплаты, и он конфликтует с виджетом по тому же токену.
Шаг 2. Встроить виджет
<div id="bind"></div>
<script src="https://subs-sandbox.digitalspb.com/Cards/Sbp/embed.js"></script>
<script>
SbpWidget.mount('#bind', {
token: '8c0c8870d6fb4ee8a995ae183a44b928', // из AuthorizeUrl ответа CreateSubscription
methods: ['sbp', 'sberpay'], // необязательно: сузить набор способов
onSuccess: function () { location.href = '/subscribed'; },
onFail: function () {},
onExpired: function () {},
onError: function (e) { console.log(e.message, e.code); }
});
</script>Счёта здесь нет, поэтому invoiceId не передаётся — виджет адресует сессию подписки токеном. Режим модального окна — SbpWidget.open() с теми же параметрами без селектора. webview: true включает режим WebView, как в бою.
Шаг 3. Подтвердить начальный шаг
Настоящих банков в песочнице нет, поэтому подтверждение заменено симуляцией:
| Способ | Как подтвердить |
|---|---|
| Любой | Кнопка симуляции внутри виджета — она доводит сценарий до success |
| Alfa Pay, SberPay | Кнопка способа открывает имитацию приложения банка — в ней есть кнопка подтверждения |
Что происходит дальше:
- Виджет опрашивает состояние раз в 5 секунд и присылает
success— сработаетonSuccess. - Подписка переходит в
Active, партнёру уходит коллбекEventType=APPROVED— первый коллбек песочница отправляет с задержкой 15 секунд. - Отдельного уведомления о первом списании песочница не шлёт: после успешного начального шага приходит только
APPROVED. Чтобы увидеть цикл списаний и уведомления о них, его включают блоком<TestInfo>— см. Хуки песочницы: Списания. Без него придут только уведомления об активации, отказе и отмене.
Свои кнопки — redirect-маршрут
Маршрут из §6.12 гайда в песочнице тоже работает:
GET https://subs-sandbox.digitalspb.com/Cards/Sbp/pay?token={token}&method=sberpayalfapay и sberpay уводят на имитацию приложения банка, sbp — на экран виджета без выбора способа. Неизвестный или недоступный для подписки способ, в том числе tpay, даёт 400 HTML-страницей.
Список способов без создания платежа — GET https://subs-sandbox.digitalspb.com/Cards/Sbp/methods с заголовком Authorization: Bearer {token}.
Что проверить кроме успешного начального шага
| Что | Как воспроизвести | Что ожидать |
|---|---|---|
| Негодный токен | Открыть виджет с чужим или испорченным токеном | Ответ 401 и экран «Ссылка недействительна» |
| Пустой фильтр | Передать methods: ['tpay'] | Виджет показывает весь доступный набор и вызывает onError с code: 'method_unavailable'; оформление продолжается |
| Отложенная первая оплата | Создать подписку с BillingStartTimeUtc в будущем и открыть виджет | В ответе CreateSubscription — TrialExists=true, в виджете только СБП; /Cards/Sbp/pay с alfapay или sberpay отвечает 400 |
| Повторный запуск | Обновить виджет с тем же токеном в пределах срока жизни и выбрать тот же способ | Та же начатая операция: у СБП — тот же QR-код, новой сессии нет |
| Другой способ для начатой операции | Начать операцию одним способом, открыть виджет заново с тем же токеном и выбрать другой | Сервер отклоняет выбор — 409 METHOD_LOCKED, can_change_method: false; виджет просит выбрать прежний способ |
Перезагрузка страницы партнёра, которая заново вызывает CreateSubscription, создаёт новую подписку с новым токеном. Прежняя операция остаётся действующей, и подтверждение по ней активирует прежнюю подписку, а не ту, что на экране. При проверках это главный источник путаницы — порядок проверки описан в §6.10 гайда.
Отличия от боя
| В песочнице | В бою |
|---|---|
SDK — https://subs-sandbox.digitalspb.com/Cards/Sbp/embed.js | SDK — с платёжного домена, https://subs.digitalspb.com/Cards/Sbp/embed.js. apiBase по умолчанию берётся из адреса скрипта, поэтому смена окружения — это смена адреса embed. |
| Кнопка симуляции и имитация приложения банка | Их нет — первый платёж или привязка подтверждается в настоящем банке |
Денег никто не снимает: после успешного начального шага приходит только APPROVED, списания — по <TestInfo> | Первый платёж при оформлении либо привязка без списания и первое списание по расписанию (§6.8 гайда) |
Отложенную первую оплату включает BillingStartTimeUtc в будущем | Нужна поддержка бесплатной СБП-привязки у платёжного провайдера проекта |
Ответ ручки начального шага (POST /Cards/Sbp/create) несёт поле sandbox_confirm_url — адрес симуляции | Такого поля нет; не завязывайте на него код |
| Правовые сноски виджета (условия подписки, согласие на обработку данных) ведут на заглушки | Ведут на настоящие документы |