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

Express集成Stripe Webhook抛出有效负载签名不匹配错误

Stripe Webhook 签名不匹配报错修复方案

核心问题

该报错的本质是Webhook路由接收到的请求体已经被JSON解析中间件篡改,并非Stripe发送的原始请求内容,签名校验必然失败。你代码里存在三个直接导致报错的问题:

  • 全局注册了两层JSON解析中间件:router.use(express.json())和router.use(bodyParser.json()),所有路由(包括/webhook)的请求在到达处理逻辑前,原始请求流就已经被读取、解析为JSON对象,此时request.rawBody要么不存在,要么是被处理过的非原始内容,无法通过签名校验。
  • Stripe客户端初始化使用了公钥(PUBLIC_KEY是pk开头的前端公钥),服务端API调用、Webhook签名校验必须使用sk开头的服务端密钥,公钥不具备服务端接口权限。
  • Webhook处理逻辑仅设置了200状态码,没有返回响应结束请求,Stripe会判定请求超时重复推送事件。

修复步骤

  1. 调整中间件注册顺序,给Webhook路由单独配置原始请求体解析,避免JSON解析中间件篡改请求内容。将原router.js里的全局JSON解析中间件、Webhook路由代码替换为以下内容:
// Webhook路由必须单独使用express.raw解析,放在所有JSON解析中间件之前
router.post('/webhook', express.raw({type: 'application/json'}), (request, response) => {
  const sig = request.headers['stripe-signature'];
  let event;

  try {
    // express.raw解析后request.body就是原始Buffer,直接用于签名校验即可
    event = stripe.webhooks.constructEvent(request.body, sig, endpointSecret);
    console.log(event)
  } catch (err) {
    console.log(err.message)
    return response.status(400).send(`Webhook Error: ${err.message}`);
  }

  // 处理支付完成事件
  if (event.type === 'checkout.session.completed') {
    const session = event.data.object;
    fulfillOrder(session);
  }

  // 必须返回响应终止请求
  return response.status(200).json({received: true});
});

// 其余普通路由再注册JSON解析中间件,不会影响上面的Webhook路由
router.use(express.json());
// 删掉重复的router.use(bodyParser.json()),express.json已经是express内置的body-parser实现,不需要额外引包
  1. 修正Stripe初始化密钥,将原来的公钥替换为服务端密钥:
// 替换为你环境变量中存储的sk开头的服务端密钥
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
  1. 确认Webhook签名密钥正确:本地调试使用Stripe CLI时,每次执行stripe listen命令,终端会输出当前会话专属的whsec开头的签名密钥,将代码里endpointSecret的值替换为该串即可,不要使用线上Stripe面板里的Webhook密钥,二者不通用。

验证方式

改完代码重启服务,重新执行stripe listen --forward-to localhost:4242/webhook,新开终端执行stripe trigger checkout.session.completed触发测试事件,即可正常接收事件,不会再报签名不匹配错误。

内容的提问来源于stack exchange,提问作者Cristian Babalau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:57:13