Firebase云函数使用Stripe测试密钥却创建正式环境支付会话的问题求助
Firebase云函数使用Stripe测试密钥却创建正式环境支付会话的问题求助
我现在卡在这里好几天了,实在搞不懂哪里出问题,想请大家帮忙排查下:
我用单页HTML前端+Firebase云函数(处理Stripe支付)做了个简单的订单表单,但后端函数明明配置的是Stripe测试密钥,却总是创建正式环境的Checkout Session,导致前端直接报错:
stripe.redirectToCheckout: the provided sessionId is for a live mode Checkout Session, whereas Stripe.js was initialized with a test mode publishable key
我就纳闷了,部署后的云函数为啥会无视我设置的测试密钥?难道Google Cloud或者Firebase有什么项目级的隐藏设置,能强制函数切换到正式环境吗?
我的前端配置(index.html)
前端是单HTML文件,用Stripe.js初始化的绝对是测试发布密钥:
const STRIPE_PUBLISHABLE_KEY = 'pk_test_...'; // 这里是我真实的测试密钥 const stripe = Stripe(STRIPE_PUBLISHABLE_KEY); // 用户点击"Proceed to Payment"时调用云函数 async function handlePayment() { const createStripeCheckout = firebase.functions().httpsCallable('createStripeCheckout'); const response = await createStripeCheckout({ lineItems, orderIds }); // 后续跳转逻辑... }
我的后端配置(index.js - GCFv2)
云函数用Firebase Secret来安全存储Stripe测试密钥,代码逻辑就是创建测试环境的Checkout Session:
const { onCall } = require("firebase-functions/v2/https"); const { initializeApp } = require("firebase-admin/app"); const { defineString } = require("firebase-functions/params"); const stripe = require("stripe"); initializeApp(); // 安全定义Stripe密钥参数 const stripeSecret = defineString("STRIPE_SECRET"); exports.createStripeCheckout = onCall({ cors: true }, async (request) => { // ...(身份验证检查逻辑) const stripeClient = new stripe(stripeSecret.value()); const session = await stripeClient.checkout.sessions.create({ // Session的具体配置细节 }); return { sessionId: session.id }; });
我已经试过的排查手段
- 反复核对密钥:前端的测试发布密钥、Firebase Secret里存的测试密钥,我翻来覆去检查了N遍,都是
pk_test_和sk_test_开头的,绝对没和正式密钥搞混。 - 确认Secret设置正确:用
firebase functions:secrets:set STRIPE_SECRET成功设置了测试密钥,也用firebase functions:secrets:get验证过,确实是我要的测试密钥。 - 强制清除缓存+重部署:一开始以为是服务器缓存的锅,我直接把云函数删掉(
firebase functions:delete createStripeCheckout),然后重新部署了好几次,结果问题还是一模一样。 - 硬编码密钥测试:最后我破罐子破摔,把
sk_test_...直接写进了index.js里,重新部署后居然正常创建测试环境的Session了!但只要用Firebase Secret的方式就不行。
有没有大佬遇到过类似的问题?或者知道Firebase/Google Cloud里有没有什么我没注意到的设置,会覆盖我配置的密钥环境?
内容来源于stack exchange
相关产品推荐
相关产品推荐

