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

部署Firebase云函数(Stripe支付意图)遇故障求助

Firebase云函数部署失败排查(Stripe支付意图处理)

问题现象

  • 本地通过模拟器和firebase serve运行函数完全正常,但部署到线上时失败
  • 最初遇到CORS跨域错误,配置CORS后出现部署错误:Function failed on loading user code. This is likely due to a bug in the user code

可能的原因及解决步骤

1. Stripe密钥硬编码问题

代码中直接写死sk_test不符合云函数部署规范,敏感信息需通过环境变量传递,硬编码会触发代码加载异常,同时存在安全风险。

  • 解决:
    • 本地执行命令:firebase functions:config:set stripe.secret="你的真实Stripe测试密钥"
    • 代码中替换密钥引用为:const stripe = require("stripe")(functions.config().stripe.secret);

2. CORS配置不匹配请求方法

当前仅允许GET方法,但支付意图请求实际为POST,配置不匹配会导致逻辑异常,进而影响部署。

  • 解决:将Access-Control-Allow-Methods改为GET, POST, OPTIONS,覆盖实际使用的请求方法

3. OPTIONS请求未终止后续逻辑

处理OPTIONS请求后没有终止函数执行,后续代码会继续运行引发错误。

  • 解决:在res.status(204).send("");后添加return;,终止函数流程

修改后的完整代码

const functions = require("firebase-functions");

// 从Firebase环境变量获取Stripe密钥
const stripe = require("stripe")(functions.config().stripe.secret);

exports.stripePaymentIntentRequest = functions.https.onRequest(
  async (req, res) => {
    // 设置CORS头部,允许所有来源
    res.set("Access-Control-Allow-Origin", "*");

    if (req.method === "OPTIONS") {
      // 处理OPTIONS预检请求
      res.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
      res.set("Access-Control-Allow-Headers", "Content-Type");
      res.set("Access-Control-Max-Age", "3600");
      res.status(204).send("");
      // 终止函数,避免后续代码执行
      return;
    }

    try {
      const { codeItem } = req.body;

      // 验证参数合法性,避免计算错误
      if (!codeItem || typeof codeItem.num !== 'number' || typeof codeItem.price !== 'number') {
        return res.send({ success: false, error: "无效的商品参数" });
      }

      const paymentIntent = await stripe.paymentIntents.create({
        amount: Math.round(codeItem.num * codeItem.price * 100), // 确保金额为整数
        currency: "usd",
        automatic_payment_methods: {
          enabled: true,
        },
      });

      res.send({
        paymentIntent: paymentIntent.client_secret,
        success: true,
      });
    } catch (error) {
      res.send({ success: false, error: error.message });
    }
  }
);

内容的提问来源于stack exchange,提问作者jdost_26

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:50:30