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

Stripe集成Firestore报错需指定customer/issuing_card参数如何解决

问题定位

报错提示要求必须传入customer或issuing_card其中一个参数,本质是你构造PaymentSheet时缺少合法的customer参数:
你iOS端的backendCheckoutUrl配置错误,当前填写的是处理Stripe回调的云函数handleWebhookEvents,该函数只会返回{"received": true},无法返回支付所需的customer、临时密钥、PaymentIntent客户端密钥三个核心参数,导致代码里的JSON解析直接走了失败分支,paymentSheet没有正确初始化。

修复步骤

1. 新增获取支付参数的云函数

在你的index.js里新增https类型云函数,专门用来给iOS端返回支付所需参数:

exports.createPaymentSheetParams = functions.https.onRequest(async (req, res) => {
  // 先验证用户身份
  const idToken = req.headers.authorization?.split('Bearer ')[1];
  if (!idToken) {
    return res.status(401).send('Unauthorized');
  }
  try {
    const decodedToken = await admin.auth().verifyIdToken(idToken);
    const uid = decodedToken.uid;
    // 获取用户关联的Stripe customer ID
    const customerDoc = await admin.firestore().collection('stripe_customers').doc(uid).get();
    const customerId = customerDoc.data().customer_id;
    // 创建临时密钥
    const ephemeralKey = await stripe.ephemeralKeys.create(
      { customer: customerId },
      { apiVersion: '2020-08-27' }
    );
    // 创建PaymentIntent,amount、currency可根据业务从请求参数读取
    const paymentIntent = await stripe.paymentIntents.create({
      amount: 100, // 单位为分,示例为1美元
      currency: 'usd',
      customer: customerId,
    });
    // 返回所需参数给客户端
    res.json({
      customer: customerId,
      ephemeralKey: ephemeralKey.secret,
      paymentIntent: paymentIntent.client_secret
    });
  } catch (err) {
    console.error(err);
    res.status(500).send(err.message);
  }
});

2. 修改iOS端配置

替换CheckoutViewController中的后端地址,同时请求时带上用户的Firebase ID token:

// 替换为新部署的createPaymentSheetParams云函数地址
let backendCheckoutUrl = URL(string: "你的新云函数地址")!
// 构造请求时添加身份校验头
var request = URLRequest(url: backendCheckoutUrl)
request.httpMethod = "POST"
// 新增:获取当前登录用户的ID token并加入请求头
if let currentUser = Auth.auth().currentUser {
    currentUser.getIDToken { idToken, error in
        guard let idToken = idToken, error == nil else { return }
        request.setValue("Bearer \(idToken)", forHTTPHeaderField: "Authorization")
        // 后续原来的URLSession请求逻辑放在这里执行
    }
}

3. 重新部署云函数

在终端运行firebase deploy --only functions完成新云函数的部署。

其他说明

如果你想用原来的Firestore触发逻辑createStripePayment,也可以选择iOS端先向stripe_customers/{userId}/payments集合写入amount和currency字段,监听云函数写入PaymentIntent数据后,再读取对应参数构造PaymentSheet即可,两种方案二选一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:15:03