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
相关产品推荐
相关产品推荐

