You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Stripe Webhook签名验证失败,求排查问题原因

Stripe Webhook签名验证失败的问题修复

你的代码里核心错误是在调用stripe.webhooks.constructEvent时,对已经是原始格式的request.body做了JSON.stringify处理——这会改变请求体的原始内容,直接导致签名验证不匹配。

因为你已经用了express.raw({type: "*/*"})中间件,request.body已经是Stripe要求的原始请求体Buffer,不需要再做JSON序列化,直接传入即可。

修正后的代码

app.post("/webhook", express.raw({type: "*/*"}), async (request, response) => {
  const payload = request.body;
  const sig = request.headers["stripe-signature"];

  let event;
  try {
    // 直接传原始payload,无需JSON.stringify
    event = stripe.webhooks.constructEvent(
      payload,
      sig,
      process.env.WEBHOOK_SECRET
    );
  } catch (err) {
    return response.status(400).send(`Webhook Error: ${err.message}`);
  }

  if (event.type === "checkout.session.completed") {
    const sessionWithLineItems = await stripe.checkout.sessions.retrieve(
      event.data.object.id,
      { expand: ["line_items"] }
    );
    // 修正之前的变量赋值错误,正确获取订单项
    const lineItems = sessionWithLineItems.line_items;

    // 处理订单履约逻辑...
  }

  response.status(200).end();
});

额外检查点

  • 确认process.env.WEBHOOK_SECRET是Stripe控制台对应Webhook的签名密钥(格式为whsec_xxx开头,不是普通API密钥)。
  • 确保该路由没有被其他中间件(比如全局的express.json())提前修改请求体,express.raw必须是第一个处理该路由的中间件。
  • 本地测试时,确认Stripe CLI转发命令的--secret参数用的是正确的签名密钥。

内容的提问来源于stack exchange,提问作者Flavio Pinnelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:30:06