Métodos de Pago
Cada suscripción tiene un método de pago por defecto más cualquier número de métodos adicionales registrados. Los cobros programados intentan primero con el por defecto y caen a los otros métodos en caso de falla.
Verificar una tarjeta
Antes de adjuntar una tarjeta o crear una suscripción, la tarjeta se verifica contra una transacción existente.
POST /v1/subscriptions/verify-card requiere transactionUid, processor y cardInfo. Tokeniza la tarjeta a través del procesador, la preautoriza contra la transacción y luego revierte esa autorización. Opcionalmente, con shouldCreateSubscription: true (y planUid), también crea la suscripción como parte del mismo flujo.
curl -X POST https://mw.migopayments.com/v1/subscriptions/verify-card \
-H "Authorization: Bearer <middleware-jwt>" \
-H "Content-Type: application/json" \
-d '{
"uid": "<transaction-uid>",
"processor": "<processor-slug>",
"cardInfo": { "...": "card data tokenized by the processor" },
"shouldCreateSubscription": false,
"planUid": "<plan-uid>"
}'
No existe un body { cardId, currency }, ni un auth-and-void fijo de $1, ni una forma de respuesta valid: true. El handler devuelve { success, message, data }.
Agregar un método de pago
POST /v1/subscriptions/payment-methods normalmente se invoca internamente después de verify-card. Su body anida los datos de la tarjeta bajo tokenizeData:
curl -X POST https://mw.migopayments.com/v1/subscriptions/payment-methods \
-H "Authorization: Bearer <middleware-jwt>" \
-H "Content-Type: application/json" \
-d '{
"tokenizeData": {
"userId": "<userId>",
"clientId": "<clientId>",
"processorId": "<processorId>",
"cardId": "<cardId>",
"alias": "Visa ending 4242"
}
}'
La respuesta es { success, message, data }. No existen entradas subUid ni isDefault, ni campos de respuesta cardLast4 / brand / addedAt.
Definir una tarjeta diferente como por defecto
curl -X PUT https://mw.migopayments.com/v1/subscriptions/payment-methods/set-default \
-H "Authorization: Bearer <middleware-jwt>" \
-H "Content-Type: application/json" \
-d '{
"userId": "<userId>",
"clientId": "<clientId>",
"subscriptionId": "sub_01HAAA",
"paymentMethodId": "pm_01HBBB"
}'
Los cuatro campos (userId, clientId, subscriptionId, paymentMethodId) son requeridos.
Eliminar un método de pago
DELETE /v1/subscriptions/payment-methods requiere ambos parámetros de query methodId y subId (devuelve 400 si falta cualquiera).
curl -X DELETE "https://mw.migopayments.com/v1/subscriptions/payment-methods?methodId=pm_01HBBB&subId=sub_01HAAA" \
-H "Authorization: Bearer <middleware-jwt>"
No puedes eliminar el método de pago por defecto de una suscripción activa. Define primero un nuevo por defecto y luego elimina el anterior.
Comportamiento de failover
Cuando un cobro programado falla en el método por defecto:
- Migo itera los demás métodos de pago registrados (en el orden que devuelve el almacén de métodos de pago) e intenta cada uno.
- Gana el primer éxito; la suscripción se mantiene en
active. - Si todos los métodos fallan y se agotan los reintentos, la suscripción pasa a
inactive.
El comportamiento de reintentos se gobierna por plan mediante dailyAttempts / intervalAttempt (más graceDays opcional) — ver Cobros programados → Calendario de reintentos.
Notificaciones de tarjeta por vencer
No existe una integración con Account Updater en este código. El manejo del vencimiento de tarjetas se limita a una notificación por email: el cron de suscripciones emite un evento notifyCardExpiration antes del vencimiento de una tarjeta (la ventana se configura por plan vía daysNotifyExpiringCard). No existe rotación silenciosa de PAN/vencimiento ni un evento subscription.payment_method.updated.