<?php
$page_lang = 'ru';
$page_title = 'Webhooks: подписанные события для enterprise клиентов | Corp-Merch.MX';
$page_description = 'Webhooks с подписью HMAC SHA-256: события заказа, отгрузки, счёта, качества и каталога. Валидация подписи, повторы, идемпотентность.';
$og_image = '/assets/images/og-sdk.png';
$page_section = 'sdk';
$page_slug    = 'webhooks';

$labels = [
    'name' => 'Имя', 'name_placeholder' => 'Ваше имя',
    'contact' => 'Рабочий email', 'contact_placeholder' => 'имя@компания.com',
    'company' => 'Компания', 'company_placeholder' => 'Юридическое лицо',
    'message' => 'Бриф', 'message_placeholder' => 'Операционный стек, необходимые события, эндпоинт...',
    'submit' => 'Настроить webhooks', 'sending' => 'Отправляется...',
    'turnstile_error' => 'Подтвердите, что вы не робот'
];

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="/ru/">Главная</a><span class="sep">&rsaquo;</span><a href="/ru/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 · Повтор · Идемпотентность · Песочница</p>
      <h1>Подписанные webhooks для enterprise клиентов</h1>
      <p class="hero-subtitle">Как ваша система получает уведомления от мастерской, когда что-то меняется в заказе, поставке, счёте, оповещении о качестве или позиции каталога. Webhooks подписываются, доставляются с уникальными идентификаторами и повторяются с экспоненциальным бэкоффом. Настройка через клиентский портал против валидного HTTPS-эндпоинта.</p>
      <div class="hero-cta"><a href="#contact-form" class="btn btn-primary">Настроить webhooks</a></div>
    </div>
  </div>
</section>

<section class="section"><div class="container">
  <h2>Как подписывается webhook</h2>
  <p>Каждый webhook подписывается с HMAC SHA-256. Подпись вычисляется по сырому телу запроса — необработанному — сцепленному с временной меткой и уникальным идентификатором события. Подпись доставляется в заголовке <code>X-Corp-MX-Signature</code> в шестнадцатеричном формате. Вы пересчитываете подпись с общим секретом и сравниваете с полученной. Если они не совпадают, webhook отбрасывается.</p>
  <p>Заголовки, приходящие с каждым webhook: <code>X-Corp-MX-Signature</code> с подписью HMAC, <code>X-Corp-MX-Timestamp</code> с UNIX-временной меткой в секундах на момент отправки, <code>X-Corp-MX-Event-Id</code> с уникальным идентификатором события — полезен для идемпотентности — и <code>X-Corp-MX-Event-Type</code> с типом события — <code>order.created</code>, <code>order.approved</code>, <code>order.shipped</code>, <code>invoice.issued</code>, среди других.</p>
</div></section>

<section class="section section-alt"><div class="container">
  <h2>События заказа</h2>
  <p>События заказа охватывают весь жизненный цикл. <code>order.created</code> когда заказ зарегистрирован после одобрения предложения. <code>order.in_production</code> когда производство начинается. <code>order.stage_changed</code> когда стадия продвигается — раскрой, пошив, нанесение, упаковка. <code>order.quality_check</code> когда заказ проходит контроль качества. <code>order.shipped</code> когда заказ покидает мастерскую с номером отслеживания перевозчика. <code>order.delivered</code> когда доставка подтверждена с актом получения.</p>
  <p>Для клиентов с несколькими предприятиями событие <code>order.stage_changed</code> включает идентификатор предприятия. Для тиражей с несколькими линейками событие <code>order.line_completed</code> срабатывает, когда каждая линейка завершает производство, до консолидированного пакета. Это позволяет клиенту знать, когда линейка готова, не дожидаясь полного заказа.</p>
</div></section>

<section class="section"><div class="container">
  <h2>События отгрузки</h2>
  <p>События отгрузки охватывают логистический цикл. <code>shipment.created</code> когда номер отслеживания сгенерирован с перевозчиком. <code>shipment.in_transit</code> когда отгрузка в пути с первым обновлением перевозчика. <code>shipment.out_for_delivery</code> когда отгрузка вышла на доставку. <code>shipment.delivered</code> когда доставка подтверждена с именем получателя и, где применимо, сканированной подписью.</p>
  <p>Для многоточечных доставок — многоадресных, мероприятий с несколькими площадками — событие <code>shipment.stop_completed</code> срабатывает, когда каждая точка подтверждена. Информация включает адрес, ответственного за получение, доставленные изделия и подпись, где применимо. Прослеживаемость сохраняется на период гарантии программы.</p>
</div></section>

<section class="section section-alt"><div class="container">
  <h2>События счёта и качества</h2>
  <p>События счёта охватывают цикл выставления счетов. <code>invoice.issued</code> когда счёт CFDI 4.0 отштамповывается SAT и доступен для скачивания. <code>invoice.paid</code> когда оплата подтверждается по согласованному методу и срокам. <code>invoice.canceled</code> когда счёт отменяется по заявленной причине и перевыставляется, где применимо.</p>
  <p>События качества охватывают несоответствия и корректирующие действия. <code>quality.non_conformity_opened</code> когда открывается 8D для несоответствия, обнаруженного на производстве или сообщённого клиентом. <code>quality.non_conformity_contained</code> когда выполняется немедленное сдерживание. <code>quality.non_conformity_closed</code> когда 8D закрывается с проверенным корректирующим действием. Клиент может подписаться на все события качества или только на те, что затрагивают его заказы.</p>
</div></section>

<section class="section"><div class="container">
  <h2>Повторы и обработка сбоев</h2>
  <p>Когда webhook завершается сбоем — эндпоинт возвращает код статуса вне диапазона 2xx — система повторяет автоматически. Политика повторов — пять попыток с экспоненциальным бэкоффом: через шестьдесят секунд, пять минут, тридцать минут, два часа и двенадцать часов. Когда последняя попытка завершается сбоем, событие попадает в очередь ручного разбора и уведомляются технические руководители мастерской и клиента.</p>
  <p>Система никогда не доставляет событие дважды без вашего уведомления. Каждое событие несёт уникальный идентификатор в заголовке <code>X-Corp-MX-Event-Id</code>. Вы храните идентификатор и, при получении события, проверяете, что не обработали его раньше. Идемпотентность поддерживается по идентификатору — второе событие с тем же идентификатором отбрасывается.</p>
</div></section>

<section class="section section-alt"><div class="container">
  <h2>Настройка через клиентский портал</h2>
  <p>Клиенты настраивают webhooks через портал — доступный через SSO — с валидным HTTPS-эндпоинтом. Для каждого события клиент выбирает, получать его или нет. Для тиражей с избирательной подпиской — только события заказа, не качества — клиент отмечает нужные события. Настройка сохраняется и применяется мгновенно без ожидания окна обслуживания.</p>
  <p>Для клиентов с разделёнными средами — песочница и продакшн — управляются двумя независимыми эндпоинтами. Песочница доставляет события с фиктивными данными для тестирования. Продакшн доставляет реальные события из заказов клиента. Клиент может протетировать интеграцию в песочнице, прежде чем перенести эндпоинт в продакшн одним изменением в портале.</p>
</div></section>

<section class="section"><div class="container">
  <h2>Лучшие практики на стороне клиента</h2>
  <p>Мы рекомендуем четыре практики. Во-первых, валидируйте подпись HMAC SHA-256 перед обработкой тела — если подпись не совпадает, отбросьте. Во-вторых, валидируйте временную метку с допуском пять минут — если событие старше пяти минут, отбросьте для предотвращения атак повтора. В-третьих, поддерживайте идемпотентность по идентификатору события — храните идентификатор в таблице с TTL двадцать четыре часа.</p>
  <p>В-четвёртых, отвечайте быстро — эндпоинт должен вернуть код 2xx в течение пяти секунд. Если внутренняя обработка занимает больше времени, клиент возвращает 2xx немедленно и обрабатывает webhook асинхронно фоновой задачей. Когда эндпоинт возвращает 5xx или таймаут, система обрабатывает это как сбой и запускает повтор.</p>
</div></section>

<section id="contact-form" class="section section-alt"><div class="container">
  <h2>Настройте ваши webhooks с Corp-Merch.MX</h2>
  <p>Если вашей технической команде нужна интеграция через webhooks с вашим операционным стеком, давайте поговорим. Мы предоставим эндпоинт песочницы, секрет подписи и полную документацию в вашем формате.</p>
  <?php require __DIR__ . '/../../../includes/form.php'; ?>
</div></section>

<section class="section role-note"><div class="container">
  <p class="role-note-text">Webhooks предоставляются клиентам с действующей программой и подписанным соглашением об использовании. Документация может обновляться без предварительного уведомления; о мажорных версиях сообщается за тридцать дней. Corp-Merch.MX — мексиканская мастерская корпоративного мерча; мы работаем независимо.</p>
</div></section>

<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebPage","name":"Webhooks Corp-Merch.MX","description":"Webhooks с подписью HMAC SHA-256 с событиями заказа, отгрузки, счёта и качества. Повторы, идемпотентность и лучшие практики для enterprise-интеграции.","publisher":{"@type":"Organization","name":"Corp-Merch.MX"}}
</script>
<?php require __DIR__ . '/../../../includes/footer.php'; ?>