Skip to Content
ПесочницаПодпискиВиджет оплаты

Виджет оплаты подписок в песочнице

Виджет оплаты подписок работает в песочнице так же, как в бою: те же embed.js, mount() / open(), способы оплаты, параметры methods и webview, события и маршрут собственных кнопок. Полное описание параметров — в гайде. Здесь — что подставить в песочнице и как довести начальный шаг до результата без настоящего банка.

success в этом виджете — успешный начальный шаг: первый платёж либо, при отложенной первой оплате, привязка через СБП без списания. Событие браузера не заменяет серверные уведомления об активации и тарификации.

Что нужно

ЧтоВ песочнице
SDKhttps://subs-sandbox.digitalspb.com/Cards/Sbp/embed.js
Доступы и проектДемо-доступы из раздела Доступ и тестовые данные
Способы оплатыНа демо-проекте подключены sbp, alfapay и sberpay, и экран выбора виден сразу. T-Pay в виджете подписок отключён — как в бою. У остальных проектов по умолчанию только СБП, набор меняется по запросу
Токен виджетаИз AuthorizeUrl ответа CreateSubscription

Шаг 1. Создать подписку

Подписка создаётся на сервере партнёра — тем же CreateSubscription с CustomerType=Card, что в разделе Подписка картой и СБП. Секрет проекта и подпись в браузер не попадают.

CreateSubscription — карта / СБП
<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Кнопка способа открывает имитацию приложения банка — в ней есть кнопка подтверждения

Что происходит дальше:

  1. Виджет опрашивает состояние раз в 5 секунд и присылает success — сработает onSuccess.
  2. Подписка переходит в Active, партнёру уходит коллбек EventType=APPROVED — первый коллбек песочница отправляет с задержкой 15 секунд.
  3. Отдельного уведомления о первом списании песочница не шлёт: после успешного начального шага приходит только APPROVED. Чтобы увидеть цикл списаний и уведомления о них, его включают блоком <TestInfo> — см. Хуки песочницы: Списания. Без него придут только уведомления об активации, отказе и отмене.

Свои кнопки — redirect-маршрут

Маршрут из §6.12 гайда в песочнице тоже работает:

GET https://subs-sandbox.digitalspb.com/Cards/Sbp/pay?token={token}&method=sberpay

alfapay и 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.jsSDK — с платёжного домена, https://subs.digitalspb.com/Cards/Sbp/embed.js. apiBase по умолчанию берётся из адреса скрипта, поэтому смена окружения — это смена адреса embed.js
Кнопка симуляции и имитация приложения банкаИх нет — первый платёж или привязка подтверждается в настоящем банке
Денег никто не снимает: после успешного начального шага приходит только APPROVED, списания — по <TestInfo>Первый платёж при оформлении либо привязка без списания и первое списание по расписанию (§6.8 гайда)
Отложенную первую оплату включает BillingStartTimeUtc в будущемНужна поддержка бесплатной СБП-привязки у платёжного провайдера проекта
Ответ ручки начального шага (POST /Cards/Sbp/create) несёт поле sandbox_confirm_url — адрес симуляцииТакого поля нет; не завязывайте на него код
Правовые сноски виджета (условия подписки, согласие на обработку данных) ведут на заглушкиВедут на настоящие документы