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

