如何修复错误条带:未提供条带签名标头值

问题描述 投票:0回答:1

在 Strapi 中,我试图从 Stripe 获取支付事件,我在一个名为“Order”的集合中创建了一个 Webhook,该 Webhook 似乎可以工作,因为它确实能够获取事件,因为它确实使用控制台打印信息。记录但我总是收到以下错误:未提供条带签名标头值。 我已经创建并配置了帐户,Stripe 无需 Webhook 即可接受付款。但是,我想实现 webhook,因此我使用带有 Stripe CLI 的终端在本地运行测试。

首先,我运行以下命令:

stripe 监听 --forward-to http://localhost:1337/api/orders/stripe-webhook

这会生成一个密钥并显示消息:

“准备好了!您正在使用 Stripe API 版本 [2024-11-20]。您的 Webhook 签名密钥是 whsec_69b...”。

我在环境变量 STRIPE_WEBHOOK_SECRET 中设置了此密钥(whsec_69b ...)。

然后,我使用以下命令来模拟事件(也称为触发器): 条纹触发 payment_intent.succeeded.

Webhook 正确接收事件,但是在验证 Webhook 时,我收到一个似乎无法解决的错误。

async handleWebhook(ctx) {
        const body = JSON.stringify(ctx.request.body);
        const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET;
        const signature = ctx.request.headers['stripe-signature']

        console.log(body);
        console.log(signature);
        console.log(endpointSecret);
        
        

        try {
            // Asegúrate de pasar el cuerpo como Buffer o String crudo
            const event = stripe.webhooks.constructEvent(body, signature, endpointSecret);

            // Procesar el evento
            if (event.type === 'payment_intent.succeeded') {
                const paymentIntent = event.data.object;
                console.log('Pago exitoso:', paymentIntent);
            }

            // Responde con 200 OK
            ctx.status = 200;
            ctx.body = 'Webhook recibido correctamente';
        } catch (err) {
            // Error en la verificación de la firma
            console.error('Error al procesar el webhook:', err.message);
            ctx.status = 400;
            ctx.body = `Error del webhook: ${err.message}`;
        }

    },

这是route/order.js

'use strict';

/**
 * order router
 */
module.exports = {
  routes: [
    {
      method: 'POST',
      path: '/orders', // Ruta para crear pedidos
      handler: 'order.create',
      config: {
        policies: [],
      },
    },
    {
      method: 'PUT',
      path: '/orders/:id', // Ruta para actualizar pedidos
      handler: 'order.update', // Usa el controlador predeterminado para actualizar
      config: {
        policies: [], // Puedes agregar políticas de autorización aquí
      },
    },
    {
      method: 'POST',
      path: '/orders/:id/update-stripe', // Ruta personalizada para actualizar stripeId
      handler: 'order.updateStripeId', // Necesitas definir este controlador
      config: {
        policies: [], // Agrega restricciones si es necesario
      },
    },
    {
      method: 'POST',
      path: '/orders/stripe-webhook',
      handler: 'order.handleWebhook',
      config: {
        auth: false,
       
      },
    },
  ],
};








I have tried to put this code like this: 
> ​​const body = ctx.request.body
 but it does not solve it
node.js stripe-payments strapi
1个回答
0
投票

您可能需要使用

express.raw
中间件(即
express.raw({type: 'application/json'}
)来确保正文数据是原始数据。您可以在 webhook builder 中找到一些示例代码,并参考此 doc 了解更多可能的 webhook 签名验证错误解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.