如何在Flutter中通过Firebase Stripe扩展创建产品(客户端/云函数)
通过Flutter客户端或Cloud Functions创建Stripe产品并同步到Firestore
一、Flutter客户端实现
注意:客户端直接调用Stripe API需使用受限的Stripe API密钥(仅开放产品/价格创建权限),避免泄露完整密钥带来风险。
- 添加依赖
在pubspec.yaml中引入所需包:
dependencies: flutter: sdk: flutter stripe_sdk: ^1.1.0 cloud_firestore: ^4.14.0
- 初始化工具类
import 'package:stripe_sdk/stripe_sdk.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; final stripe = StripeApi('你的受限Stripe API密钥'); final firestore = FirebaseFirestore.instance;
- 产品创建与同步逻辑
Future<void> createProductAndSync({ required String name, required String description, required int priceAmount, // 单位:分,如100代表1美元 required String currency, }) async { // 1. 在Stripe创建产品 final productResp = await stripe.post('/v1/products', body: { 'name': name, 'description': description, 'type': 'service', // 按活动类型调整,可选service/good }); // 2. 创建对应价格项 final priceResp = await stripe.post('/v1/prices', body: { 'product': productResp['id'], 'unit_amount': priceAmount, 'currency': currency, 'recurring': {'interval': 'once'}, // 活动多为一次性支付,按需修改 }); // 3. 同步数据到Firestore await firestore.collection('products').doc(productResp['id']).set({ 'stripeProductId': productResp['id'], 'name': productResp['name'], 'description': productResp['description'], 'stripePriceId': priceResp['id'], 'price': priceAmount / 100, // 转换为常规货币单位存储 'currency': currency, 'createdAt': Timestamp.now(), }); }
二、Cloud Functions实现(更安全推荐)
客户端直接调用API存在密钥泄露风险,优先用Cloud Functions做中间层,密钥仅在服务器端存储。
- 初始化Cloud Functions项目
确保已安装Firebase CLI,在项目根目录执行:
firebase init functions
- 安装Stripe依赖
进入functions目录:
npm install stripe
- 编写云函数代码
const functions = require("firebase-functions"); const admin = require("firebase-admin"); const stripe = require("stripe")("你的Stripe秘钥"); admin.initializeApp(); const firestore = admin.firestore(); exports.createStripeProduct = functions.https.onCall(async (data, context) => { // 可选:验证用户权限,仅允许管理员创建产品 if (!context.auth || !context.auth.token.admin) { throw new functions.https.HttpsError('permission-denied', '仅管理员可创建产品'); } const { name, description, priceAmount, currency } = data; try { // 创建Stripe产品 const product = await stripe.products.create({ name: name, description: description, type: 'service', }); // 创建价格项 const price = await stripe.prices.create({ product: product.id, unit_amount: priceAmount, currency: currency, recurring: { interval: 'once' }, }); // 同步到Firestore await firestore.collection('products').doc(product.id).set({ stripeProductId: product.id, name: product.name, description: product.description, stripePriceId: price.id, price: priceAmount / 100, currency: currency, createdAt: admin.firestore.FieldValue.serverTimestamp(), }); return { success: true, productId: product.id }; } catch (error) { throw new functions.https.HttpsError('internal', error.message); } });
- 部署云函数
firebase deploy --only functions
- Flutter客户端调用云函数
import 'package:cloud_functions/cloud_functions.dart'; final functions = FirebaseFunctions.instance; Future<void> callCreateProductFunc({ required String name, required String description, required int priceAmount, required String currency, }) async { try { final result = await functions.httpsCallable('createStripeProduct').call({ 'name': name, 'description': description, 'priceAmount': priceAmount, 'currency': currency, }); print('产品创建成功:${result.data}'); } catch (e) { print('创建失败:$e'); } }
注意事项
- 安全层面:客户端方式必须用受限密钥,严格限制API权限;优先选择Cloud Functions方案,彻底避免密钥暴露。
- 数据一致性:若Stripe创建成功但Firestore同步失败,可添加重试机制,或通过Stripe Webhook监听产品创建事件,再触发同步逻辑。
- 字段扩展:可根据活动管理需求,在Firestore文档中添加活动时间、名额限制等自定义字段。
内容的提问来源于stack exchange,提问作者Seonaidh Morrison
相关产品推荐
相关产品推荐

