Stripe Webhook支付成功后无法向Firebase Firestore发送数据问题
Stripe webhook同步Firebase失败修复方案
代码错误修正
你代码中存在多处可直接导致写入失败的语法/逻辑问题:
- 接口函数缺少大括号:导出的请求处理函数为箭头函数,但未用大括号包裹函数体,属于语法错误,会导致执行逻辑异常,修正如下:
export default async(req, res) => { // 原有的所有函数内容放在大括号内 if (req.method === "POST") { const requestBuffer = await buffer(req); const payload = requestBuffer.toString(); const sig = req.headers["stripe-signature"]; let event; try { event = stripe.webhooks.constructEvent(payload, sig, endpointSecret); } catch (err) { console.log("Error", err.message); return res.status(400).send(`Webhook error: ${err.message}`); } if (event.type === "checkout.session.completed") { const session = event.data.object; return fulfillOrder(session) .then(() => res.status(200).end()) .catch((err) => res.status(400).send(`Webhook Error: ${err.message}`)); } } res.status(405).end('Method Not Allowed'); }
- 服务器时间戳调用错误:
admin.firestore().FieldValue.serverTimestamp()写法错误,FieldValue是firebase-admin.firestore的静态属性,不可通过Firestore实例调用,修正为:
timestamp: admin.firestore.FieldValue.serverTimestamp()
- 响应未闭合:订单处理完成后仅调用
res.status(200)未结束响应,会导致Stripe收不到成功回执,判定webhook执行失败,需要追加.end()或.send()。 - 空值异常未兜底:
- 无运费的订单中
session.total_details.amount_shipping为undefined,直接运算会报错,可改为(session.total_details?.amount_shipping ?? 0) / 100 - 若创建Stripe会话时未传入email、images到metadata,读取对应字段会报错,建议写入前先判断字段是否存在。
- 无运费的订单中
修正后的fulfillOrder参考:
const fulfillOrder = async(session) => { console.log("FULFILL ORDER", session); // 先校验必填metadata是否存在 if (!session.metadata?.email || !session.metadata?.images) { throw new Error('缺少必要的订单元数据'); } return app .firestore() .collection("user") .doc(session.metadata.email) .collection("orders") .doc(session.id) .set({ amount: session.amount_total / 100, amount_shipping: (session.total_details?.amount_shipping ?? 0) / 100, images: JSON.parse(session.metadata.images), timestamp: admin.firestore.FieldValue.serverTimestamp(), }) .then(() => { console.log(`SUCCESS: Order ${session.id} had been added to the DB `); }) };
配置类问题排查
如果修正代码后仍然写入失败,按以下顺序排查:
- 确认Stripe webhook后台已勾选
checkout.session.completed事件,配置的端点地址与部署的接口地址完全一致,签名密钥和代码读取的STRIPE_SIGNING_SECRET完全匹配。 - 确认
permissions.json对应的service account账号拥有Firestore写入权限,可到Google Cloud IAM控制台确认账号已配置Cloud Datastore User角色。 - 确认部署环境的所有环境变量配置正确,
permissions.json文件路径准确,部署时已正常打包到运行环境。 - 本地可使用Stripe CLI触发测试事件排查具体错误,执行命令
stripe listen --forward-to 本地接口地址后触发测试支付,查看控制台打印的错误日志即可定位问题。
内容的提问来源于stack exchange,提问作者Angelo Convertini
相关产品推荐
相关产品推荐

