You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()。
  • 空值异常未兜底:
    1. 无运费的订单中session.total_details.amount_shipping为undefined,直接运算会报错,可改为(session.total_details?.amount_shipping ?? 0) / 100
    2. 若创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:24:04