🎟️

EnUnMomento

Plataforma de Venta de Entradas

Miguel Heras & Zoel Merino

TFG · ASIR PHP · MySQL · Apache Proyecto web real

Estructura

Índice de la presentación

01 ¿Qué es EnUnMomento?
02 ¿Quién lo utiliza?
03 ¿Cómo funciona una compra?
04 Tecnologías implicadas
05 Base de datos
06 Servidor y alojamiento
07 Seguridad y Defensas
08 Arquitectura Backend
09 Operación y Scripts
10 Demostración
11 Glosario Técnico
12 Conclusiones

El proyecto

¿Qué es EnUnMomento?

🎯

Idea principal

EnUnMomento es una plataforma web para descubrir eventos, comprar entradas y gestionarlas de forma sencilla.

Está pensada para conciertos, teatro, deportes y otros eventos de ocio, con un funcionamiento parecido al de Ticketmaster o Eventbrite.

La idea del proyecto es cubrir todo el proceso completo: desde publicar un evento hasta validar la entrada en la puerta.

🎟️

Para el comprador

Puede buscar eventos, pagar con tarjeta y recibir su entrada en PDF con un QR único por email.

🎪

Para el organizador

Puede crear eventos, vender distintos tipos de entrada y validar los asistentes escaneando el QR con el móvil.

Usuarios

¿Quién puede usar la plataforma?

🛒

Comprador de entradas

Busca eventos, elige sus entradas, paga con tarjeta y recibe el ticket en el correo en PDF con su código QR.

🎪

Organizador

Puede crear eventos, editarlos, consultar asistentes y validar entradas escaneando códigos QR.

🛠️

Administrador

Tiene control global sobre la plataforma: usuarios, gestión general y estadísticas.

Cada perfil solo ve lo que le corresponde. Un comprador no puede acceder al panel de administración — el sistema lo controla automáticamente.

Tecnologías

¿Con qué está hecho?

Base técnica
🐘
PHP 8.2+
El lenguaje con el que está programada la web
🗄️
MySQL 8
Donde se guardan todos los datos y relaciones
🎨
HTML · CSS · JS
Frontend interactivo con Bootstrap 5 y Chart.js
🖥️
Apache + Ubuntu
El software que sirve la web en el sistema Linux
Servicios extra
💳
Stripe (Webhook)
Gestiona los pagos con tarjeta de forma segura
📄
FPDF + phpqrcode
Generación automática de entradas y códigos QR
📧
PHPMailer (SMTP)
Envío automático al comprador con adjuntos
Cloudflare Proxy
Protección SSL, DNS y mejora de rendimiento Edge

Hemos programado toda la estructura desde cero usando una arquitectura MVC propia en PHP. Nos ha obligado a entender de verdad cómo funciona el enrutamiento y cada pieza de una aplicación web real.

Funcionamiento

¿Qué pasa cuando compras una entrada?

1
El usuario entra en la web, elige un evento y tipo de entrada. Se crea un pedido en estado pendiente en la BD.
2
Se genera un PaymentIntent en Stripe. El usuario paga de forma segura en la pasarela.
3
Stripe nos avisa internamente mediante un Webhook de que el cobro ha sido exitoso.
4
El sistema descuenta el aforo, genera la entrada individual con un código QR único y renderiza el PDF.
5
PHPMailer envía automáticamente un correo electrónico al comprador con el PDF de la entrada adjunto.
6
El día del evento, el organizador escanea el QR. El sistema verifica si es válida y la marca como utilizada.

Datos

¿Qué guarda la base de datos?

Información principal
• Usuarios registrados
• Eventos publicados
• Tipos de entrada y precios
• Pedidos realizados
• Entradas individuales con su QR
Relación entre datos

Los datos están conectados entre sí. Por ejemplo, un pedido pertenece a un usuario y una entrada pertenece a un evento concreto.

Esto permite saber quién compró qué, para qué evento y si esa entrada ya se ha utilizado.

A nivel visual, la base de datos se organiza como se ve en este diagrama de tablas y relaciones:

Diagrama de la base de datos

🔍 Haz clic en la imagen para verla a tamaño completo

Infraestructura

¿Dónde está alojada la web?

🖥️

Servidor VPS Linux

La aplicación está desplegada en un servidor VPS dedicado (Ubuntu/Debian) que hemos configurado desde cero con Apache2.

Cloudflare por delante

Antes de llegar al servidor de origen, el tráfico pasa por el proxy de Cloudflare (Edge), actuando como filtro de seguridad y gestionando los DNS.

🌍 Dominio y correo electrónico: Spaceship

El dominio enunmomento.com está registrado en Spaceship. El correo de la plataforma también usa Spacemail, gestionando las salidas SMTP de forma segura.

Usuario Cloudflare Servidor VPS (Apache) Aplicación PHP

Seguridad

¿Cómo se protege el sistema?

🛑 Fail2ban en el servidor

Analiza los registros en tiempo real y bloquea automáticamente en el firewall las IPs que realizan intentos de acceso fallidos o ataques de fuerza bruta.

Cloudflare Anti-DDoS

Filtra peticiones maliciosas y absorbe ataques de denegación de servicio (DDoS), ocultando además la IP real de nuestro servidor origen.

🌐 Forzado HTTPS y HSTS

Todo el tráfico se redirige a HTTPS. Además, la cabecera HSTS fuerza a los navegadores a conectarse siempre y exclusivamente mediante un canal cifrado.

🔐 Cookies Strict y Hashes

Cookies de sesión endurecidas (HttpOnly, SameSite=Strict) para evitar robos. Contraseñas protegidas con algoritmos de hashing fuertes (Bcrypt).

🛡️ Prevención de inyecciones

Uso sistemático de Prepared Statements en la BD. Los archivos internos (PDFs, QRs) no son accesibles directamente desde el navegador web.

💳 Pagos desvinculados

Nuestra base de datos jamás toca ni procesa números de tarjeta. Todo el flujo financiero recae sobre la infraestructura certificada de Stripe.

Desarrollo

Arquitectura Backend Propia

Para maximizar el aprendizaje, el backend se ha construido desde cero implementando el Patrón MVC (Modelo-Vista-Controlador) en PHP sin utilizar frameworks de terceros, garantizando un control total del enrutamiento y la lógica de negocio.

⚙️

Controladores

app/controllers/
AuthController.php
EventosController.php
PedidosController.php
QrController.php
🧩

Modelos

app/models/
Evento.php
Entrada.php
Pedido.php
Usuario.php
🖥️

Vistas

app/views/
admin/
eventos/
pedidos/
partials/

Sistemas

Operación y Tolerancia a Fallos

🚨

Recuperación de compras (Disaster Recovery)

Se ha desarrollado un script diseñado para actuar si la comunicación en tiempo real con Stripe falla (caídas de red, timeout en el webhook).

php scripts/reprocess_pending_orders.php

Este proceso consulta directamente el estado real a Stripe. Si detecta un pedido pagado atascado en "pendiente", lo fuerza a generar las entradas y enviar los emails, evitando pérdidas al usuario.

⚙️

Despliegue automatizado

scripts/install.sh

Configura permisos, entorno Apache y MySQL en el servidor productivo de un plumazo.

📦

Copias de seguridad

scripts/backup.sh

Rutina bash para volcar la base de datos de manera segura y limpiar históricos antiguos.

Demostración

Parte visual del proyecto

🖼️
Pantalla de eventos
Filtra por ciudad o categoría, consulta el aforo y el precio de cada tipo de entrada.
enunmomento.com/eventos
💳
Proceso de compra
El pago lo gestiona Stripe. Al confirmar, el sistema genera el PDF con el QR y lo envía al correo del comprador de forma automática.
Pago seguro · PDF + QR por email
📱
Validación QR
El organizador accede desde su móvil al escáner, apunta al QR de la entrada y el sistema comprueba si es válida en tiempo real.
enunmomento.com/validar/scanner

La plataforma está en producción en www.enunmomento.com — con dominio propio, HTTPS, Cloudflare Proxy y pagos en vivo con Stripe.

Diccionario

Glosario rápido (para no informáticos)

Arquitectura MVC

Una forma de ordenar el código para no volverse loco. Separa la base de datos (Modelo), lo que ve el usuario (Vista) y el cerebro que decide (Controlador).

Webhook

Es como un SMS automático. Es el sistema que usa Stripe para avisar instantáneamente a nuestra web de que un pago se ha hecho con éxito.

Servidor VPS

Un "Servidor Privado Virtual". Básicamente, es un ordenador que alquilamos en la nube y que está encendido 24/7 solo para nuestra página.

Cloudflare Proxy

Es como el "portero de la discoteca". Se pone en medio de internet y nuestro servidor para filtrar ataques y evitar que la web se sature o caiga.

Prepared Statements

Seguridad imprescindible. Obliga a que la base de datos separe las instrucciones de los datos, evitando que un hacker cuela código malicioso.

Disaster Recovery

Tener un "Plan B". Un programa que revisa si ha habido algún fallo de internet en un pago para solucionarlo sin que el cliente pierda su entrada.

Fail2ban

Un "perro guardián" automático en el servidor. Si alguien mete mal la contraseña muchas veces seguidas intentando hackearnos, le bloquea la conexión.

Ataque DDoS

Ocurre cuando miles de ordenadores "zombie" intentan entrar a la vez para colapsar y tirar la web. Nuestro sistema Anti-DDoS frena esa avalancha.

HSTS

Una regla estricta que le dice a tu navegador: "A esta web solo se entra por la vía segura (HTTPS), ni se te ocurra intentar la versión sin cifrar".

Conclusiones

Qué hemos conseguido

Resultados

Se ha desarrollado una plataforma completa capaz de publicar eventos, vender entradas, enviar tickets y validarlos en el acceso.

🎓

Aprendizaje

El proyecto nos ha permitido trabajar desarrollo web, arquitectura de software, bases de datos y administración de sistemas en Linux.

Infraestructura
Montaje de servidor, DNS y operación web segura.
Patrón MVC
Creación de un enrutador propio y separación de lógica.
Seguridad y DevOps
Automatización de despliegues y protección Cloudflare.
🚀

Gracias por vuestra atención

EnUnMomento ha sido una forma de unir desarrollo web, administración de sistemas y seguridad en un proyecto funcional y con aplicación real.

TFG · ASIR Miguel Heras & Zoel Merino
Diagrama completo