Plăți
Integrarea plăților & Widget-uri
Integrarea plăților cu Wealth Reader se face în două faze: pregătirea intenției imuabile în backend și asamblarea widget-ului securizat în frontend.
Cheia API (X-API-Key) nu ar trebui să apară niciodată în HTML, JavaScript client, jurnale de browser sau parametri URL.
1. Directorul entităților bancare
Pentru a afla care bănci sunt disponibile și pentru a obține logo-urile, numele și cerințele lor, poți verifica punctul final al entității direct din backend-ul său. Fiecare entitate vine cu două logo-uri: logo, cel pe care Wealth Reader recomandat să îl afișeze (propriul său logo vectorial când există, logo-ul furnizorului altfel, conform logo_source), și logo_fallback, al furnizorului, astfel încât interfața sa să îl poată folosi dacă primul nu se încarcă:
curl --request GET 'https://api.wealthreader.com/payments/entities/?country=ES'
Acest endpoint este public: nu trimite X-API-Key. Făcând asta, răspunsul nu schimbă răspunsul, consumă un apel din cota ta, iar dacă plățile ar fi dezactivate în contul tău, ar converti o interogare funcțională într-un 503.
De asemenea, suportă parametri opționali de interogare:
country: Cod ISO cu două litere (de exempluES,FR,DE,IT,PT...). CuALLsau gol, nu este filtrat după țară.search(aliasq): căutare textuală după nume sau cod (de ex.santander,bbva).code- Recuperează o entitate specifică prin codul său exact.payment_method: Filtrează după metodele suportate (de exemplu,sepa_credit_transfer).limitșioffset: paginarea rezultatelor.
Exemplu de răspuns scurt:
{
"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
}
]
}
Model recomandat pentru afișarea logo-ului cu suport automat:
<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; }">
În /payments/entities/ ambele câmpuri sunt mereu prezente și sunt null când nu există logo. Instituțiile POST /payments/?action=profile-institutions și widget poartă aceleași logo și logo_fallback ca câmpuri opționale: lipsesc când nu există un logo utilizabil. Logo-urile indică doar către cdn.wealthreader.com sau assets.exthand.com; dacă pagina ta are CSP, adaugă ambele gazde la img-src.
Profiluri gestionate (cum ar fi demo-ul de donație): Dacă folosești un profil preconfigurat, cum ar fi
cruz_roja_demo, interogă instituțiile și condițiile stabilite de server apelândPOST /payments/?action=profile-institutionscu corpul cererii{"profile": "cruz_roja_demo"}.
2. Creează o intenție de plată în backend
Când clientul decide să plătească la finalizarea comenzii, serverul generează o cheie unică de idempotență și solicită crearea imuabilă a plății la API de Wealth Reader.
Model standard pentru comercianți (Propriul beneficiar)
Negustorul specifică contul său de colectare, suma în cenți (amount_minor), referința de plată și originea web unde se va încărca widgetul:
: "${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"
}'
Notă: allowed_institution_codes este opțional. Dacă este omis, utilizatorul va putea alege dintre toate entitățile din catalog.
Model cu profil gestionat (demonstrație de donații)
Dacă integrezi profilul gestionat 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"
}'
Răspunsul din partea API
API răspunde confirmând intenția imuabilă și livrând datele pentru a inițializa widgetul:
{
"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"
}
}
}
Backend-ul tău ar trebui să livreze browserului utilizatorului doar payment.id și payment.widget.token.
3. Montează widget-ul pe frontend
Există două moduri de a monta widget-ul în interfața ta web: folosind scriptul declarativ oficial sau folosind API JavaScript programatic.
Opțiunea A: Prin script declarativ (load-payments.js)
Încorporează containerul și scriptul de încărcare pe pagina ta 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țiunea B: Prin JavaScript API (WealthReaderPayments.mount)
Dacă folosești framework-uri precum React, Vue, Angular sau un 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() nu suportă niciun callback- cheile sale sunt target, paymentIntentId, widgetToken, locale, widgetOrigin și apiOrigin. Orice altceva este eliminat silențios, astfel încât un onEvent trecut în configurație nu ar eșua și nu ar fi niciodată executat. Întotdeauna ascultă evenimentul wealthreader:payment al containerului.
Widget-ul obține configurația direct de la serverele Wealth Reader , iar token utilizabil o singură dată. Dacă banca solicită identificarea contului de debit înainte de redirecționare, widget-ul solicită IBAN de debit direct de la plătitor, fără ca comerciantul să fie nevoit să proceseze.
Evenimentele principale Widget
type |
Semnificație |
|---|---|
ready |
Widget-ul a fost inițializat și informații imuabile sunt disponibile. |
authorization_started |
Utilizatorul a inițiat autorizarea bancară (redirecționată către SCA sau aplicația bancară). |
processing |
Autentificarea bancară s-a încheiat, iar sistemul procesează operațiunea. |
payment_status |
Raportează o schimbare a statutului plății (pending, settled, rejectedetc.). |
height_changed |
Ajustare dinamică a înălțimii iframe pentru a evita barele de derulare. |
flow_closed |
Utilizatorul a închis widget-ul sau interacțiunea tehnică s-a încheiat. |
Amintește-ți că evenimentul flow_closed confirmă doar închiderea ferestrei, nu constituie confirmare a plății. Backend-ul tău ar trebui întotdeauna să verifice starea apelând server-la-server.
Pasul următor
Recenzie Intenții și idempotență.