{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://inquir.org/ru/use-cases/stripe-webhooks#webpage","url":"https://inquir.org/ru/use-cases/stripe-webhooks","name":"Обработка Stripe webhooks: HMAC, идемпотентность и async-пайплайн","headline":"Обработка Stripe webhooks: HMAC, идемпотентность и async-пайплайн","description":"Serverless-обработчик Stripe-вебхуков: HMAC-проверка по сырому телу, быстрый ответ до ретрая Stripe, ключи идемпотентности для дублей, async-пайплайн для фулфилмента.","inLanguage":"ru-RU","isPartOf":{"@id":"https://inquir.org/#website"},"author":{"@type":"Organization","name":"Inquir"},"datePublished":"2025-01-01T00:00:00.000Z","dateModified":"2026-04-20T00:00:00.000Z","citation":"https://inquir.org/docs"},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Главная","item":"https://inquir.org"},{"@type":"ListItem","position":2,"name":"Сценарии","item":"https://inquir.org/use-cases"},{"@type":"ListItem","position":3,"name":"Вебхуки Stripe","item":"https://inquir.org/use-cases/stripe-webhooks"}]},{"@type":"HowTo","@id":"https://inquir.org/ru/use-cases/stripe-webhooks#howto","name":"Обработка Stripe webhooks: HMAC, идемпотентность и async-пайплайн","description":"Serverless-обработчик Stripe-вебхуков: HMAC-проверка по сырому телу, быстрый ответ до ретрая Stripe, ключи идемпотентности для дублей, async-пайплайн для фулфилмента.","inLanguage":"ru-RU","author":{"@type":"Organization","name":"Inquir"},"step":[{"@type":"HowToStep","position":1,"name":"Проверить подпись","text":"`stripe.webhooks.constructEvent(event.body, sig, secret)` — выбрасывает при несовпадении."},{"@type":"HowToStep","position":2,"name":"Проверить идемпотентность","text":"Записать event.id в базу; конфликт — вернуть 200 без работы."},{"@type":"HowToStep","position":3,"name":"Ответить 200 и запустить оркестрацию","text":"`global.durable.startNew('fulfill', undefined, { eventId, type, data })` → `return { statusCode: 200 }`."}],"isPartOf":{"@id":"https://inquir.org/ru/use-cases/stripe-webhooks#webpage"}},{"@type":"FAQPage","@id":"https://inquir.org/ru/use-cases/stripe-webhooks#faq","url":"https://inquir.org/ru/use-cases/stripe-webhooks","isPartOf":{"@id":"https://inquir.org/ru/use-cases/stripe-webhooks#webpage"},"mainEntity":[{"@type":"Question","name":"Почему нужен raw body?","acceptedAnswer":{"@type":"Answer","text":"Stripe считает подпись по raw-байтам тела. После JSON.parse/stringify байты могут измениться — подпись не совпадёт."}},{"@type":"Question","name":"Как хранить webhook secret?","acceptedAnswer":{"@type":"Answer","text":"Переменная окружения `STRIPE_WEBHOOK_SECRET` в настройках функции. Не коммитить в git."}}]}]}