Ir al contenido

Guía de Integración

Sigue esta guía para integrar webhooks de Aloha Pay en tu sistema.

Antes de comenzar, necesitas una API Key con los permisos correctos:

  • payment_links:create - Para crear links de pago
  • payment_links:read - Para consultar estado de pagos
  • webhooks:read - Para listar tus webhooks
  • webhooks:write - Para crear/editar webhooks

Contacta a tu account manager para obtener tu API Key.

Tu servidor necesita un endpoint HTTP que reciba los webhooks. Este endpoint debe:

  1. Aceptar requests POST
  2. Ser accesible públicamente (con HTTPS)
  3. Responder rápido (< 10 segundos)
  4. Verificar la firma del webhook
  5. Responder con código 200
routes/web.php
Route::post('/webhooks/alohapay', [WebhookController::class, 'handle']);
// app/Http/Controllers/WebhookController.php
class WebhookController extends Controller
{
private string $webhookSecret = 'whsec_tu_secret_aqui';
public function handle(Request $request)
{
// 1. Obtener datos del request
$payload = $request->getContent();
$signature = $request->header('X-Webhook-Signature');
$timestamp = $request->header('X-Webhook-Timestamp');
// 2. Verificar la firma
if (!$this->verifySignature($payload, $signature, $timestamp)) {
return response('Invalid signature', 401);
}
// 3. Parsear el evento
$event = json_decode($payload, true);
// 4. Procesar según el tipo de evento
switch ($event['event']) {
case 'payment.completed':
$this->handlePaymentCompleted($event['data']['object']);
break;
case 'payment.failed':
$this->handlePaymentFailed($event['data']['object']);
break;
case 'payment_link.cancelled':
$this->handlePaymentLinkCancelled($event['data']['object']);
break;
case 'payment_link.expired':
$this->handlePaymentLinkExpired($event['data']['object']);
break;
}
// 5. Responder con 200
return response('OK', 200);
}
private function verifySignature($payload, $signature, $timestamp): bool
{
// Evitar replay attacks (5 minutos máximo)
if (abs(time() - (int)$timestamp) > 300) {
return false;
}
$signedPayload = "{$timestamp}.{$payload}";
$expected = 'sha256=' . hash_hmac('sha256', $signedPayload, $this->webhookSecret);
return hash_equals($expected, $signature);
}
private function handlePaymentCompleted(array $payment)
{
// Buscar la orden usando el id del pago o la descripción
$order = Order::where('payment_id', $payment['id'])->first();
if (!$order) {
Log::warning('Orden no encontrada para pago', $payment);
return;
}
// Actualizar estado de la orden
$order->update([
'status' => 'paid',
'paid_at' => $payment['completed_at'],
'payment_amount' => $payment['amount'],
'payment_currency' => $payment['currency'],
]);
// Enviar confirmación al cliente usando customer_data
$customerEmail = $payment['customer_data']['email'] ?? null;
if ($customerEmail) {
Mail::to($customerEmail)->send(new OrderConfirmedMail($order));
}
Log::info('Pago procesado correctamente', ['order_id' => $order->id]);
}
private function handlePaymentFailed(array $payment)
{
$order = Order::where('payment_id', $payment['id'])->first();
if ($order) {
$order->update(['status' => 'payment_failed']);
// Notificar al cliente que el pago falló
}
}
private function handlePaymentLinkCancelled(array $paymentLink)
{
// El payment link fue cancelado manualmente
Log::info('Payment link cancelado', ['id' => $paymentLink['id']]);
}
private function handlePaymentLinkExpired(array $paymentLink)
{
// El payment link expiró sin ser pagado
$order = Order::where('payment_id', $paymentLink['id'])->first();
if ($order && $order->status === 'pending') {
$order->update([
'status' => 'expired',
'expired_at' => $paymentLink['completed_at'],
]);
}
}
}

Una vez que tu endpoint esté listo y desplegado, regístralo en Aloha Pay:

Ventana de terminal
curl -X POST https://api.alohapay.co/api/external/v1/webhooks \
-H "X-API-Key: tu_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://tu-servidor.com/webhooks/alohapay",
"description": "Webhook principal de producción",
"events": ["payment.completed", "payment.failed", "payment_link.expired"]
}'
{
"success": true,
"message": "Webhook endpoint created successfully",
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"url": "https://tu-servidor.com/webhooks/alohapay",
"description": "Webhook principal de producción",
"events": ["payment.completed", "payment.failed", "payment_link.expired"],
"secret": "whsec_a1b2c3d4e5f6g7h8i9j0...",
"is_active": true,
"created_at": "2025-12-04T10:00:00Z"
}
}
  1. Crea un Payment Link de prueba
  2. Completa el pago en el checkout
  3. Verifica que tu webhook recibió la notificación
  4. Confirma que tu sistema procesó el pago correctamente