【问题标题】:Stripe Webhook Returning Error 401 and SuccessStripe Webhook 返回错误 401 和成功
【发布时间】:2021-01-12 08:12:36
【问题描述】:

我有一个结帐会话:

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 上运行我的服务器,然后我从终端运行测试 webhook 命令

stripe listen --forward-to localhost:3000/webhook --events=checkout.session.completed

当我付款时,它会在终端中显示这些消息:

【问题讨论】:

    标签: stripe-payments webhooks


    【解决方案1】:

    您似乎对文档中的 webhook 处理程序代码进行了一些修改。如果您使用 Checkout 并遵循文档,是什么让您切换代码以查找 charge.succeeded

    您应该添加一些日志来找出您的服务器返回 400 的原因,但很可能验证在 constructEvent 中失败。您共享的 sn-p 不会显示您设置 endpointSecret,但您需要使用运行 stripe listen 时显示给您的密钥更新值。

    您应该查看Checkout fulfillment docs 并关注checkout.session.completed 事件。您可以修改您的 CLI 命令以在线收听这些事件:

    stripe listen --forward-to localhost:3000/webhook --events=checkout.session.completed

    那么您的处理程序将 look like the docs 并且您可以实现 fulfillOrder 以满足您的需求。如果您想要列出的详细信息,则需要检索带有扩展的会话以包含行项目和付款详细信息:

        const session = await stripe.checkout.sessions.retrieve(
          'cs_test_123',
          {
            expand: ['line_items', 'payment_intent.payment_method']
          },
        );
    

    然后session.line_items 将是您创建的,名称、地址和电子邮件将在session.payment_intent.payment_method.billing_details 上。

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

    400 错误表明您的服务器返回错误,很可能是签名验证的结果。我建议在 this example 之后测试一个基本端点而不进行验证,以确保其他一切都按预期工作。解决后,强烈建议重新添加签名验证。

    【讨论】:

    • 抱歉耽搁了,还有学校的事情要处理。因此,我已对您进行了更正,而且我刚刚意识到我使用了错误的端点密码。我现在已经改变了它,我认为它现在工作正常。但是,我遇到了另一个问题。从文档中重新复制代码后,它不会打印任何 console.log 语句。我什至添加了一些我自己的内容,以了解它是否正在运行,但是当我在我的网站上下订单时,什么都没有打印出来。这是否意味着 stripe 不会去 /webhook 路由?它在我的另一个终端中显示会话已通过
    • 您的端点是否收到任何事件?您是否将 CLI 与 stripe listen 一起使用并转发事件?
    • 我正在使用您之前提到的条带监听命令,并且还更改了代码以查找 checkout.session.completed。我看到,当我下订单时,它会在 cli 位中显示,而不是在我运行服务器的终端中显示。
    • 你在使用转发功能吗?你能分享你完整的listen 命令和转发结果中的一些示例日志行吗?它应该显示每个转发事件的响应代码。
    • 是的,我正在运行您为我提供的转发功能。我正在运行stripe listen --forward-to localhost:3000/webhook --events=checkout.session.completed,并且我已经更新了上面的内容以显示我的新终端输出以及我更改的代码。
    猜你喜欢
    • 2020-06-26
    • 2020-03-15
    • 2020-08-03
    • 2017-04-26
    • 1970-01-01
    • 2016-11-09
    • 2021-11-28
    • 2023-03-24
    • 2021-12-17
    相关资源
    最近更新 更多