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
相关产品推荐
相关产品推荐

