Saltar al contenido principal

Pagos

Crear pago

POST /api/v1/payments

{
"order_id": "uuid",
"gateway": "stripe",
"amount": 9800,
"currency": "PEN",
"payment_method_id": "pm_stripe_xxxx"
}

Pasarelas disponibles

GatewayProvider IDMonedasCampos requeridos
StripestripeUSD, PEN, EUR, +135payment_method_id (token de Stripe Elements)
CulqiculqiPEN, USDtoken_id (token de Culqi JS), email
MercadoPagomercadopagoPEN, ARS, BRL, +18token (token de MP.js), installments, payment_method_id
NiubizniubizPENsession_key, transaction_token (flujo 3 pasos)
IzipayizipayPENkr_answer (token de Izipay), transaction_id
PayMepaymePENcharge_id (token de PayMe Flex v2)
PayPalpaypalUSD, EUR, +20order_id (PayPal Order ID desde SDK)

Campos por gateway

Stripe

{
"order_id": "uuid",
"gateway": "stripe",
"amount": 9800,
"currency": "PEN",
"payment_method_id": "pm_1N5kQ2abc123"
}

Culqi

{
"order_id": "uuid",
"gateway": "culqi",
"amount": 9800,
"currency": "PEN",
"token_id": "tkn_live_abc123",
"email": "[email protected]"
}

MercadoPago

{
"order_id": "uuid",
"gateway": "mercadopago",
"amount": 9800,
"currency": "PEN",
"token": "abc123-token-mp",
"payment_method_id": "visa",
"installments": 3
}

Niubiz

{
"order_id": "uuid",
"gateway": "niubiz",
"amount": 9800,
"currency": "PEN",
"session_key": "session_abc123",
"transaction_token": "token_abc123"
}

Izipay

{
"order_id": "uuid",
"gateway": "izipay",
"amount": 9800,
"currency": "PEN",
"kr_answer": "kr_answer_token_abc123",
"transaction_id": "tx_123"
}

PayMe

{
"order_id": "uuid",
"gateway": "payme",
"amount": 9800,
"currency": "PEN",
"charge_id": "ch_abc123"
}

PayPal

{
"order_id": "uuid",
"gateway": "paypal",
"amount": 9800,
"currency": "USD",
"paypal_order_id": "PAYID-abc123"
}

Estados

EstadoDescripción
pendingIniciado, esperando confirmación del gateway
processingEn proceso en la pasarela
paidCapturado exitosamente
failedFallido
partially_refundedReembolso parcial aplicado
refundedReembolsado totalmente

Transiciones de estado

pending ──→ processing ──→ paid ──→ refunded
│ │ │
│ └──→ failed └──→ partially_refunded ──→ refunded
└──→ failed

Webhooks de pasarelas

OmniBuy recibe notificaciones automáticas de las pasarelas para confirmar pagos sin polling. Cada webhook verifica la firma antes de procesar.

PasarelaEndpointMétodo de verificación
StripePOST /webhooks/stripeFirma HMAC-SHA256 (Stripe signature)
CulqiPOST /webhooks/culqiFirma HMAC-SHA256
MercadoPagoPOST /webhooks/mpFirma HMAC (x-signature header)
NiubizPOST /webhooks/niubizRedirect callback (flujo 3 pasos)
IzipayPOST /webhooks/izipayFirma HMAC-SHA256
PayMePOST /webhooks/paymeFirma RSA-SHA512
PayPalN/A (IPN / Polling)Verificación IPN HMAC-SHA1 o polling vía GET /api/v1/payments/:id

Los endpoints de webhook no requieren autenticación de tenant. La seguridad se basa en la verificación de firma de cada pasarela.

Eventos que procesan los webhooks

  • Pago confirmado: transiciona el pago a paid y confirma la orden asociada
  • Pago fallido: transiciona el pago a failed

Endpoints

Obtener pago

GET /api/v1/payments/:id

Reembolsar pago

POST /api/v1/payments/:id/refund

{
"amount": 9800,
"reason": "requested_by_customer"
}
CampoTipoRequeridoDescripción
amountint64Monto a reembolsar en centavos. 0 = reembolso total
reasonstringNoduplicate, fraudulent, requested_by_customer, other

Reglas de negocio:

  • Solo se puede reembolsar un pago en estado paid o partially_refunded
  • El monto total de reembolsos no puede exceder el monto original del pago
  • Un reembolso parcial cambia el estado a partially_refunded
  • Un reembolso total (monto = restante) cambia el estado a refunded
  • El reembolso se procesa en la misma pasarela que el pago original

Respuestas:

  • 201: Reembolso creado exitosamente
  • 409: El pago no se puede reembolsar (estado inválido o monto excede el límite)

Estados del reembolso

EstadoDescripción
pendingReembolso creado, pendiente de procesamiento
processingEn proceso en la pasarela
refundedReembolso completado
failedReembolso fallido