Developers API & Widget
RU

Платежи

Интеграция платежей и виджет

Интеграция платежей с 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 только подтверждает закрытие окна, оно не считается подтверждением оплаты. Ваш бэкенд всегда должен проверять статус, звоня сервер-сервер.

Следующий шаг

Обзор Намерения и идемпотентность.

Последнее обновление