如何修复Stripe webhook返回404、Express路由无法响应GET请求的问题
问题排查与修复方案
核心问题1:路由挂载规则误用导致路径重复拼接
Express的app.use(path, router)逻辑是把router内的所有路由路径 拼接到path前缀后面,而非直接替换。当前配置存在两个明显错误:
- 你给
/webhook路径挂载了webhooks路由,但webhooks路由内部又定义了router.route('/webhook').post(...),实际生效的webhook路径是/webhook/webhook,这就是Stripe请求/webhook返回404的直接原因。 - orders路由多次重复挂载属于冗余配置,只需要挂载一次
app.use('/', orders)即可,因为orders内部已经定义了/、/admin、/create-payment-intent这些子路径,重复挂载不会产生额外作用。
核心问题2:请求方法不匹配
你直接在浏览器地址栏访问路由默认发送的是GET请求,但:
/create-payment-intent仅定义了POST方法的处理逻辑/webhook仅定义了POST方法的处理逻辑
所以访问时会返回Cannot GET xxx的错误,属于预期行为,不属于配置错误。
修复步骤
第一步:清理app.js中的路由挂载逻辑,删除冗余的orders挂载
修改后的app.js路由注册部分代码:
// Register api routes // 仅保留一次orders路由挂载即可,内部子路径会自动匹配 app.use('/', orders) app.use('/webhook', webhooks)
第二步:修改webhooks路由内部的路径定义
因为已经给webhooks路由加了/webhook前缀,内部直接匹配根路径即可:
修改后的/routes/webhooks.js代码:
const express = require('express') const router = express.Router() const WebhooksController = require('../controllers/webhooksController') // 这里修改为/,配合app.use('/webhook', webhooks),最终生效路径就是/webhook router.route('/').post(express.raw({type: 'application/json'}), WebhooksController.apiPostWebhookEvent) module.exports = router
补充说明
如果需要测试POST路由,可以用Postman、curl等工具发送POST请求,不要直接用浏览器地址栏GET访问。webhook和支付意图接口本身就只应该接收POST请求,不需要额外补充GET支持。
内容的提问来源于stack exchange,提问作者Kevin T.
相关产品推荐
相关产品推荐

