Skip to Content

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

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

Что нужно

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

Шаг 1. Создать счёт

Счёт создаётся на сервере мерчанта — тем же CreateInvoice, что в Сценарии: карта. Креды и подпись в браузер не попадают.

Токен отдаётся только карточной ветке — клиенту UndefinedBankCardCustomer (в JSON undefined_bank_card) или BankCardCustomer. У DCB-счёта по номеру телефона виджета нет.

JSON — POST /invoices, как для карты
{ "customer": { "type": "undefined_bank_card", "source": "my_source", "country": "RU", "merchant_customer_id": "user_123" }, "order": { "merchant_order_id": "ORDER-001", "price": { "amount": "99.00", "currency": "RUB", "vat_included": true } } }

Из ответа виджету нужны идентификатор счёта и токен: authorization.token в JSON, AuthorizationInfo.AuthorizationToken в XML.

Шаг 2. Встроить виджет

Страница оплаты — песочница
<div id="pay"></div> <script src="https://pay-sandbox.digitalspb.com/Card/Sbp/embed.js"></script> <script> SbpWidget.mount('#pay', { invoiceId: 'A1B2C3...', // из ответа CreateInvoice token: 'eyJ...', // authorization.token / AuthorizationToken оттуда же lang: 'ru', // необязательно: страницы песочницы двуязычные, ru или en onSuccess: function () { location.href = '/thanks'; }, onFail: function () {}, onExpired: function () {}, onError: function (e) { console.log(e.code, e.message); } }); </script>

Режим модального окна — SbpWidget.open() с теми же параметрами без селектора. Без embed.js виджет открывается ссылкой — например, в WebView:

GET https://pay-sandbox.digitalspb.com/Card/Sbp/widget.html?invoiceId={invoiceId}&t={token}&lang=en

Токен передаётся параметром t; прежнее имя token песочница тоже принимает.

Шаг 3. Довести оплату до результата

Настоящих банков в песочнице нет, поэтому подтверждение заменено симуляцией:

СпособКак подтвердить оплату
ЛюбойКнопка «Симулировать оплату» внутри виджета
СБП, QR на компьютереОтсканировать QR телефоном: в песочнице код ведёт на адрес подтверждения оплаты самой песочницы
Alfa Pay, SberPay, T-PayКнопка способа открывает имитацию приложения банка — в ней есть кнопка подтверждения

Виджет опрашивает статус раз в 5 секунд и после оплаты присылает событие success — сработает onSuccess. Событие виджета — сигнал для интерфейса; состояние самого счёта проверяется как обычно: Статус инвойса, Коллбеки.

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

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

GET https://pay-sandbox.digitalspb.com/Card/Handlers/{invoiceId}/pay?method=alfapay&t={token}

alfapay, sberpay и tpay уводят на имитацию приложения банка, sbp — на страницу с QR-кодом. Неизвестный код method даёт 400.

Что проверить кроме успешной оплаты

ЧтоКак воспроизвестиЧто ожидать
Негодный токенОткрыть widget.html с чужим или испорченным tОтвет 401 и экран «Ссылка недействительна» вместо формы оплаты
Неподключённый способНа проекте, где подключён только СБП, передать methods: ['alfapay']Виджет показывает весь доступный набор и вызывает onError с code: 'method_unavailable'; оплата продолжается
Возврат на страницуНачать оплату и перезагрузить вкладкуОткрывается уже начатый платёж, способ заново не выбирается

Отличия от боя

В песочницеВ бою
SDK — https://pay-sandbox.digitalspb.com/Card/Sbp/embed.jsSDK — с платёжного домена, https://pay.digitalspb.com/Card/Sbp/embed.js. apiBase по умолчанию берётся из адреса скрипта, поэтому смена окружения — это смена адреса embed.js
Кнопка «Симулировать оплату» и имитация приложения банкаИх нет — оплата подтверждается в настоящем банке
Ответ ручки QR несёт поле sandbox_confirm_url — адрес симуляцииТакого поля нет; не завязывайте на него код
Токен — JWT, выпущенный песочницейФормат токена платформой не описан: передавайте его виджету как есть, не разбирайте