如何在Firebase云函数中创建Stripe PaymentIntent端点并解决iOS端报错
问题排查与修复方案
初始崩溃问题原因
- 你定义的
BackendUrl是Firebase项目控制台的页面地址,并非云函数的API调用地址,拼接create-payment-intent后生成的URL无效,强制解包URL(string:)返回的nil值就会触发崩溃 - 你现有的云函数只有Firestore触发、用户身份认证触发的逻辑,没有提供
/create-payment-intent对应的HTTP触发接口,iOS端调用的目标端点根本不存在
具体修复步骤
步骤1:新增PaymentIntent HTTP云函数
在你的index.js中添加如下HTTP触发的云函数,用来生成PaymentIntent并返回客户端所需参数:
exports.createPaymentIntent = functions.https.onRequest(async (req, res) => { // 配置跨域允许iOS端调用 res.set('Access-Control-Allow-Origin', '*'); res.set('Access-Control-Allow-Methods', 'POST'); res.set('Access-Control-Allow-Headers', 'Content-Type'); if (req.method === 'OPTIONS') { return res.status(204).send(''); } try { const { amount, currency } = req.body; // 生成PaymentIntent,金额单位为最小货币单位(如美元对应美分) const paymentIntent = await stripe.paymentIntents.create({ amount: amount, currency: currency || 'usd', automatic_payment_methods: { enabled: true }, }); res.json({ clientSecret: paymentIntent.client_secret, publishableKey: '你的Stripe公钥(pk_test_开头的字符串)' }); } catch (error) { res.status(500).json({ error: error.message }); } });
代码编写完成后重新部署云函数,部署后可在Firebase控制台云函数页面拿到该函数的调用地址,格式为https://<部署区域>-<你的项目ID>.cloudfunctions.net/createPaymentIntent
步骤2:修改iOS端配置
将原有的BackendUrl替换为上述拿到的云函数根地址:
let BackendUrl = "https://<部署区域>-<你的项目ID>.cloudfunctions.net/"
同时调整startCheckout方法的请求参数,传入合法金额:
let json: [String: Any] = [ "currency": "usd", "amount": 1000 // 对应10美元 ]
以上修改完成后初始的强制解包崩溃就会消失。
步骤3:修复新增的401报错
你补充的MyAPIClient逻辑存在错误:Stripe的ephemeral_keys接口必须在服务端调用,需要携带你的Stripe密钥,直接从iOS端请求该接口没有认证信息,所以会返回401错误。
你需要新增对应云函数提供临时密钥接口,修改MyAPIClient的baseURL为你自己的云函数地址,调用自有后端接口获取ephemeral key即可。
内容的提问来源于stack exchange,提问作者askit
相关产品推荐
相关产品推荐

