Виджет оплаты в песочнице
Виджет оплаты работает в песочнице так же, как в бою: те же embed., mount() / open(), способы оплаты, события и редирект-маршрут /pay. Полное описание параметров — в гайде. Здесь — что подставить в песочнице и как довести оплату до результата без настоящего банка.
Что нужно
| Что | В песочнице |
|---|---|
| SDK | https://pay-sandbox.digitalspb.com/Card/Sbp/embed.js |
| Доступы и проект | Демо-доступы из раздела Доступ и тестовые данные |
| Способы оплаты | На демо-проекте подключены все четыре — sbp, alfapay, sberpay, tpay, и экран выбора виден сразу. У остальных проектов по умолчанию только СБП, набор меняется по запросу |
| Токен виджета | Приходит в ответе CreateInvoice, живёт 2 часа |
Шаг 1. Создать счёт
Счёт создаётся на сервере мерчанта — тем же CreateInvoice, что в Сценарии: карта. Креды и подпись в браузер не попадают.
Токен отдаётся только карточной ветке — клиенту UndefinedBankCardCustomer (в JSON undefined_bank_card) или BankCardCustomer. У DCB-счёта по номеру телефона виджета нет.
{
"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. в JSON, AuthorizationInfo. в 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. виджет открывается ссылкой — например, в 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. с чужим или испорченным t | Ответ 401 и экран «Ссылка недействительна» вместо формы оплаты |
| Неподключённый способ | На проекте, где подключён только СБП, передать methods: ['alfapay'] | Виджет показывает весь доступный набор и вызывает onError с code: 'method_unavailable'; оплата продолжается |
| Возврат на страницу | Начать оплату и перезагрузить вкладку | Открывается уже начатый платёж, способ заново не выбирается |
Отличия от боя
| В песочнице | В бою |
|---|---|
SDK — https://pay-sandbox.digitalspb.com/Card/Sbp/embed.js | SDK — с платёжного домена, https://pay.digitalspb.com/Card/Sbp/embed.js. apiBase по умолчанию берётся из адреса скрипта, поэтому смена окружения — это смена адреса embed. |
| Кнопка «Симулировать оплату» и имитация приложения банка | Их нет — оплата подтверждается в настоящем банке |
Ответ ручки QR несёт поле sandbox_confirm_url — адрес симуляции | Такого поля нет; не завязывайте на него код |
| Токен — JWT, выпущенный песочницей | Формат токена платформой не описан: передавайте его виджету как есть, не разбирайте |