Noticias

Probar RedSys en local: WordPress con Docker y un túnel de Cloudflare

Si alguna vez has tenido que integrar un TPV virtual de RedSys en una tienda WordPress, conocerás el problema: el pago en sí lo puedes probar desde tu equipo sin más, pero la notificación que el banco envía a tu web para confirmar el cobro no llega nunca. RedSys no puede llamar a localhost, y sin esa notificación el pedido se queda pendiente para siempre.

La solución habitual es subir los cambios a un servidor de pruebas cada vez que tocas algo, que es lento y engorroso. En Linux lo podemos resolver en un par de minutos con Docker y un túnel de Cloudflare, sin abrir puertos en el router y sin contratar nada.

Qué necesitamos

  • Docker con el plugin docker compose (en Debian y Ubuntu, paquetes docker.io y docker-compose-v2, o los oficiales de Docker).
  • cloudflared, el cliente de túneles de Cloudflare. Para un túnel rápido no hace falta cuenta.
  • Los datos del entorno de pruebas de RedSys: número de comercio, terminal y clave de firma de test. Te los da tu banco al contratar el TPV.

WordPress en local con Docker

Creamos una carpeta para el proyecto y dentro un compose.yaml con WordPress y MariaDB:

services:
  db:
    image: mariadb:11
    environment:
      MARIADB_DATABASE: wordpress
      MARIADB_USER: wordpress
      MARIADB_PASSWORD: wordpress
      MARIADB_RANDOM_ROOT_PASSWORD: "1"
    volumes:
      - db:/var/lib/mysql

  wordpress:
    image: wordpress:latest
    depends_on:
      - db
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DEBUG: "1"
      WORDPRESS_CONFIG_EXTRA: |
        if (isset($$_SERVER['HTTP_X_FORWARDED_PROTO']) && $$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
          $$_SERVER['HTTPS'] = 'on';
        }
        if (isset($$_SERVER['HTTP_HOST'])) {
          define('WP_HOME', 'https://' . $$_SERVER['HTTP_HOST']);
          define('WP_SITEURL', 'https://' . $$_SERVER['HTTP_HOST']);
        }
        define('WP_DEBUG_LOG', true);
        define('WP_DEBUG_DISPLAY', false);
    volumes:
      - wp:/var/www/html

volumes:
  db:
  wp:

Dos detalles importantes:

  • Los $$ son a propósito: Docker Compose interpreta $ como una variable, y con el doble dólar le decimos que lo pase tal cual a PHP.
  • El bloque WORDPRESS_CONFIG_EXTRA hace que WordPress use como dirección la del túnel, sea cual sea, y que sepa que la conexión es HTTPS aunque al contenedor le llegue por HTTP. El túnel rápido cambia de dirección cada vez que lo arrancas, así que así no hay que tocar nada en la base de datos. Es una configuración pensada solo para pruebas: no la uses en producción.

Lo levantamos:

docker compose up -d

El túnel

En otra terminal:

cloudflared tunnel --url http://localhost:8080

Al cabo de unos segundos aparece una dirección del tipo https://palabras-al-azar.trycloudflare.com. Esa es la URL pública de tu WordPress, con un certificado válido. Ábrela en el navegador y haz la instalación normal. A partir de aquí entra siempre por esa dirección, no por localhost:8080.

Si no quieres instalar cloudflared en el sistema, también puedes lanzarlo como contenedor:

docker run --rm --network host cloudflare/cloudflared:latest tunnel --url http://localhost:8080

Configurar el TPV en modo de pruebas

Instala WooCommerce, crea un producto de prueba y añade la pasarela de RedSys que vayas a usar. En nuestro caso lo probamos con el plugin de RedSys y Bizum para WooCommerce que desarrollamos en Codection, pero el procedimiento es el mismo con cualquier otra pasarela que use la redirección al TPV de RedSys.

En los ajustes de la pasarela pones el número de comercio, el terminal y la clave de test, y activas el modo de pruebas. La pasarela genera la URL de notificación a partir de la dirección del sitio, así que ya apuntará al túnel y RedSys podrá llegar a ella.

Ver qué está pasando

Haz un pedido y paga con una de las tarjetas de prueba que publica RedSys en su documentación. Mientras tanto, en otra terminal:

docker compose logs -f wordpress

Cuando termines el pago verás entrar una petición POST desde los servidores de RedSys: esa es la notificación. Si responde con un 200, el pedido debería pasar a “Procesando”. Si algo falla en PHP, lo tendrás en el log de depuración:

docker compose exec wordpress tail -f /var/www/html/wp-content/debug.log

Y si es RedSys quien rechaza la operación, te devolverá un código del estilo SIS0042 o un número de cuatro cifras en Ds_Response. Tenemos recopilados los errores del TPV de RedSys y lo que significa cada código, que suele ahorrar bastante tiempo cuando el mensaje del banco no dice gran cosa.

Al terminar

Cierra cloudflared con Ctrl+C y la dirección deja de existir. Para parar WordPress:

docker compose down

Los volúmenes se conservan, así que la próxima vez solo tienes que volver a levantarlo y abrir un túnel nuevo. Si quieres empezar de cero, docker compose down -v lo borra todo.

Este mismo truco sirve para cualquier servicio que necesite llamar a tu web desde fuera mientras desarrollas: webhooks de Stripe, de GitHub, de Telegram… Docker y un túnel, y te olvidas de subir cosas a un servidor solo para probarlas.

F. Javier Carazo Gil

Cofundador de CODECTION, empresa especializada en WordPress, autor de un libro sobre WordPress (el primero en español) y multitud de artículos (en medios físicos y virtuales) sobre el tema. Participa en la comunidad WordPress de forma activa siendo parte del equipo organizador de la WordPress Meetup de Córdoba, dando charlas en diferentes WordCamp y siendo autor y coautor de multitud de plugins libres y premium para WordPress de gran éxito.

Compartir
Publicado por
F. Javier Carazo Gil

Entradas recientes

Nueva versión de OnlyOffice Docs

Desde el equipo de ONLYOFFICE se han puesto en contacto con nosotros para contarnos que…

3 semanas hace

EOF

2 meses hace

CERN

2 meses hace

Agua

2 meses hace

Aire acondicionado

3 meses hace

Eclipse

3 meses hace