Ingeniería Resiliente

Idempotencia de Webhooks y Reintentos Seguros

Asegura que tu plataforma comercial procese cada pago exactamente una vez, incluso cuando las demoras de red activen reintentos automáticos de webhooks.

Por Qué Importa la Idempotencia en los Pagos Web3

Dado que los tiempos de confirmación en blockchain varían y el enrutamiento de internet puede sufrir picos transitorios, el despachador automático de XPayr reintenta los webhooks no confirmados hasta 5 veces. Un receptor idempotente garantiza que tu tienda nunca entregue un pedido dos veces.

Especificaciones de Cabeceras Clave

  • X-XPayr-Delivery: UUID único asignado a cada evento webhook (p. ej., deliv_9f8a2c1e4d). Siempre idéntico en todos los intentos de reenvío del mismo evento de transacción.
  • X-XPayr-Signature: Hash HMAC SHA-256 que impide la manipulación y ataques de repetición.
  • X-XPayr-Event: Identificador del evento (payment.confirmed, payment.failed).

Patrón de Receptor Listo para Producción (PHP)

<?php
// Secure Webhook Listener with Idempotency Protection
$rawPayload = file_get_contents('php://input');
$deliveryId = $_SERVER['HTTP_X_XPAYR_DELIVERY'] ?? '';
$signature = $_SERVER['HTTP_X_XPAYR_SIGNATURE'] ?? '';

// 1. Verify HMAC Signature
$expectedSignature = 'sha256=' . hash_hmac('sha256', $rawPayload, $webhookSecret);
if (!hash_equals($expectedSignature, $signature)) {
    http_response_code(401);
    exit('Invalid signature');
}

$event = json_decode($rawPayload, true);
$orderId = $event['data']['order_id'] ?? null;

// 2. Check if this delivery or order was already processed (Atomic DB Lock)
$stmt = $pdo->prepare("INSERT INTO processed_webhooks (delivery_id, order_id, created_at) VALUES (?, ?, NOW())");
try {
    $stmt->execute([$deliveryId, $orderId]);
} catch (PDOException $e) {
    // Duplicate event detected (Unique constraint violation)
    // Return HTTP 200 OK immediately so XPayr stops retrying!
    http_response_code(200);
    echo json_encode(['status' => 'already_processed']);
    exit;
}

// 3. Fulfill Order (Guaranteed to execute exactly ONCE)
fulfillCustomerOrder($orderId, $event['data']);

http_response_code(200);
echo json_encode(['status' => 'success']);
SDKs Oficiales en NPM (v0.2.0) y Servidor MCP Remoto

Integra Más Rápido con los Paquetes Oficiales de XPayr y MCP sin Instalación

Instala @xpayr/node-sdk (v0.2.0), @xpayr/payment-evidence (v0.2.0), @xpayr/extension-kit (v0.2.0)o @xpayr/mcp-server (v1.0.0) desde NPM, o ejecuta llamadas a herramientas JSON-RPC 2.0 en vivo mediante POST https://xpayr.com/api/mcp.

Playground MCP en Vivo (/tools/mcp-playground) Verificador de Licencias ES256 Simulador de políticas para agentes IA Probador de Webhooks HMAC-SHA256 mcp.xpayr.com docs.xpayr.com api-docs.xpayr.com