Recarga automática de subcuentas (proveedor de pagos personalizado)
Si prefiere gestionar los pagos de crédito de las subcuentas a través de su propio proveedor en lugar de Stripe (transferencias bancarias, pasarelas de pago locales, sistemas de facturación personalizados), la plataforma expone un par de webhook + API para que pueda ejecutar usted mismo todo el ciclo de cobro y concesión. La descripción general no técnica se encuentra en la página de Cuentas de agencia; esta página cubre la carga útil exacta del webhook y la llamada a la API que debe realizar para conceder créditos posteriormente.
El webhook es solo una de las formas en que se pagan las recargas automáticas. Si conectó Stripe o PayPal en modo SaaS, la plataforma cobra directamente a la tarjeta guardada o a la cuenta de PayPal del cliente y otorga los créditos, por lo que no hay nada que deba construir en esta página. Siga leyendo solo si desea gestionar el pago usted mismo.
El flujo de un vistazo
- El saldo de crédito de una subcuenta cae por debajo de su umbral de recarga automática.
- La plataforma llama a su URL de webhook con los detalles de la subcuenta y cuántos créditos necesita.
- Su servidor cobra al cliente a través del proveedor que utilice.
- Su servidor llama a la API de concesión de créditos para añadir créditos a esa subcuenta.
- Su servidor responde
200para confirmar la recepción del webhook.
1. Webhook: agency_sub_account_auto_recharge
Configure la URL del webhook haciendo clic en SaaS Mode en la barra lateral principal, seleccionando Use a Custom Payment Provider Instead (o, una vez configurado, abriendo la tarjeta Custom Payment Provider) y completando el campo Auto-Recharge Webhook.
Cuándo se activa
Cuando el saldo de crédito de una subcuenta cae por debajo de su umbral de recarga automática configurado.
Carga útil
{
"event": "agency_sub_account_auto_recharge",
"sub_account_id": "<sub-account-id>",
"sub_account_email": "customer@example.com",
"sub_account_name": "John Doe",
"agency_id": "<agency-id>",
"credits_requested": 500,
"current_balance": 42,
"threshold": 100,
"price_per_credit_cents": 10,
"price_per_credit_currency": "usd",
"total_amount_cents": 5000,
"timestamp": "2026-04-13T12:00:00.000Z",
"idempotency_key": "auto_recharge_abc123_1681387200000"
}
| Campo | Descripción |
|---|---|
event |
Siempre agency_sub_account_auto_recharge para este webhook. |
sub_account_id |
El ID único de la subcuenta que necesita créditos. |
sub_account_email |
La dirección de correo electrónico de la subcuenta. |
sub_account_name |
El nombre para mostrar de la subcuenta. |
agency_id |
El ID único de su cuenta de agencia. |
credits_requested |
Cuántos créditos conceder. Esta es la cantidad de recarga configurada, pero si el saldo ha caído más por debajo del umbral de lo que cubriría esa cantidad, se aumenta automáticamente a lo que sea necesario para que el saldo vuelva a estar por encima del umbral de una sola vez. Cobre siempre (y conceda) el valor credits_requested de la carga útil; no codifique de forma rígida su cantidad de recarga. |
current_balance |
El saldo de crédito de la subcuenta en el momento en que se envió el webhook. |
threshold |
El umbral de saldo que activó la recarga. |
price_per_credit_cents |
Su precio configurado por crédito, en centavos. |
price_per_credit_currency |
La moneda del precio (p. ej., usd). |
total_amount_cents |
El importe total a cobrar, en centavos (credits_requested × price_per_credit_cents). |
timestamp |
Cuándo se envió el webhook (formato ISO 8601). |
idempotency_key |
Una clave única para esta solicitud de recarga específica. Úsela para evitar conceder créditos dos veces si su servidor recibe el mismo webhook más de una vez. |
Notas importantes
- Tiempo de espera de 5 minutos — Después de un intento de recarga para una subcuenta, la plataforma no enviará otro webhook para esa subcuenta durante al menos 5 minutos, incluso si su saldo cae aún más. Esto evita cargos duplicados durante el procesamiento.
- Utilice la clave de idempotencia — Compruebe siempre
idempotency_keyantes de conceder créditos. Si su servidor falló después de conceder créditos pero antes de responder, la plataforma puede volver a enviar el webhook en la siguiente caída de crédito. - Los fallos son seguros y se autorreparan — Si su URL de webhook no es accesible o devuelve un error, no se conceden créditos. La plataforma sigue enviando el webhook (una vez por cada tiempo de espera de 5 minutos) mientras la subcuenta permanezca por debajo del umbral; no requiere que el saldo vuelva a subir por encima del umbral y caiga de nuevo primero. Un solo cargo perdido ya no puede dejar a una subcuenta permanentemente sin recargar.
- Establezca su cantidad de recarga en o por encima del umbral — Su cantidad de recarga configurada debe ser mayor o igual que el umbral de recarga automática, de modo que una recarga siempre restablezca el saldo por encima del umbral. (Si alguna vez necesita arreglar una subcuenta que se desvió mucho por debajo del umbral, la plataforma la recarga automáticamente por el déficit total; consulte
credits_requestedarriba).
2. API de concesión de créditos
Después de que su servidor haya procesado el pago, llame a este endpoint para añadir los créditos a la subcuenta.
Solicitud
POST https://api.dmchamp.com/v1/subaccounts/credits
X-API-Key: YOUR_API_KEY
Content-Type: application/json
{
"email": "customer@example.com",
"amount": 500,
"description": "Auto-recharge via webhook"
}
| Campo | Requerido | Descripción |
|---|---|---|
email |
Sí | La dirección de correo electrónico de la subcuenta (debe coincidir con una subcuenta existente bajo su agencia). |
amount |
Sí | El número de créditos a conceder. |
description |
No | Una nota que describe por qué se añadieron los créditos (se muestra en el historial de transacciones de crédito). |
Autenticación: Envíe su clave de API en un encabezado de solicitud, ya sea X-API-Key: YOUR_API_KEY o Authorization: Bearer YOUR_API_KEY. Los encabezados son la forma recomendada, ya que una clave en la URL termina en el historial del navegador, en los registros del proxy y en los registros de acceso del servidor. El parámetro de consulta ?apiKey=YOUR_API_KEY y un campo apiKey en el cuerpo JSON también siguen funcionando, por lo que las integraciones más antiguas seguirán ejecutándose sin cambios.
Respuesta
{
"success": true,
"sub_account_id": "abc123xyz",
"credits_added": 500,
"new_balance": 542
}
Consejo: Almacene el idempotency_key de la carga útil del webhook y verifíquelo antes de llamar a este endpoint. Esto evita otorgar créditos dos veces accidentalmente si su servidor recibe el mismo webhook más de una vez.
Qué sucede con los créditos concedidos en el reinicio mensual
Esto depende de cómo esté configurada la subcuenta:
- Reventa (la subcuenta le paga a usted por los créditos): los créditos que usted concede aquí se registran como créditos comprados y se acumulan cada mes. Todo lo que la subcuenta no haya gastado permanece en el saldo.
- Asignación (usted le da a la subcuenta una asignación mensual): el saldo se rellena hasta alcanzar la asignación mensual en la fecha de reinicio, por lo que cualquier cantidad no gastada no se acumula. Esto es intencional: la asignación se concede de nuevo cada mes.
Si desea que el saldo restante de una subcuenta se añada a su nueva asignación mensual en lugar de reemplazarla, active la acumulación de créditos:
PUT https://api.dmchamp.com/v1/subaccounts/{subAccountUid}/limits
X-API-Key: YOUR_API_KEY
Content-Type: application/json
{
"usageLimits": { "roll_over_to_next_month": true }
}
Si la subcuenta (o el plan en el que se encuentra) también tiene un límite de transferencia o una fecha de caducidad establecida, el restablecimiento es el momento en que estos se aplican: la asignación transferida se recorta a los meses que usted permita, y la asignación que no se haya utilizado durante más tiempo que el periodo de caducidad se elimina antes de que se añada la nueva asignación. Los créditos otorgados a través de este endpoint, las recargas automáticas y las propias recargas del cliente son créditos únicos y nunca se recortan. Consulte Limitar lo que se transfiere.
Ejemplo de extremo a extremo
Un controlador típico se ve así:
on POST /your-recharge-webhook:
payload = request.body
if seen(payload.idempotency_key):
return 200 // already processed, ack and exit
charge_result = your_payment_provider.charge(
email = payload.sub_account_email,
amount_cents = payload.total_amount_cents,
currency = payload.price_per_credit_currency,
)
if not charge_result.ok:
return 500 // platform will retry on next balance drop
api.post("/v1/subaccounts/credits", {
email = payload.sub_account_email,
amount = payload.credits_requested,
description = "Auto-recharge via " + your_provider_name,
})
mark_seen(payload.idempotency_key)
return 200