<?php
$page_lang = 'es';
$page_title = 'Webhooks: eventos firmados para clientes enterprise | Corp-Merch.MX';
$page_description = 'Webhooks firmados con HMAC SHA-256: eventos de orden, entrega, factura, calidad y catálogo, con validación de firma, reintentos e idempotencia.';
$og_image = '/assets/images/og-sdk.png';
$page_section = 'sdk';
$page_slug    = 'webhooks';

$labels = [
    'name' => 'Nombre', 'name_placeholder' => 'Tu nombre',
    'contact' => 'Correo', 'contact_placeholder' => 'tu.correo@empresa.com.mx',
    'company' => 'Empresa', 'company_placeholder' => 'Razón social',
    'message' => 'Brief', 'message_placeholder' => 'Stack de operaciones, eventos requeridos, endpoint…',
    'submit' => 'Configurar webhooks', 'sending' => 'Enviando...',
    'turnstile_error' => 'Verifica que no eres un robot'
];

require __DIR__ . '/../../../includes/header.php';
?>
<link rel="alternate" hreflang="es" href="https://corp-merch.com.mx/es/pages/sdk/webhooks">
<link rel="alternate" hreflang="en" href="https://corp-merch.com.mx/en/pages/sdk/webhooks">
<link rel="alternate" hreflang="ru" href="https://corp-merch.com.mx/ru/pages/sdk/webhooks">
<nav class="breadcrumbs"><a href="/es/">Inicio</a><span class="sep">&rsaquo;</span><a href="/es/pages/sdk/">SDK</a><span class="sep">&rsaquo;</span><span>Webhooks</span></nav>

<section class="hero">
  <div class="container">
    <div class="hero-content">
      <p class="eyebrow">HMAC SHA-256 · Reintento · Idempotencia · Sandbox</p>
      <h1>Webhooks firmados para clientes enterprise</h1>
      <p class="hero-subtitle">La forma en que su sistema recibe notificaciones del taller cuando algo cambia en una orden, en una entrega, en una factura, en una alerta de calidad o en una pieza de catálogo. Los webhooks se firman, se entregan con identificador único y se reintentan con backoff exponencial. La configuración se hace desde el portal del cliente con un endpoint HTTPS válido.</p>
      <div class="hero-cta"><a href="#contact-form" class="btn btn-primary">Configurar webhooks</a></div>
    </div>
  </div>
</section>

<section class="section"><div class="container">
  <h2>Cómo se firma un webhook</h2>
  <p>Cada webhook se firma con HMAC SHA-256. La firma se calcula sobre el cuerpo crudo de la petición — sin procesar — concatenado con el timestamp y con un identificador de evento único. La firma se entrega en el encabezado <code>X-Corp-MX-Signature</code> en formato hexadecimal. El cliente debe recalcular la firma con el secreto compartido y compararla con la firma recibida. Si las firmas no coinciden, el webhook se descarta.</p>
  <p>Los encabezados que llegan con cada webhook son <code>X-Corp-MX-Signature</code> con la firma HMAC, <code>X-Corp-MX-Timestamp</code> con el timestamp UNIX en segundos del momento del envío, <code>X-Corp-MX-Event-Id</code> con el identificador único del evento — útil para idempotencia — y <code>X-Corp-MX-Event-Type</code> con el tipo de evento — <code>order.created</code>, <code>order.approved</code>, <code>order.shipped</code>, <code>invoice.issued</code>, entre otros.</p>
</div></section>

<section class="section section-alt"><div class="container">
  <h2>Eventos de orden</h2>
  <p>Los eventos de orden cubren el ciclo completo. <code>order.created</code> cuando una orden queda registrada en el sistema tras la aprobación de la cotización. <code>order.in_production</code> cuando la orden arranca producción. <code>order.stage_changed</code> cuando una etapa avanza — corte, confección, personalización, empaque. <code>order.quality_check</code> cuando la orden pasa por inspección de calidad. <code>order.shipped</code> cuando la orden sale del taller con la guía del transportista. <code>order.delivered</code> cuando se confirma la entrega con acuse.</p>
  <p>Para clientes con múltiples plantas, el evento <code>order.stage_changed</code> incluye el identificador de la planta. Para series con varias líneas, el evento <code>order.line_completed</code> se dispara cuando cada línea termina su producción, antes del consolidado. Esto permite que el cliente sepa cuándo una línea está lista sin esperar el consolidado de la orden completa.</p>
</div></section>

<section class="section"><div class="container">
  <h2>Eventos de entrega</h2>
  <p>Los eventos de entrega cubren el ciclo logístico. <code>shipment.created</code> cuando se genera la guía con el transportista. <code>shipment.in_transit</code> cuando el envío entra en ruta con la primera actualización del transportista. <code>shipment.out_for_delivery</code> cuando el envío sale a reparto. <code>shipment.delivered</code> cuando se confirma la entrega con el nombre del receptor y, cuando aplica, la firma escaneada.</p>
  <p>Para entregas con varias paradas — multisede, evento en venue — el evento <code>shipment.stop_completed</code> se dispara cuando se confirma la entrega en cada parada. La información incluye el domicilio, el responsable de recibo, el número de piezas entregadas y la firma cuando aplica. La trazabilidad se conserva durante el periodo de garantía del programa.</p>
</div></section>

<section class="section"><div class="container">
  <h2>Eventos de factura y de calidad</h2>
  <p>Los eventos de factura cubren el ciclo de facturación. <code>invoice.issued</code> cuando la factura con CFDI 4.0 queda timbrada por el SAT y disponible para descarga. <code>invoice.paid</code> cuando se confirma el pago conforme al método de pago y al plazo acordados. <code>invoice.canceled</code> cuando se cancela la factura por el motivo declarado y se emite la refacturación cuando aplica.</p>
  <p>Los eventos de calidad cubren no conformidades y acciones correctivas. <code>quality.non_conformity_opened</code> cuando se abre un 8D por una no conformidad detectada en producción o reportada por el cliente. <code>quality.non_conformity_contained</code> cuando se ejecuta la contención inmediata. <code>quality.non_conformity_closed</code> cuando se cierra el 8D con la acción correctiva verificada. El cliente puede suscribirse a todos los eventos de calidad o solo a los que afectan sus pedidos.</p>
</div></section>

<section class="section section-alt"><div class="container">
  <h2>Reintentos y manejo de fallos</h2>
  <p>Cuando un webhook falla — endpoint devuelve un código de estado fuera del rango 2xx — el sistema reintenta automáticamente. La política de reintentos es de cinco intentos con backoff exponencial: a los sesenta segundos, a los cinco minutos, a los treinta minutos, a las dos horas y a las doce horas. Cuando el último intento falla, el evento queda en una cola de revisión manual y se notifica al responsable técnico del taller y del cliente.</p>
  <p>El sistema nunca entrega un evento dos veces sin que el cliente lo sepa. Cada evento lleva un identificador único en el encabezado <code>X-Corp-MX-Event-Id</code>. El cliente debe almacenar el identificador y, al recibir un evento, verificar que no lo haya procesado antes. La idempotencia se mantiene por el identificador — el cliente descarta el segundo evento con el mismo identificador.</p>
</div></section>

<section class="section"><div class="container">
  <h2>Configuración desde el portal del cliente</h2>
  <p>El cliente configura los webhooks desde el portal — disponible vía SSO — con un endpoint HTTPS válido. Para cada evento, el cliente selecciona si lo recibe o no. Para series con suscripción selectiva — solo eventos de orden, no de calidad — el cliente marca los eventos que requiere. La configuración se guarda y se aplica al instante sin necesidad de esperar una ventana de mantenimiento.</p>
  <p>Para clientes con ambientes separados — sandbox y producción — se manejan dos endpoints independientes. El sandbox entrega eventos con datos ficticios para pruebas. La producción entrega eventos reales de los pedidos del cliente. El cliente puede probar la integración en el sandbox antes de mover el endpoint a producción con un solo cambio en el portal.</p>
</div></section>

<section class="section section-alt"><div class="container">
  <h2>Buenas prácticas para el cliente</h2>
  <p>Recomendamos cuatro prácticas. Primero, validar la firma HMAC SHA-256 antes de procesar el cuerpo — si la firma no coincide, descartar. Segundo, validar el timestamp con tolerancia de cinco minutos — si el evento es más viejo que cinco minutos, descartar para evitar ataques de replay. Tercero, mantener idempotencia por el identificador del evento — almacenar el identificador en una tabla con TTL de veinticuatro horas.</p>
  <p>Cuarto, responder rápido — el endpoint debe devolver un código 2xx en menos de cinco segundos. Si el procesamiento interno toma más tiempo, el cliente debe devolver el 2xx inmediatamente y procesar el webhook en segundo una con un job asincrónico. Cuando el endpoint devuelve un 5xx o un timeout, el sistema lo trata como fallo y dispara el reintento.</p>
</div></section>

<section id="contact-form" class="section section-alt"><div class="container">
  <h2>Configure sus webhooks con Corp-Merch.MX</h2>
  <p>Si su equipo técnico requiere la integración por webhooks con su stack de operaciones, platiquemos. Les entregamos el endpoint del sandbox, el secreto de firma y la documentación completa en formato del cliente.</p>
  <?php require __DIR__ . '/../../../includes/form.php'; ?>
</div></section>

<section class="section role-note"><div class="container">
  <p class="role-note-text">Los webhooks se entregan a clientes con programa vigente y contrato de uso firmado. La documentación puede actualizarse sin previo aviso; las versiones mayores se comunican con treinta días de anticipación. Corp-Merch.MX es un taller mexicano de producción de merch corporativo; operamos de manera independiente.</p>
</div></section>

<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebPage","name":"Webhooks Corp-Merch.MX","description":"Webhooks firmados HMAC SHA-256 con eventos de orden, entrega, factura y calidad. Reintentos, idempotencia y buenas prácticas para integración enterprise.","publisher":{"@type":"Organization","name":"Corp-Merch.MX"}}
</script>
<?php require __DIR__ . '/../../../includes/footer.php'; ?>