Node.js/Express向'/webhook'发POST请求返回404错误排查求助
问题排查与修复方案
- 请求地址配置错误
你当前往端口为3001的客户端发送webhook请求,自然会返回404。你的Firebase服务端模拟器运行在8080端口,且你导出的云函数名为
api,所以接口路径默认会带上/api前缀,完整的本地请求地址格式为http://localhost:5001/[你的Firebase项目ID]/[部署区域,默认us-central1]/api/webhook,具体路径可以直接参考Firebase模拟器启动时终端输出的api函数访问地址。
- Express中间件冲突
你全局注册了
express.json()中间件,会自动解析所有请求的JSON格式请求体,但Stripe Webhook验签需要用到原始未被修改的请求体,全局解析会导致buffer(request)拿到的内容不符合验签要求,甚至直接报错。需要调整中间件注册逻辑,仅对非webhook的路由启用JSON解析:
// 替换原来的全局app.use(express.json())为下面的逻辑 app.use((req, res, next) => { if (req.originalUrl === '/webhook') { next(); } else { express.json()(req, res, next); } });
- 代码语法错误
现有代码存在多处语法错误,会直接导致接口运行异常:
- 请求头获取方式错误:
request.headers("stripe-signature")应为request.headers['stripe-signature'],headers是对象而非调用函数- 变量未定义:捕获验签错误的分支里使用了未定义的
res变量,你定义的请求参数为response,修改为response.status(400)- 云函数导出参数错误:
exports.api = functions.https.onRequest(app, firebaseAdmin)中firebaseAdmin是多余参数,onRequest仅接收一个处理函数参数,直接改为exports.api = functions.https.onRequest(app)- Firebase Admin初始化逻辑错误:
admin.firebaseAdmin()是不存在的方法,多实例获取应用应该调用admin.app('firebaseAdmin'),修改为:
const firebaseAdmin = !admin.apps.length ? admin.initializeApp({ credential: admin.credential.cert(serviceAccount) }, 'firebaseAdmin') : admin.app('firebaseAdmin');
- 缺少兜底响应逻辑
你仅处理了
checkout.session.completed类型的事件,其他类型的Stripe事件推送过来时没有返回响应,会导致请求超时返回错误,需要在webhook路由最后添加兜底返回:
// 在webhook路由的最后补充 response.status(200).send('Event received');
内容的提问来源于stack exchange,提问作者Dylan Williamson
相关产品推荐
相关产品推荐

