Платежи
Интеграция платежей и виджет
Интеграция платежей с Wealth Reader происходит в два этапа: подготовка неизменного намерения в вашем бэкенде и сборка защищённого виджета на фронтенде.
Ключ API (X-API-Key) никогда не должен появляться в HTML, клиентском JavaScript, журналах браузера или параметрах URL.
1. Справочник банковских организаций
Чтобы узнать, какие банки доступны, а также получить их логотипы, названия и требования, вы можете проверить конечную точку организации напрямую с её бэкенда. Каждая организация оснащена двумя логотипами: logo, тот, который Wealth Reader рекомендовали показывать (собственный векторный логотип, если он есть, иначе — логотип провайдера, согласно logo_source), и logo_fallback, провайдера, чтобы интерфейс мог использовать его, если первый не загрузится:
curl --request GET 'https://api.wealthreader.com/payments/entities/?country=ES'
Эта конечная точка публичная: не отправляйте X-API-Key. Это не меняет ответ, он поглощает звонок из вашей квоты, и если платежи отключены в вашем аккаунте, рабочий запрос преобразуется в 503.
Также поддерживаются опциональные параметры запроса:
country: ISO двухбуквенный код (например,ES,FR,DE,IT,PT...). СALLили пустым он не фильтруется по странам.search(псевдонимq): текстовый поиск по имени или коду (например,santander,bbva).code- Получает конкретную сущность по её точному коду.payment_method: Фильтры по поддерживаемому методу (например,sepa_credit_transfer).limitиoffset: пагинация результатов.
Пример краткого ответа:
{
"success": true,
"total": 2,
"entities": [
{
"code": "santander-es",
"name": "Banco Santander",
"country": "ES",
"logo": "https://cdn.wealthreader.com/santander.svg",
"logo_fallback": "https://assets.exthand.com/bsdk/banks/logos/ES/santander.svg",
"logo_source": "wealthreader",
"payment_methods": ["sepa_credit_transfer", "instant_sepa_credit_transfer"],
"requires_debtor_iban": true
},
{
"code": "bbva-es",
"name": "BBVA",
"country": "ES",
"logo": "https://cdn.wealthreader.com/bbva.svg",
"logo_fallback": "https://assets.exthand.com/bsdk/banks/logos/PT/bbva.svg",
"logo_source": "wealthreader",
"payment_methods": ["sepa_credit_transfer", "instant_sepa_credit_transfer"],
"requires_debtor_iban": false
}
]
}
Рекомендуемый способ отображения логотипа с автоматическим переходом на резервный вариант:
<img src="https://cdn.wealthreader.com/santander.svg"
data-fallback="https://assets.exthand.com/bsdk/banks/logos/ES/santander.svg"
alt="Banco Santander" width="160" height="48"
onerror="if (this.dataset.fallback && this.src !== this.dataset.fallback) { this.src = this.dataset.fallback; } else { this.hidden = true; }">
В /payments/entities/ оба поля всегда присутствуют и null при отсутствии логотипа. Институты POST /payments/?action=profile-institutions и виджетов несут те же logo и logo_fallback , что и необязательные поля: они отсутствуют, если логотип отсутствует. Логотипы указывают только на cdn.wealthreader.com или assets.exthand.com; если на вашей странице есть CSP, добавьте оба хоста в img-src.
Управляемые профили (например, демонстрация пожертвования): Если вы используете заранее настроенный профиль, например
cruz_roja_demo, запросите учреждения и условия, установленные сервером, позвонивPOST /payments/?action=profile-institutionsчерез тело{"profile": "cruz_roja_demo"}.
2. Создайте платёжное намерение на бэкенде
Когда клиент решает оплатить при оформлении заказа, сервер продавца генерирует уникальный ключ идемпотентности и запрашивает неизменное создание платежа в API Wealth Reader.
Стандартная модель для торговцев (собственный бенефициар)
Продавец указывает свой счёт для получения платежей, сумму в центах (amount_minor), ссылку на платеж и веб-источник, где будет загружаться виджет:
: "${WR_API_KEY:?Defina WR_API_KEY en el entorno seguro de su backend}"
: "${WR_PAYMENT_IDEMPOTENCY_KEY:?Genere una clave UUID v4 o de alta entropía para este intento}"
curl --request POST 'https://api.wealthreader.com/payments/?action=create' \
--header 'Content-Type: application/json' \
--header "X-API-Key: ${WR_API_KEY}" \
--header "Idempotency-Key: ${WR_PAYMENT_IDEMPOTENCY_KEY}" \
--data '{
"amount_minor": 1500,
"currency": "EUR",
"beneficiary": {
"name": "Comercio Online S.L.",
"iban": "ES9121000418450200051332"
},
"reference": "Pedido #78901",
"customer_reference": "pedido-78901",
"allowed_origin": "https://tienda.example.com",
"allowed_institution_codes": ["santander-es", "bbva-es", "caixabank-es", "sabadell-es"],
"locale": "es"
}'
Примечание: allowed_institution_codes является необязательным. Если он опущен, пользователь сможет выбрать из всех объектов каталога.
Модель с управляемым профилем (демонстрация пожертвования)
Если интегрировать управляемый профиль cruz_roja_demo:
curl --request POST 'https://api.wealthreader.com/payments/?action=create' \
--header 'Content-Type: application/json' \
--header "X-API-Key: ${WR_API_KEY}" \
--header "Idempotency-Key: ${WR_PAYMENT_IDEMPOTENCY_KEY}" \
--data '{
"profile": "cruz_roja_demo",
"institution_code": "santander-es",
"amount_minor": 100,
"customer_reference": "donativo-demo-0042",
"allowed_origin": "https://tienda.example.com",
"locale": "es",
"expected_mode": "live"
}'
Ответ API
API отвечает, подтверждая неизменное намерение и доставляя данные для инициализации виджета:
{
"success": true,
"payment": {
"id": "11111111-1111-4111-8111-111111111111",
"amount_minor": 1500,
"currency": "EUR",
"state": "ready",
"interaction_status": "not_started",
"payment_status": "not_initiated",
"payment_attestation": {
"mode": "live",
"provider_binding": "PROVIDER_BINDING"
},
"widget": {
"url": "https://widget.wealthreader.com/payments/",
"token": "SHORT_LIVED_WIDGET_TOKEN",
"expires_at": "2026-09-04T15:30:00+00:00"
}
}
}
Ваш бэкенд должен доставлять в браузер пользователя только payment.id и payment.widget.token.
3. Установите виджет на фронтенд
Существует два способа смонтировать виджет в вашем веб-интерфейсе: с помощью официального декларативного скрипта или программного JavaScript API .
Вариант А: с помощью декларативного скрипта (load-payments.js)
Вставьте контейнер и скрипт загрузки на страницу оформления заказа:
<div id="wr-payment-container"></div>
<script>
document.querySelector('#wr-payment-container').addEventListener(
'wealthreader:payment',
(event) => {
console.log('Evento de pago recibido:', event.detail.type, event.detail);
if (event.detail.type === 'payment_status') {
console.log('Estado actual:', event.detail.status);
}
if (event.detail.type === 'flow_closed') {
// La interacción del usuario ha finalizado.
// Consulte el estado financiero definitivo desde su backend.
}
}
);
</script>
<script
src="https://widget.wealthreader.com/js/load-payments.js"
data-target="#wr-payment-container"
data-payment-intent-id="11111111-1111-4111-8111-111111111111"
data-widget-token="SHORT_LIVED_WIDGET_TOKEN"
data-locale="es">
</script>
Вариант B: через JavaScript API (WealthReaderPayments.mount)
Если вы используете фреймворки вроде React, Vue, Angular или SPA flow:
import { useEffect, useRef } from 'react';
// Cargue previamente https://widget.wealthreader.com/js/load-payments.js
const target = document.getElementById('wr-payment-container');
// Los eventos llegan como CustomEvent del DOM sobre el propio contenedor.
target.addEventListener('wealthreader:payment', (event) => {
const detail = event.detail;
if (detail.type === 'payment_status') {
console.log('Estado del pago:', detail.status);
}
if (detail.type === 'flow_closed') {
// Notificar al backend para comprobar la liquidación
}
});
window.WealthReaderPayments.mount({
target: target,
paymentIntentId: '11111111-1111-4111-8111-111111111111',
widgetToken: 'SHORT_LIVED_WIDGET_TOKEN',
locale: 'es'
});
mount() не поддерживает никакой callback— его ключи target, paymentIntentId, widgetToken, locale, widgetOrigin и apiOrigin. Любые другие ключи тихо отбрасываются, поэтому onEvent , переданный в конфигурацию, не провалится и не будет выполнен. Всегда слушайте wealthreader:payment событие контейнера.
Виджет получает конфигурацию напрямую с Wealth Reader серверов, и token можно использовать только один раз. Если банк требует идентификацию дебетового счета перед перенаправлением, виджет запрашивает дебетовый IBAN напрямую у плательщика без необходимости обработки продавцом.
Основные события Widget
type |
Значение |
|---|---|
ready |
Виджет инициализован, и доступна неизменяемая информация. |
authorization_started |
Пользователь инициировал банковскую авторизацию (перенаправленную в SCA или банковское приложение). |
processing |
Аутентификация банка завершена, и система обрабатывает операцию. |
payment_status |
Сообщите об изменении статуса платежа (pending, settled, rejectedи т.д.). |
height_changed |
Динамическая настройка высоты iframe, чтобы избежать полос прокрутки. |
flow_closed |
Пользователь закрыл виджет или техническое взаимодействие завершилось. |
Помните, что событие flow_closed только подтверждает закрытие окна, оно не считается подтверждением оплаты. Ваш бэкенд всегда должен проверять статус, звоня сервер-сервер.
Следующий шаг
Обзор Намерения и идемпотентность.