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

Stripe Webhook签名验证失败:无负载提供问题求助

问题排查与修复

核心问题:中间件顺序错误

你的路由配置把handleStripeWebhook放在了bodyParser.json()中间件前面。请求到达时会先执行webhook处理函数,但此时req.rawBody还没被bodyParser的verify方法赋值,导致req.rawBody是undefined,Stripe拿不到webhook payload,直接触发“No webhook payload was provided”错误。

修复步骤

1. 调整路由中间件顺序

把bodyParser.json()移到handleStripeWebhook前面,确保请求体先被解析并设置好req.rawBody:

router.post('/webhook', bodyParser.json({ verify: function (req, res, buf) { req.rawBody = buf.toString() } }), handleStripeWebhook);

2. 修复未声明的event变量

webhook函数里的event没加let/const声明,会变成全局变量,存在风险,补上声明:

// 修改前
event = stripe.webhooks.constructEvent(req.rawBody, sig, webhookSecret);
// 修改后
const event = stripe.webhooks.constructEvent(req.rawBody, sig, webhookSecret);

3. 匹配触发的事件类型

你现在只处理checkout.session.completed事件,但用stripe trigger payment_intent.succeeded触发的是payment_intent.succeeded事件,得加对应处理逻辑,不然验证通过后也不会执行业务代码:

// 在Handle the event区块添加:
if (event.type === 'payment_intent.succeeded') {
    const paymentIntent = event.data.object;
    console.log('✅ Payment Intent succeeded event received');
    console.log('Payment Intent ID:', paymentIntent.id);
    // 这里写对应的业务处理逻辑
}

4. 确认req.rawBody的正确性

确保buf.toString()没有额外编码问题,直接用原始buffer转换就行,别额外处理。如果用的是Express这类框架,要确认没有其他中间件提前解析了请求体。

验证修复

改完重启服务,再执行:

stripe trigger payment_intent.succeeded

这时应该能看到✅ Webhook signature verified的日志,并且正确处理payment_intent.succeeded事件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:38:33