Agrega API de pagos externos: tokens por servicio, atados a pasarela e IP
Permite emitir credenciales (token hasheado + IP/CIDR opcional) desde
/app/pagos-externos para que aplicaciones de terceros pidan cobros a
través de Bold/dLocal/PayPal sin acceso a nada más del sistema:
- POST /api/v1/pagos-externos/solicitar genera el link de cobro real
usando solo las pasarelas habilitadas para ese servicio.
- Los webhooks existentes de Bold/dLocal/PayPal (firma obligatoria,
idempotentes) ahora también resuelven referencias "extpay-…" sin
tocar el flujo de contratos ("contrato-{id}").
- Al confirmarse el pago se notifica por webhook firmado (HMAC) y/o
Telegram, configurable por servicio.
- CRUD de servicios protegido con SoloAdmin; token y callback_secret
solo se muestran una vez, en DB se guardan hasheados.
This commit is contained in:
@@ -74,17 +74,21 @@ func PaypalWebhook(c *fiber.Ctx) error {
|
||||
return c.Status(fiber.StatusOK).JSON(fiber.Map{"ok": true})
|
||||
}
|
||||
|
||||
marcarContratoPagadoPorReferencia(evento.Referencia, "paypal")
|
||||
marcarContratoPagadoPorReferencia(evento.Referencia, evento.ResourceID, "paypal")
|
||||
return c.Status(fiber.StatusOK).JSON(fiber.Map{"ok": true})
|
||||
}
|
||||
|
||||
// marcarContratoPagadoPorReferencia confirma el pago del contrato codificado en
|
||||
// una referencia con formato "contrato-{id}".
|
||||
func marcarContratoPagadoPorReferencia(referencia, pasarela string) {
|
||||
// una referencia con formato "contrato-{id}", o de una solicitud de pago
|
||||
// externo con formato "extpay-…".
|
||||
func marcarContratoPagadoPorReferencia(referencia, transaccionID, pasarela string) {
|
||||
if referencia == "" {
|
||||
log.Printf("[%s] Pago confirmado pero sin referencia de contrato: requiere conciliación manual", pasarela)
|
||||
return
|
||||
}
|
||||
if services.ConfirmarPagoExternoPorReferencia(referencia, transaccionID, pasarela) {
|
||||
return
|
||||
}
|
||||
var contratoID uint
|
||||
if _, err := fmt.Sscanf(referencia, "contrato-%d", &contratoID); err != nil || contratoID == 0 {
|
||||
log.Printf("[%s] Referencia '%s' no corresponde a un contrato", pasarela, referencia)
|
||||
|
||||
Reference in New Issue
Block a user