Pagos
Pagos con Wealth Reader
Wealth Reader permite preparar una orden de pago inmutable desde el backend y completar la autorización bancaria en un widget seguro dedicado (PSD2 / PIS - Payment Initiation Services). La credencial de API, las cuentas beneficiarias sensibles y los detalles internos de conexión nunca se entregan al navegador.
El sandbox determinista permite integrar sin mover dinero real, pero no se activa con un parámetro: es un despliegue distinto, con su propia URL base y su propia credencial, que Wealth Reader facilita cuando lo solicita (véase Seguridad y pruebas). En sandbox, profile-institutions devuelve una única entidad simulada. El campo expected_mode no cambia de entorno: solo comprueba que apunta al que cree, y devuelve 409 payment_mode_mismatch si no coincide.
La disponibilidad de una entidad bancaria para agregación no implica idéntica disponibilidad para iniciación de pagos. En producción, el catálogo de entidades de Wealth Reader ofrece cobertura en España y en toda Europa.
Arquitectura en dos pasos
La integración de pagos sigue una estricta separación de responsabilidades en dos pasos:
sequenceDiagram autonumber actor Usuario as Usuario participant Front as Frontend (Comercio) participant Back as Backend (Comercio) participant API as API Wealth Reader participant Widget as Widget Payments participant Banco as Entidad Bancaria (SCA) Note over Back,API: Paso previo (solo perfiles administrados) Back->>API: POST /payments/?action=profile-institutions API-->>Back: catálogo del perfil (institution_code) Note over Back,API: Paso 1: Creación de la intención inmutable (Server-to-Server) Back->>API: POST /payments/?action=create (con X-API-Key e Idempotency-Key) API-->>Back: 201 con payment.id + payment.widget.token efímero Note over Front,Widget: Paso 2: Carga y autorización en el widget (Navegador) Back->>Front: Entrega payment.id y payment.widget.token Front->>Widget: WealthReaderPayments.mount(...) o load-payments.js Widget->>Usuario: Presenta entidad, importe y concepto inmutables Usuario->>Widget: Autoriza el pago Widget->>Banco: Redirección / App to App (SCA) Banco->>API: Retorno del SCA al callback de Wealth Reader API-->>Widget: Confirmación técnica de autorización Note over Back,API: Conciliación y confirmación financiera loop Hasta estado terminal Back->>API: POST /payments/?action=status API-->>Back: payment_status: not_initiated | pending | settled | ... end
- Paso 1 (Backend seguro): Su servidor crea una intención de pago (
POST /payments/?action=create) con suX-API-Key, unIdempotency-KeyyContent-Type: application/json. En esta llamada se fijan de forma inmutable el importe (amount_minor, en céntimos), la divisa (currency, hoy soloEUR), el beneficiario (beneficiary.nameebeneficiary.iban), el concepto del extracto (reference), su referencia interna (customer_reference) y el origen web permitido (allowed_origin). Esos seis campos son obligatorios, y el cuerpo es una lista blanca estricta: cualquier campo no reconocido devuelve422 invalid_request. - Respuesta:
201con{"success": true, "payment": {…}}— o200si se trata de una repetición idempotente. El identificador de la intención viene enpayment.idy el token efímero del widget enpayment.widget.token. - Paso 2 (Frontend del comercio): El navegador monta el widget mediante el script oficial
load-payments.jso la funciónWealthReaderPayments.mount(), entregando únicamente elpayment.idy elpayment.widget.token. El usuario selecciona su banco (si no se preseleccionó en la intención) y completa la autenticación reforzada (SCA) en la interfaz bancaria. - Confirmación financiera: Su backend consulta el estado mediante
POST /payments/?action=status, cuyo cuerpo es exactamente{"payment_intent_id": "<id>"}. No hay webhook: se sondea hasta llegar a un estado terminal.
Dos modelos de cobro
Wealth Reader soporta dos modelos según las necesidades del negocio:
- Integración estándar para comercios (Propio beneficiario):
- El comercio define libremente el nombre e IBAN del beneficiario, el importe, la divisa (
EUR), el concepto y su referencia de pedido. - Puede filtrar qué bancos poner a disposición del usuario mediante
allowed_institution_codeso permitir todo el catálogo.
- El comercio define libremente el nombre e IBAN del beneficiario, el importe, la divisa (
- Perfiles administrados (como
cruz_roja_demo):- Diseñados para donaciones y demostraciones públicas.
- El servidor fija las cuentas oficiales de destino para garantizar que los fondos solo puedan dirigirse a la entidad benéfica (por ejemplo, Cruz Roja Española con importes acotados entre
0,01 EURy1,00 EUR).
Directorio unificado de entidades bancarias
Wealth Reader proporciona un catálogo unificado de entidades europeas preparadas para iniciación de pagos vía PSD2 a través de:
GET https://api.wealthreader.com/payments/entities/?country=ES
Permite obtener el listado de bancos con sus nombres normalizados, logotipos, métodos de transferencia admitidos y requisitos técnicos (como la necesidad de solicitar el IBAN deudor al pagador). Admite los filtros country, search (alias q), code, payment_method, limit y offset.
Este endpoint es público: no requiere X-API-Key. Enviarla no aporta nada y consume una llamada de la cuota de su credencial.
Use siempre estos códigos tal cual vienen en code. La creación de la intención valida el formato de allowed_institution_codes, pero no comprueba que existan en el catálogo: un código mal escrito no da error al crear y aparece más tarde como un selector de bancos vacío.
interaction_status: completed solo indica que terminó la interacción técnica en pantalla. El pago únicamente se considera firme cuando payment_status vale settled. Los valores posibles de payment_status son not_initiated, pending, settled, rejected, cancelled, expired, failed y unknown; los detalla Estados, sondeo y conciliación.
Separación de responsabilidades
- La credencial de pagos (
X-API-Key) se usa únicamente de servidor a servidor. Jamás debe incluirse en frontend ni en repositorios públicos. - El navegador recibe únicamente el identificador de la intención y un token efímero de corta duración ligado al origen HTTPS.
- El widget no puede alterar importe, moneda, beneficiario, concepto ni instituciones autorizadas.
- El cierre del modal o widget no sustituye a la consulta de estado financiera en backend.
- Los pagos no comparten credenciales, tokens ni callbacks con el producto de agregación bancaria de Wealth Reader.
Credenciales y cuota
Su credencial de pagos debe tener el producto PAYMENTS habilitado; si no, la API responde 403 payments_not_allowed. Una credencial ausente o con formato incorrecto devuelve 401 invalid_api_key.
Cada llamada autenticada consume una unidad del contador acumulado de su API key. Es un contador de por vida, sin ventana temporal y sin reposición automática: cuando se agota, todas las llamadas de pagos responden 429 api_limit_reached de forma permanente hasta que se amplíe el límite. No se resuelve esperando ni reintentando. Si prevé un volumen alto —o una demostración pública, donde cada carga de página consume una llamada—, acuerde el límite con Wealth Reader antes de publicar.
Siguiente paso
Continúe con Integración y widget.