Stripe Webhook报错:Payload需为字符串或Buffer实例的问题求助
问题解决方法
核心原因
你的全局日志中间件在webhook路由的express.raw中间件之前执行,且应用中大概率存在全局的express.json()中间件,已经把Stripe发送的原始JSON payload解析成了JavaScript对象。Stripe的webhook签名验证必须使用原始未解析的请求体(Buffer或字符串),因此触发了签名验证失败的报错。
具体修复步骤
调整路由注册顺序
将webhook的路由注册代码,放在全局的express.json()和日志中间件之前,确保express.raw优先处理webhook请求:// 先注册webhook路由 routerV2.post('/webhook', express.raw({ type: 'application/json' }), handleWebhook); gsrApp.use(routerV2); // 再注册全局中间件 gsrApp.use(express.json()); gsrApp.use((req, res, next) => { console.log(`Incoming request size: ${JSON.stringify(req.body).length} bytes`); next(); });修正全局日志中间件
webhook请求的req.body是Buffer类型,直接序列化会出问题,添加路径判断跳过webhook请求的日志处理:gsrApp.use((req, res, next) => { // 根据实际webhook路径调整判断条件 if (req.path !== '/webhook') { console.log(`Incoming request size: ${JSON.stringify(req.body).length} bytes`); } next(); });替换无效的alert代码
Node.js环境不支持浏览器的alert(),替换为后端日志输出:if (session.payment_status === 'paid') { console.log("hii"); // 替换alert为console.log console.log('PaymentIntent was successful!'); const updatedValues = JSON.parse(session.metadata.updatedValues); console.log("updatedValues is", updatedValues); }
验证方式
使用Stripe CLI发送测试webhook事件,或在Stripe后台配置测试触发,确认签名验证通过且日志正常输出。
内容的提问来源于stack exchange,提问作者Shanu k k
相关产品推荐
相关产品推荐

