Introducción
En esta lección implementaremos la integración de pagos que permite a los usuarios comprar libros utilizando Stripe como pasarela de pago. Aprenderemos a configurar Stripe, crear transacciones y manejar el flujo completo de pagos.
1. Configuración de Cuenta Stripe
Creación y Configuración Inicial
- Crear cuenta en Stripe: Visitar stripe.com y registrarse
- Acceder al dashboard después del login
- Nota importante: La interfaz puede cambiar con el tiempo
Modos de Operación
- Modo Test: Para desarrollo y pruebas (usaremos este)
- Modo Live: Para transacciones reales
- Requiere verificaciones adicionales
- Solo activar cuando esté listo para producción
2. Comprensión del Flujo de Pago
Análisis del Sistema
Antes de implementar, es importante entender:
- Usuario quiere comprar un Libro
- Modelos involucrados: User, Book, Transaction
- Proceso: Inicializar → Confirmar → Completar
Flujo Básico de Transacción
- Usuario selecciona libro para comprar
- Sistema crea intención de pago en Stripe
- Cliente recibe secreto para procesar pago
- Usuario completa pago en el frontend
- Sistema confirma transacción
3. Implementación del Controlador
Preparación del Proyecto
Primero, identificamos los archivos necesarios:
- Modelo Transaction: Define estructura de transacciones
- Modelo User: Información del comprador
- Modelo Book: Detalles del producto a comprar
Generación con IA
prompt// Prompt para el asistente IA
Implementa el controlador de transacciones basado en:
- Modelo Transaction
- Modelo User
- Modelo Book
- Usar NPM package de Stripe
- Crear endpoints para inicializar y confirmar pagos
4. Estructura del Controlador de Transacciones
Endpoints Principales
El controlador debe incluir:
- Inicializar Transacción (
POST /transactions/initiate
)- Crea payment intent en Stripe
- Guarda transacción en base de datos
- Retorna client_secret
- Confirmar Transacción (
POST /transactions/confirm
)- Verifica pago con Stripe
- Actualiza estado de transacción
- Procesa entrega del producto
- Obtener Transacciones del Usuario (
GET /transactions/user
)- Lista transacciones del usuario autenticado
- Obtener Transacción Específica (
GET /transactions/:id
)- Detalles de una transacción particular
5. Configuración de Variables de Entorno
Obtener Clave Secreta de Stripe
- Ir al dashboard de Stripe
- Hacer clic en «Developers»
- Seleccionar «API Keys»
- Copiar «Secret key» (empieza con
sk_test_...
)
Configurar .env
envSTRIPE_SECRET_KEY=sk_test_tu_clave_secreta_aqui
Importante: Reiniciar el servidor después de agregar variables de entorno.
6. Configuración de Rutas
Agregar Rutas al Servidor
Asegurar que las rutas estén registradas en server.js
:
javascript// server.js
app.use('/api/transactions', transactionRoutes);
Archivo de Documentación
Crear transaction-endpoints.md
con la documentación completa:
markdown## Endpoints de Transacciones
### Inicializar Transacción
- **URL**: `POST /api/transactions/initiate`
- **Body**: `{ "bookId": "id_del_libro" }`
- **Headers**: `Authorization: Bearer token`
### Confirmar Transacción
- **URL**: `POST /api/transactions/confirm`
- **Body**: `{ "transactionId": "id_transaccion" }`
7. Pruebas con Postman
Configuración de Colección
- Crear nueva colección: «Transacciones»
- Agregar carpeta: «Payment Integration»
Prueba de Inicialización
- Crear petición: «Inicializar Transacción»
- Método: POST
- URL:
http://localhost:3000/api/transactions/initiate
- Headers:
Authorization: Bearer tu_token_jwt Content-Type: application/json
- Body: json
{ "bookId": "id_del_libro_a_comprar" }
8. Solución de Problemas Comunes
Error: «Cannot find auth modules»
Causa: Problema en las rutas de autenticación Solución: Verificar importaciones en transactionRoutes.js
Error: «Token is not valid»
Causa: Token JWT inválido o expirado Solución: Generar nuevo token con login
Error: «Payment method is required»
Causa: Configuración incorrecta del payment intent Solución: Revisar parámetros enviados a Stripe
Debugging con Logs
javascript// Agregar en el controlador para debug
console.log('Payment Intent:', paymentIntent);
console.log('Transaction data:', transactionData);
9. Respuesta Exitosa
Estructura de Respuesta
Una inicialización exitosa retorna:
json{
"success": true,
"clientSecret": "pi_xxx_secret_xxx",
"transactionId": "64f2a1b5c8d4e5f6a7b8c9d0",
"amount": 999,
"currency": "usd"
}
Uso del Client Secret
- Frontend utiliza
clientSecret
para procesar pago - Stripe Elements requiere este valor
- No almacenar en el frontend por seguridad
10. Estados de Transacción
Flujo de Estados
- pending: Transacción creada, esperando pago
- processing: Pago en proceso
- completed: Pago exitoso
- failed: Pago falló
- cancelled: Transacción cancelada
Manejo en Base de Datos
javascript// Ejemplo de actualización de estado
await Transaction.findByIdAndUpdate(transactionId, {
status: 'completed',
paidAt: new Date(),
stripePaymentIntentId: paymentIntent.id
});
11. Seguridad y Mejores Prácticas
Validaciones Importantes
- Verificar autenticación del usuario
- Validar existencia del libro
- Verificar disponibilidad del producto
- Confirmar montos antes de procesar
Manejo de Errores
javascripttry {
const paymentIntent = await stripe.paymentIntents.create({
amount: book.price * 100, // Stripe usa centavos
currency: 'usd',
metadata: { bookId: book._id }
});
} catch (error) {
return res.status(500).json({
error: 'Error al procesar pago',
details: error.message
});
}
12. Próximos Pasos
Frontend Integration
Con el backend completado:
- Usar client_secret en React/Vue/Angular
- Implementar Stripe Elements para formulario de pago
- Manejar confirmación de pagos
- Mostrar estado de transacciones
Testing
- Usar tarjetas de prueba de Stripe
- Probar diferentes escenarios (éxito, fallo, etc.)
- Validar webhooks en producción
Conclusión
Hemos implementado exitosamente:
- ✅ Configuración completa de Stripe
- ✅ Controlador de transacciones funcional
- ✅ Endpoints para inicializar y confirmar pagos
- ✅ Manejo de errores y validaciones
- ✅ Sistema de estados de transacción
La integración de pagos está lista para conectarse con el frontend y procesar transacciones reales. El sistema es seguro, escalable y sigue las mejores prácticas de Stripe.