Stripe — полезная нагрузка Webhook должна предоставляться в виде строки или буфера

Я пытаюсь закодировать систему подписки с полосой. Мой следующий код в основном скопирован из документов полосы, но он всегда показывает мне эту ошибку:

Webhook signature verification failed. Webhook payload must b
e provided as a string or a Buffer (https://nodejs.org/api/buffer.html) instance representing the _raw_ request body.Payload was provided as a parsed JavaScript object instead.
Signature verification is impossible without access to the original signed material.
Learn more about webhook signing and explore webhook integration 
examples for various frameworks at https://github.com/stripe/stripe-node#webhook-signing

Это мой код, написанный на javascript:

app.post(
  '/webhook',
  express.raw({ type: 'application/json' }),
  (request, response) => {
    let event = request.body;

    const endpointSecret = 'whsec_.....';

    if (endpointSecret) {

      const signature = request.headers['stripe-signature'];
      try {
        event = stripe.webhooks.constructEvent(
          request.body,
          signature,
          endpointSecret
        );
      } catch (err) {
        console.info(`⚠️  Webhook signature verification failed.`, err.message);
        return response.sendStatus(400);
      }
    }
    let subscription;
    let status;

    switch (event.type) {
      case 'customer.subscription.created':
        subscription = event.data.object;
        status = subscription.status;
        console.info(`Subscription status is ${status}.`);

        break;
      default:
        console.info(`Unhandled event type ${event.type}.`);
    }
    response.send();
  }
);

Кто-нибудь знает, что я делаю неправильно? Я буквально час ищу в Интернете и ничего не могу найти. Заранее спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
475
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Похоже, что что-то в вашем приложении анализирует входящий запрос в формате, отличном от того, который ожидает функция (например, JSON). У вас есть промежуточное программное обеспечение или синтаксический анализатор, настроенный в вашем приложении глобально? Если это так, вы, вероятно, захотите отключить его или просто добавить исключение, когда оно не затрагивает тело входящего запроса, которое отправляется на /webhook маршрут.

У меня точно такие же модули и код, как в этом примере: https://stripe.com/docs/billing/quickstart#provision-access-‌​webhooks

Adalbert Steiner 18.05.2023 15:35
Ответ принят как подходящий

Это потому что app.use(express.json()); код. Попробуйте переместить маршрут вебхука до app.use(express.json());.

// webhook route
app.post(
  '/webhook',
  express.raw({ type: 'application/json' }),
  (request, response) => {
    let event = request.body;

    const endpointSecret = 'whsec_.....';

    if (endpointSecret) {

      const signature = request.headers['stripe-signature'];
      try {
        event = stripe.webhooks.constructEvent(
          request.body,
          signature,
          endpointSecret
        );
      } catch (err) {
        console.info(`⚠️  Webhook signature verification failed.`, err.message);
        return response.sendStatus(400);
      }
    }
    let subscription;
    let status;

    switch (event.type) {
      case 'customer.subscription.created':
        subscription = event.data.object;
        status = subscription.status;
        console.info(`Subscription status is ${status}.`);

        break;
      default:
        console.info(`Unhandled event type ${event.type}.`);
    }
    response.send();
  }
);

app.use(express.json());
Hi i had the same issue when i was trying to implement the web-hook in my react application and i found this solution:

in your server.js file use this code :
app.use(
    bodyParser.json({
        verify: function(req, res, buf) {
            req.rawBody = buf;
        }
    })
);

and you must use it before the `app.use(bodyParser.json());`

and the in your stripe-file 

use this line of code:
event = stripe.webhooks.constructEvent(request.rawBody, sig, endpointSecret);

instead of this line: 
event = stripe.webhooks.constructEvent(request.body, sig, endpointSecret);

Другие вопросы по теме