Curso de Patrones de Diseño y SOLID en Python

Procesador de pagos en Python con Stripe

Curso de Patrones de Diseño y SOLID en Python

Contenido del curso

Principios SOLID

Patrones de Diseño

Procesador de pagos en Python con Stripe

Resumen

Construir un procesador de pagos en Python con Stripe es uno de los ejercicios más prácticos para entender cómo aplicar principios SOLID y patrones de diseño en un caso real. Aquí parto de un código inicial deliberadamente imperfecto, que mezcla validaciones, cobros, notificaciones y logs en un solo lugar, para que tengas un punto de partida claro antes de refactorizar.

¿Qué hace el código inicial del procesador de pagos?

El punto de partida es una sola clase con un único método: process_transaction, que recibe customer_data y payment_data. Ese método concentra toda la lógica del cobro, lo cual viola varios principios SOLID y nos da el material perfecto para refactorizar después.

Dentro de ese método pasan cinco cosas en orden:

  • Validar que el cliente tenga nombre, información de contacto y una fuente de cobro.
  • Configurar la librería de Stripe leyendo STRIPE_API_KEY desde variables de entorno.
  • Crear el cargo con monto, moneda (dólares por defecto), método de pago y descripción.
  • Enviar una notificación por email o por teléfono según la información del cliente.
  • Registrar la transacción en un archivo transactions.log.

¿Qué es un procesador de pagos? Es un componente de software que recibe datos del cliente y del pago, se conecta con una pasarela como Stripe, ejecuta el cobro y notifica el resultado. En este curso lo construimos paso a paso en Python.

¿Cómo se ejecuta una transacción de prueba con Stripe?

La instanciación de la clase no requiere parámetros, así que basta con crear el objeto y llamar a process_transaction. Para el primer ejemplo definimos un cliente con email y un cobro de 100 centavos, es decir, un dólar, usando un token Visa como fuente.

Al correr el flujo en modo debug, las validaciones pasan sin entrar en ninguna condición de error. Stripe procesa el cargo, la consola imprime que el pago fue exitoso y se dispara la notificación por email con el mensaje de agradecimiento. Al final, el log registra que John Doe pagó 100 con status succeed, y en la consola de Stripe aparece la transacción con el mismo monto y nombre.

¿Por qué los montos en Stripe se envían en centavos?

Stripe representa todos los montos en la unidad mínima de la moneda. En dólares eso significa centavos: 100 equivale a un dólar y 500 equivale a cinco dólares. Esa convención evita errores de redondeo con decimales y es estándar en pasarelas de pago internacionales.

Stripe también permite enviar tokens en lugar del número de tarjeta. Así no manejas datos sensibles directamente, sino una referencia generada por Stripe que representa la tarjeta del cliente.

¿Cómo cambiar el flujo para notificar por teléfono en lugar de email?

Para probar la rama de SMS, modificamos el cliente: el nombre pasa a Platzi Python, el monto sube a 500 centavos y la fuente cambia a un token Mastercard. Stripe documenta varios tokens y números de tarjeta de prueba; en la sección de card numbers y tokens puedes copiar el que necesites.

Al ejecutar de nuevo, el flujo no entra en la rama de email porque el cliente solo tiene teléfono. En su lugar, se simula la interacción con una pasarela de SMS mediante un print que muestra el número destino y el contenido del mensaje. El log agrega que Platzi Python pagó 500 con status exitoso, y en Stripe la última transacción aparece como cinco dólares pagados con Mastercard.

¿Qué pasa si el cliente no tiene email ni teléfono? El método imprime un mensaje indicando que no hay información para notificar. El cobro se procesa igual, pero el cliente no recibe confirmación.

¿Cómo se cargan las credenciales de Stripe en Python?

Las líneas dos y cuatro del archivo son clave: importan load_dotenv desde el módulo dotenv y lo ejecutan. Esa función lee el archivo .env del paquete y expone sus variables al entorno de ejecución.

Dentro de ese archivo .env está definida STRIPE_API_KEY, que luego se asigna al atributo api_key de la librería de Stripe. Así evitas hardcodear credenciales en el código y mantienes separadas las llaves de desarrollo y de producción.

¿Qué problemas tiene este diseño inicial?

Aunque el código funciona, concentra demasiadas responsabilidades en un solo método:

  • Valida datos de entrada.
  • Configura la pasarela de pago.
  • Ejecuta el cobro.
  • Decide y envía notificaciones.
  • Persiste el log de transacciones.

Esa mezcla rompe el principio de responsabilidad única, dificulta las pruebas y acopla la lógica de negocio a Stripe, al sistema de notificaciones y al sistema de archivos. Ese es justamente el material que vamos a desarmar aplicando SOLID y patrones de diseño en las siguientes clases.

¿Por qué usar Stripe para aprender procesamiento de pagos?

Stripe se eligió por tres razones prácticas: documentación amplia, cuentas de desarrollador sin restricciones de país y un entorno de pruebas con tarjetas y tokens listos para usar. No hay límite geográfico para crear tu cuenta y obtener el API key.

El curso no se limita a Stripe. La pasarela funciona como vehículo para enseñar arquitectura, así que los principios que apliquemos podrás llevarlos a PayPal, Mercado Pago o cualquier otra integración. Si tienes dudas creando tu cuenta o leyendo la documentación, déjalas en los comentarios; la comunidad de Platzi suele responder rápido.