Stripe payments 条带Webhook返回错误401并成功

Stripe payments 条带Webhook返回错误401并成功,stripe-payments,webhooks,Stripe Payments,Webhooks,我有一个结帐会议: app.post("/create-checkout-session", async (req, res) => { const session = await stripe.checkout.sessions.create({ payment_method_types: ["card"], line_items: converted_items, mode: "payment",

我有一个结帐会议:

app.post("/create-checkout-session", async (req, res) => {

  const session = await stripe.checkout.sessions.create({
    payment_method_types: ["card"],
    line_items: converted_items,
    mode: "payment",
    success_url: process.env.URL + "/order-success.html",
    cancel_url: process.env.URL + `/order-page.html`,
    billing_address_collection: 'required', 
  });
  
  res.json({ id: session.id, order: req.body });
  
});
我想设置一个webhook,以便在成功付款后,它从客户那里收集数据(姓名、地址、购买的产品)

我从webhook文档中复制了以下内容:

    const fulfillOrder = (session) => {
    // TODO: fill me in

    console.log("Fulfilling order", session);
}

app.post('/webhook', bodyParser.raw({ type: 'application/json' }), (request, response) => {
    const payload = request.body;
    const sig = request.headers['stripe-signature'];

    let event;

    try {
        event = stripe.webhooks.constructEvent(payload, sig, endpointSecret);
    } catch (err) {
        return response.status(400).send(`Webhook Error: ${err.message}`);
    }
    console.log(event.type)
        // Handle the checkout.session.completed event
    if (event.type === 'checkout.session.completed') {
        const session = event.data.object;
        console.log("did order")
            // Fulfill the purchase...
        fulfillOrder(session);
    }

    response.status(200);
});
我设置它的方式是首先在
localhost
上运行服务器,然后从终端运行testingwebhook命令

stripe listen --forward-to localhost:3000/webhook --events=checkout.session.completed
当我付款时,它会在终端上显示以下消息:


看起来您已经对文档中的webhook处理程序代码进行了一些修改。如果您正在使用签出并跟踪文档,是什么让您切换代码以查找
费用。成功

您应该添加一些日志,以了解服务器返回400的原因,但很可能是在
constructEvent
中验证失败。您共享的代码段不显示设置
endpointSecret
,但您需要使用运行
stripe listen
时显示的密码更新该值

您应该查看并关注
checkout.session.completed
事件。您可以修改CLI命令以联机侦听这些事件:

stripe-listen——转发到localhost:3000/webhook——events=checkout.session.completed

然后,您的处理程序将执行,并且您可以实现
fulfillower
,以满足您的需求。如果需要列出的详细信息,则需要检索扩展会话以包括行项目和付款详细信息:

    const session = await stripe.checkout.sessions.retrieve(
      'cs_test_123',
      {
        expand: ['line_items', 'payment_intent.payment_method']
      },
    );
然后,
session.line\u items
将是您创建的,姓名、地址和电子邮件将显示在
session.payment\u intent.payment\u method.billing\u details

更新建议暂时删除签名验证以进行诊断:


400个错误表明您的服务器正在返回一个错误,很可能是签名验证的结果。我建议在没有验证的情况下测试一个基本端点,以确保其他一切都按预期工作。解决此问题后,强烈建议重新添加签名验证。

很抱歉,我们有学校的东西要处理。因此,我已经做了您的更正,而且我刚刚意识到我使用了错误的端点机密。我现在已经改变了它,我认为它现在工作得很好。然而,我遇到了另一个问题。从文档中重新复制代码后,它不会打印任何console.log语句。我甚至加入了一些我自己的,看看它是否在运行,但当我在我的网站上下订单时,什么也没有打印出来。这是否意味着stripe不会进入/webhook路径?它在我的另一个终端中显示会话在您接收到端点的任何事件时进行?您是否将CLI与
条带侦听一起使用?是否转发事件?我正在使用您前面提到的条带侦听命令,并将代码更改为查找checkout.session.completed。我看到,当我下订单时,它会在cli位中显示,而不是在我运行服务器的终端上显示。您是否在使用转发功能?您能否分享完整的
listen
命令和转发结果中的一些示例日志行?它应该显示转发的每个事件的响应代码。是的,我正在运行您为我提供的转发功能。我正在运行
stripe listen--forward to localhost:3000/webhook--events=checkout.session.completed
,我已经更新了上面的内容,以显示我的新终端输出以及我更改的代码。