Stripe-CLI触发webhook事件时服务端未处理事件求助
Stripe Webhook 无日志输出问题排查修复
按以下优先级逐一排查,90%的同类问题都能解决:
- 修复未结束响应的问题
你现有代码最后只写了response.status(200),没有显式结束响应,Stripe端收不到明确的成功返回会判定请求投递失败,不会完成事件推送流程。将最后一行修改为:response.status(200).send(); - 补全错误日志,先定位具体报错
你当前的catch块只向前端返回错误信息,没有在服务端打印日志,签名校验、解析出错时终端不会有任何输出。修改catch块逻辑:
加完这行日志再触发事件,就能直接看到具体报错原因,不用盲猜。catch (err) { console.log('Webhook处理出错:', err.message); return response.status(400).send(`Webhook Error: ${err.message}`); } - 排查全局JSON解析中间件冲突(最高发原因)
如果你在Express入口全局注册了express.json()或者bodyParser.json()中间件,请求到达/webhook路由前就会被解析为JSON对象,你给该路由单独配置的bodyParser.raw规则不会生效。
Stripe的constructEvent方法必须接收原始Buffer格式的请求体,拿到解析后的JSON对象会直接抛签名校验错误。修复方式是把webhook路由的raw解析规则放到全局JSON解析之前注册:// 优先注册webhook的原始请求体解析规则 app.use('/webhook', bodyParser.raw({type: 'application/json'})); // 再注册全局JSON解析,供其他普通路由使用 app.use(express.json()); // 后续再注册其他业务路由 - 校验签名密钥是否匹配
如果你用Stripe CLI做本地测试:运行stripe listen时终端会输出专属的测试签名密钥(格式为whsec_开头),代码里的endpointSecret必须填这个CLI生成的密钥,不能填Stripe仪表盘里生产环境端点的签名密钥,二者不通用,填错会直接导致签名校验失败。
如果你用服务端直连Stripe仪表盘测试:确认端点配置里已经勾选了checkout.session.completed事件,未勾选的话Stripe不会向你的地址推送该事件。 - 确认CLI转发地址正确
用Stripe CLI转发事件时,转发地址必须和本地webhook路由完全匹配,比如本地服务跑在3000端口,启动命令必须写全路由路径:
漏写stripe listen --forward-to localhost:3000/webhook/webhook后缀只写端口号的话,请求根本到不了你的处理逻辑。
内容的提问来源于stack exchange,提问作者Cristian Babalau
相关产品推荐
相关产品推荐

