Saltar al contenido
Integración

Redsys y Bizum: cobrar con la pasarela de tu banco

Redsys es el TPV Virtual que te da tu banco español y Bizum va por el mismo sitio. Cobrar así te ahorra depender de una plataforma internacional, pero la integración tiene reglas propias: la firma se calcula en el servidor, el importe se valida contra el total congelado del pedido y la única confirmación válida es la notificación del banco. Aquí cuento cómo lo monto y qué falla cuando no se monta así.

En corto

  • Redsys es el TPV Virtual que da tu banco español. Las credenciales salen del banco (FUC, terminal y clave de firma) y el panel del banco es la única fuente de verdad sobre los cobros.
  • Bizum es el mismo formulario firmado cambiando el método de pago, pero se contrata y se activa aparte. Los métodos visibles se declaran a mano, nunca se deducen de la pasarela.
  • La firma se calcula en servidor y el importe notificado se compara contra el total congelado del pedido dentro de la misma transacción que confirma el stock.
  • La vuelta del navegador no confirma nada: la única confirmación válida es la notificación servidor a servidor del banco.
  • Redsys no reintenta esa notificación. Un fallo al procesarla es un cobro que se queda sin confirmar para siempre, así que hay aviso en caliente al dueño y una revisión diaria.

Antes de seguir

Esta página describe decisiones técnicas de integración, no condiciones comerciales. Las tarifas, el alta de Bizum, la disponibilidad de credenciales REST para devoluciones y las condiciones del TPV Virtual las fija tu banco adquirente en tu contrato. Confirma con tu entidad antes de dar nada por hecho.

Qué es Redsys en realidad y qué implica cobrar por ahí

Redsys no es un proveedor que contratas por internet en diez minutos. Es la plataforma que usan la mayoría de bancos españoles para su TPV Virtual, y lo que tú contratas es el TPV con tu banco. De ahí salen tres datos: el código de comercio (FUC), el terminal y una clave secreta de firma. Con eso se firman las peticiones. La consecuencia práctica es que el banco es tu interlocutor para todo lo que no sea código: tarifas, alta de Bizum, credenciales adicionales, incidencias con un cobro concreto. Y que el panel del TPV Virtual es la única fuente de verdad sobre qué se ha cobrado, cosa que condiciona bastante el diseño de la integración.

  • Las credenciales las da el banco, no se autogeneran desde un panel de desarrollador.
  • La integración habitual es por redirección: el cliente sale a la página del banco y vuelve.
  • Muchas operaciones (devoluciones, consultas de cargos) viven en el TPV Virtual, no en una API.

Bizum es el mismo TPV cambiando una letra, pero se contrata aparte

Técnicamente Bizum no es otra integración: es el mismo formulario firmado indicando otro método de pago. Eso lleva a un error muy caro de soporte: dar por hecho que si la tienda tiene Redsys, tiene Bizum. Falso. Bizum se contrata con el banco y se activa sobre tu terminal. Si el botón se deduce del proveedor, el cliente lo pulsa, el TPV le rechaza la operación y le enseña un error del banco que tú no puedes explicar. Por eso los métodos que se muestran en la tienda son una lista declarada explícitamente en la configuración. Si está vacía, no se enseña ningún sello. Preferimos un checkout que enseñe de menos a uno que prometa lo que el banco no tiene activo.

  • Que el TPV sea Redsys no garantiza que el banco tenga Bizum activo sobre ese terminal.
  • La elección del cliente entre tarjeta y Bizum viaja explícita en el contrato de checkout: si una capa intermedia no la reenvía, todo se cobra por tarjeta sin dar ningún error.
  • El selector de Bizum solo aparece cuando la pasarela real de la tienda es Redsys.

Por qué Bizum convierte carritos que se abandonarían

El abandono en el momento del pago tiene causas conocidas y una es puramente física: teclear dieciséis dígitos, caducidad y CVV en un móvil, y a veces además esperar la autenticación del banco. Bizum sustituye eso por el teléfono y la confirmación en la app bancaria. También quita fricción psicológica: hay compradores que no dejan la tarjeta en una tienda pequeña que no conocen y en cambio sí pagan por un canal que asocian a su banco. No voy a darte un porcentaje de mejora porque cualquier cifra que te dé sin medir tu tienda sería inventada. Lo que sí digo es dónde está la palanca: menos campos, menos salida de la app, menos motivos para dejarlo.

Cómo se firma la petición y por qué el importe se recalcula en el servidor

La petición se envía como un formulario con los parámetros del pago codificados y una firma calculada con la clave secreta del banco. Esa firma se calcula siempre en el servidor: si la clave tocara el navegador, cualquiera podría firmar el importe que quisiera. El importe que se firma no sale del carrito del cliente, sale del total congelado al crear el pedido en servidor. Y cuando llega la confirmación, el importe notificado se compara otra vez contra ese total antes de marcar nada como pagado. Firmado por el banco no significa correcto para tu pedido: puede ser un formulario viejo reabierto o una notificación válida de otro importe.

  • El paso a pagado corre entero dentro de una transacción: leer el pedido, salir si ya estaba pagado, rechazar estados que no toquen, comparar importe y solo entonces mover el stock de reservado a vendido.
  • El uso del cupón se contabiliza en ese momento y no al crear el pedido: si no, los checkouts abandonados agotan un cupón con usos limitados.
  • Confirmar stock fuera de esa transacción es la vía directa a descontar dos veces la misma unidad.

La notificación del banco es la única confirmación válida

Cuando el cliente vuelve a tu página de éxito, el pedido casi nunca está confirmado todavía. El retorno del navegador y la notificación servidor a servidor son canales distintos, y el segundo puede tardar segundos. Si pintas pedido confirmado con el retorno, mientes. Si pintas estamos confirmando tu pago y la notificación se retrasa, dejas al cliente clavado en un spinner sin saber si le han cobrado. La solución es honesta y sencilla: la página del pedido se refresca sola mientras está pendiente, durante el primer minuto y medio pide no cerrar la ventana, y a partir de ahí libera al cliente diciéndole que puede irse y recibirá el email cuando se procese. La cancelación lleva su propio parámetro en la URL para mostrar el mensaje real: no se te ha cobrado nada, tu carrito sigue aquí.

Redsys no reintenta la notificación: el fallo más caro es el que no deja rastro

Aquí está la diferencia grande con las pasarelas internacionales. Si devuelves un error a un webhook de Stripe, el proveedor reintenta durante horas. Redsys manda la notificación a la URL que va firmada en la petición y, si tu handler revienta por un tiempo de espera de base de datos o un despliegue a medias, esa confirmación no vuelve nunca. El cliente tiene el cargo en la tarjeta y tú tienes un pedido pendiente que el cron acabará caducando. Nadie se entera hasta que el cliente reclama. Por eso hay dos redes, y ninguna sobra.

  • Aviso en caliente: si falla el procesado de una notificación firmada de verdad por el banco, sale un email inmediato al dueño para que compruebe en el TPV Virtual si el cobro existe.
  • Nunca se alerta por firma inválida. El endpoint es público y sin autenticar, tiene que serlo porque lo llama el banco, así que cualquiera puede lanzarle basura. Alertar por eso entrena al dueño para ignorar justo el email que importa. Firma mala: aviso en el log y respuesta de error, sin correo.
  • Revisión diaria: como no hay forma de listar los cargos de Redsys por API, se busca por la huella propia. Al generar el formulario se sella la marca de inicio de pago; el trabajo nocturno saca los pedidos caducados que la tienen, con su importe, para buscarlos en el panel del banco.

Trampas del minado que dejan la tienda cobrando en el aire

Casi todas se manifiestan como algo que parece funcionar. Esa es la parte peligrosa. La notificación puede llegarte como formulario codificado o ya convertida en objeto según quién la haya parseado antes por el camino, así que se normaliza sobre el cuerpo original antes de verificar la firma; asumir un formato es un fallo que en local no reproduces. La URL de notificación viaja dentro de la petición firmada, no en un panel, así que si falta la variable de entorno el cliente paga, el banco cobra y la confirmación se manda a ninguna parte: por eso hay un candado que impide arrancar el pago si no está configurada. Mejor perder una venta que cobrarla sin poder confirmarla.

  • El número de operación tiene doce caracteres con los cuatro primeros numéricos, así que no cabe un id de base de datos. La correlación va en el campo libre de datos del comercio y el número se genera determinista repartiendo toda la entropía del id, para que un doble envío del formulario no abra dos operaciones.
  • El pago denegado se registra pero no marca el pedido como fallido: eso liberaría el stock y rompería el reintento del cliente que se equivocó de CVV.
  • Un pago que entra sobre un pedido ya cancelado o reembolsado no se revive: se avisa al dueño con el importe y la referencia por si procede devolverlo.
  • El campo de la clave secreta es de tipo contraseña y el navegador lo autorrellena sin avisar, pisando la clave real del banco. Se resuelve no renderizando un campo editable si ya hay clave, leyendo los secretos del estado y validando el formato antes de guardar.
  • El terminal con un uno de ejemplo en gris se guarda vacío y el TPV queda sin conectar. Va como valor real por defecto, no como texto de ayuda.
  • El entorno no puede ser un campo libre que alguien olvide en pruebas: con Redsys siempre es el TPV real, y así queda forzado al guardar.
  • El nombre de comercio y el concepto se sanean a un juego de caracteres limitado y a su longitud máxima, porque un acento o una almohadilla hacen que la pasarela devuelva un error de formato en vez de la página de pago.

Los efectos posteriores al cobro se marcan uno a uno

Email de confirmación, alta en el ERP, puntos de fidelidad. Si los cuelgas del primer procesado de la notificación y el pago se marcó pero el email falló, el cliente paga y no recibe nada. Si los ejecutas en cada notificación, mandas el email tres veces. Cada efecto lleva su propia marca en el pedido: el email se sella solo cuando el envío devuelve correcto, los puntos son idempotentes por su propio registro y los envíos al ERP fallidos los reintenta el trabajo nocturno. Ninguno de estos efectos puede tumbar la respuesta a la notificación: el dinero ya está cobrado y devolver un error por un email caído solo empeora las cosas. La revisión diaria busca además pedidos pagados sin email confirmado como anomalía.

Preguntas frecuentes

¿Tener Redsys significa que ya tengo Bizum?+

No. Técnicamente Bizum es el mismo formulario firmado cambiando el método de pago, pero el servicio se contrata aparte con el banco y hay que activarlo sobre tu FUC y tu terminal. Por eso los métodos que se muestran en la tienda son una lista declarada a mano, no algo deducido de que la pasarela sea Redsys. Si lo dedujera, el cliente pulsaría Bizum y el TPV le rechazaría la operación con un error del banco que ni tú ni yo controlamos.

¿Puedo dar el pedido por bueno cuando el cliente vuelve a la página de éxito?+

No. El retorno del navegador y la notificación servidor a servidor son dos canales independientes, y el retorno suele llegar antes. Si confirmas con él, mientes al cliente y te arriesgas a marcar como pagado algo que no lo está. La página de retorno se autorrefresca mientras el pedido sigue pendiente y, pasado un minuto y medio, cambia el mensaje para liberar al cliente: puede cerrar la ventana, el email de confirmación sale cuando el pago se procese.

¿Qué pasa si el cliente paga justo cuando mi pedido ya ha caducado?+

Ocurre porque el formulario firmado de Redsys no lleva caducidad de sesión y el cron que libera el stock sí. Cuando llega esa notificación, el pago no se rechaza: el dinero ya está cobrado y rechazarlo es lo peor que puedes hacer. El pedido se revive a pagado vendiendo el stock directamente, se marca como revivido y la revisión diaria lo saca a la luz para que compruebes si has vendido más unidades de las que tenías.

¿Cómo se detecta un cobro del que nunca llegó la confirmación?+

Con Redsys por redirección no hay una API que te liste los cargos, así que el cruce ideal, cobros de la pasarela contra pedidos pagados, no se puede hacer: la verdad solo está en el panel del banco. Se aproxima con la huella propia. Al generar el formulario se sella la marca de inicio de pago en el pedido, y una revisión diaria saca los pedidos caducados que habían empezado a pagar, con su importe, para que los busques en el TPV Virtual.

¿Por qué mi TPV dice que está bien configurado y aun así no cobro?+

Los tres motivos que más silencio producen: el terminal guardado en blanco porque el uno estaba solo de ejemplo en el campo, la clave de firma pisada por el autorrelleno del navegador en un campo de contraseña, y el entorno del banco quedado en pruebas. Los tres dan pantallas que parecen funcionar. Por eso el entorno no es un campo libre, los secretos se leen del estado del formulario y no del envío, y hay validación de formato antes de guardar.

¿Se pueden hacer devoluciones desde la tienda?+

Con la integración por redirección, no: la devolución se lanza desde el TPV Virtual del banco o con credenciales REST que hay que pedir aparte. Lo que sí se puede es modelar la realidad. El pedido pasa a reembolsado pero sin referencia de devolución, el comprador ve reembolso en trámite, tú ves pendiente de TPV, y hay un botón para confirmarlo cuando el dinero haya salido de verdad. La revisión diaria avisa de los que se quedaron a medias.

¿Quieres cobrar con el TPV de tu banco?

Si vendes online y quieres cobrar por el TPV de tu banco con Bizum activo, cuéntanos qué tienes montado ahora y con qué banco trabajas. Te decimos qué hace falta por tu parte (FUC, terminal, clave de firma, alta de Bizum) y qué corresponde al desarrollo. Si ya tienes Redsys puesto y sospechas que se pierden confirmaciones, también revisamos cómo se está atendiendo la notificación.

Escríbenos y lo vemos