Pagos multi-método
Ofrece varios métodos de pago en una sola sesión y deja que el cliente elija.
Los pagos multi-método te permiten ofrecer al cliente opciones alternativas cuando su método preferido falla. Por ejemplo, si rechazan la tarjeta de un cliente, puedes ofrecerle automáticamente una transferencia SPEI o un voucher OXXO como respaldo.
Cómo funciona el flujo de fallback
La lógica de fallback crea una lista priorizada de métodos de pago e intenta cada uno hasta que una transacción tenga éxito. Así, si el método preferido falla (fondos insuficientes, tarjeta rechazada o un problema técnico), tu sistema prueba automáticamente alternativas sin que el cliente tenga que elegir otra opción manualmente.
El flujo sigue estos pasos:
Empieza con el método preferido del cliente y llama a la API de Tonder.
Si es authorized o pending, completa la transacción.
Si el pago falla o es rechazado, comprueba si hay métodos alternativos disponibles.
Si existen más métodos, intenta automáticamente el siguiente en tu lista de prioridad.
Si todos los métodos se agotan, muestra un mensaje de error; de lo contrario, procesa el pago exitoso.
La experiencia del usuario primero. Informa siempre a los usuarios sobre los intentos de fallback. Pide permiso antes de cambiar a métodos alternativos en lugar de redirigir automáticamente a métodos que no eligieron.
Paso 1: define tu estrategia de fallback
Planea el orden de prioridad de tus métodos. Una secuencia típica:
- Tarjeta: el método más común e inmediato.
- SPEI: una alternativa confiable, en especial para montos grandes.
- OXXO: respaldo final para usuarios sin cuenta bancaria o tarjeta.
Tu lógica del lado del servidor controla este flujo. La API de Tonder procesa cada petición como una transacción independiente.
Paso 2: implementa el loop de fallback
Crea una función que intente cada método secuencialmente hasta que uno tenga éxito:
import uuid
def process_payment_with_fallback(customer_data, amount, preferred_method="CARD"):
"""Intenta procesar un pago con un método preferido, con fallbacks."""
payment_methods_priority = [
preferred_method,
"CARD", # Respaldo a tarjeta si no era el preferido
"SPEI", # Luego, transferencia bancaria
"oxxopay" # Respaldo final en efectivo
]
# Evita intentos duplicados (p. ej. si preferred_method ya es 'CARD')
unique_methods = list(dict.fromkeys(payment_methods_priority))
for method in unique_methods:
print(f"Intentando pago con el método: {method}")
try:
payment_data = {
"operation_type": "payment",
"amount": amount,
"currency": "MXN",
"customer": customer_data,
"payment_method": {"type": method},
"client_reference": f"order-{uuid.uuid4()}"
}
result = tonder_api.process_payment(payment_data)
# Una iniciación exitosa tiene estado 'authorized' o 'pending'.
if result.get("status") in ["authorized", "pending"]:
print(f"Pago iniciado con {method}. Transaction ID: {result['id']}")
return result
else:
print(f"El pago con {method} falló con estado: {result.get('status')}")
except Exception as e:
print(f"La llamada para el método {method} falló: {e}")
continue
raise Exception("Todos los métodos de pago fallaron para esta transacción.")