Developers API & Widget
PT

Pagamentos

Integração de Pagamentos & Widget

A integração dos pagamentos com Wealth Reader é feita em duas fases: preparação da intenção imutável no backend e montagem do widget seguro no frontend.

A chave API (X-API-Key) nunca deve aparecer em HTML, JavaScript do cliente, logs do navegador ou parâmetros de URL.

1. Diretório de entidades bancárias

Para descobrir quais bancos estão disponíveis e obter seus logos, nomes e requisitos, você pode verificar o endpoint da entidade diretamente pelo backend. Cada entidade vem com dois logos: logo, aquele que Wealth Reader recomendado exibir (seu próprio logotipo vetorial quando existe, o logo do provedor caso contrário, segundo logo_source), e logo_fallback, o do provedor, para que sua interface possa usá-lo caso o primeiro não carregue:

curl --request GET 'https://api.wealthreader.com/payments/entities/?country=ES'

Este endpoint é público: não envie X-API-Key. Fazer isso não altera a resposta, consome uma chamada da sua cota e, se os pagamentos fossem desativados na sua conta, converteria uma consulta funcional em um 503.

Também suporta parâmetros opcionais de consulta:

  • country: Código ISO de duas letras (por exemplo, ES, FR, DE, IT, PT...). Com ALL ou vazio, ele não é filtrado por país.
  • search (apelido q): busca textual por nome ou código (por exemplo, santander, bbva).
  • code- Recupera uma entidade específica pelo seu código exato.
  • payment_method: Filtra por método suportado (por exemplo, sepa_credit_transfer).
  • limit e offset: paginação dos resultados.

Resposta curta de exemplo:

{
  "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
    }
  ]
}

Padrão recomendado para exibir o logo com fallback automático:

<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; }">

Em /payments/entities/ ambos os campos estão sempre presentes e são null quando não há logo. As instituições de POST /payments/?action=profile-institutions e widgets carregam os mesmos logo e logo_fallback como campos opcionais: eles estão ausentes quando não há logotipo utilizável. Logos apontam apenas para cdn.wealthreader.com ou assets.exthand.com; se sua página tem CSP, adicione ambos os hosts ao img-src.

Perfis gerenciados (como a demonstração de doação): Se você estiver usando um perfil pré-configurado como cruz_roja_demo, consulte as instituições e condições definidas pelo servidor chamando POST /payments/?action=profile-institutions com o corpo {"profile": "cruz_roja_demo"}.

2. Criar uma intenção de pagamento no backend

Quando o cliente decide pagar no checkout, o servidor gera uma chave de idempotência única e solicita a criação imutável do pagamento no API de Wealth Reader.

Modelo padrão para comerciantes (Beneficiário próprio)

O comerciante especifica sua conta de cobrança, o valor em centavos (amount_minor), a referência de pagamento e a origem web onde o widget será carregado:

: "${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"
  }'

Nota: allowed_institution_codes é opcional. Se for omitido, o usuário poderá escolher entre todas as entidades do catálogo.

Modelo com Perfil Gerenciado (Demonstração de Doação)

Se você integrar o perfil gerenciado 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"
  }'

Resposta do API

O API responde confirmando a intenção imutável e entregando os dados para inicializar o widget:

{
  "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"
    }
  }
}

Seu backend deve entregar ao navegador do usuário apenas o payment.id e payment.widget.token.

3. Monte o widget na interface

Existem duas maneiras de montar o widget na sua interface web: usando o script declarativo oficial ou usando o API JavaScript programático.

Opção A: Via script declarativo (load-payments.js)

Incorpore o contêiner e o script de carregamento na sua página de checkout:

<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>

Opção B: via JavaScript API (WealthReaderPayments.mount)

Se você está usando frameworks como React, Vue, Angular ou um fluxo SPA:

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() não suporta nenhum callback- suas chaves são target, paymentIntentId, widgetToken, locale, widgetOrigin e apiOrigin. Qualquer outra é descartada silenciosamente, então uma onEvent passada na configuração não falharia e nunca seria executada. Sempre preste atenção ao evento wealthreader:payment do container.

O widget obtém a configuração diretamente dos servidores Wealth Reader , com o token utilizável apenas uma vez. Se o banco exigir a identificação da conta de débito antes de redirecionar, o widget solicita o IBAN de débito diretamente do pagador, sem que o comerciante precise processá-lo.

Eventos Principais do Widget

type Significado
ready O widget foi inicializado e informações imutáveis estão disponíveis.
authorization_started O usuário iniciou a autorização bancária (redirecionada para SCA ou aplicativo bancário).
processing A autenticação bancária foi concluída e o sistema está processando a operação.
payment_status Reporte uma mudança no status do pagamento (pending, settled, rejected, etc.).
height_changed Ajuste dinâmico da altura do iframe para evitar barras de rolagem.
flow_closed O usuário fechou o widget ou a interação técnica terminou.

Lembre-se de que o evento flow_closed apenas confirma o fechamento da janela, não constitui confirmação de pagamento. Seu backend deve sempre verificar o status ligando de servidor para servidor.

Próximo passo

Análise Intenções e idempotência.

Última atualização