Stripe webhook -Webhook 错误:Webhook 负载必须以字符串或缓冲区的形式提供

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

当付款成功时,我试图使用 stripe 来控制台一条消息,因为我正在使用 webhooks。

const stripe = require('stripe')('sk_test_'); // Replace with your actual key

const handleWebhook = async (req, res) => {
    let event;
    
    try {
        const sig = req.headers['stripe-signature'];
        // Use req.body directly since it's raw
        event = stripe.webhooks.constructEvent(req.body, sig, 'whsec_code'); 
    } catch (err) {
        console.error(`Webhook Error: ${err.message}`);
        return res.status(400).send(`Webhook Error: ${err.message}`);
    }

    console.log(event.type);
    switch (event.type) {
        case 'checkout.session.completed':
            const session = event.data.object;
            console.log('Checkout session completed:', session.id);
            if (session.payment_status === 'paid') { alert("hii")
                console.log('PaymentIntent was successful!');
                const updatedValues = JSON.parse(session.metadata.updatedValues);
                console.log("updatedValues is", updatedValues);
            }
            break;

并且 session. payment_status === 'paid' 我需要测试 webhook 是否正常工作。所以我只是提醒一条消息。但我得到了

Webhook 错误:Webhook 负载必须以字符串或 Buffer (https://nodejs.org/api/buffer.html) 实例代表 raw 请求正文。Payload 作为已解析的 JavaScript 对象提供。 如果没有访问权限,则无法进行签名验证 原始签名材料。

我的app.js

gsrApp.use((req, res, next) => {
  console.log(`Incoming request size: ${JSON.stringify(req.body).length} bytes`);
  next();
});

我有路由器

routerV2.post('/webhook', express.raw({ type: 'application/json' }), handleWebhook);

提前致谢

node.js stripe-payments webhooks
1个回答
0
投票

这是一个常见错误,您的 Web 框架可能意外(或无意)干扰了 Stripe 发送的请求正文。根据经验,Stripe SDK 期望来自传入 HTTP 请求的准确的原始正文

值得遵循确切的 Stripe 示例代码,或者查看 此 Github 问题以获取 Node 上的 webhook 。常见的问题是注意

bodyParser
或使用
rawBody
。另外,如果您使用 AWS lambda,您可能需要一些身体映射模板。

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