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...). ComALLou vazio, ele não é filtrado por país.search(apelidoq): 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).limiteoffset: 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 chamandoPOST /payments/?action=profile-institutionscom 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.