Firebase与Stripe「Run Payment with Stripe」扩展:支付成功触发函数求助
解决方案:一次性支付成功后触发自定义函数
针对你使用「Run Payment with Stripe」扩展实现一次性支付后触发自定义逻辑的需求,这里提供三种可行方案:
方案1:前端监听Checkout会话状态更新
该扩展会在Stripe支付完成后,自动更新Firestore中对应的checkout_sessions文档,添加status字段(支付成功时值为complete)。你可以在创建会话后持续监听该文档的状态变化,触发前端自定义逻辑:
export async function createTenCheckoutSession(uid) { const firestore = firebase.firestore(); const checkoutSessionRef = await firestore .collection("users") .doc(uid) .collection("checkout_sessions") .add({ mode: "payment", price: "price_xxxxxxxxxxxxxxxxxx", success_url: window.location.origin, cancel_url: window.location.origin, }); // 监听会话状态变化 const unsubscribe = checkoutSessionRef.onSnapshot(async (snap) => { const data = snap.data(); if (data.sessionId) { const stripe = await getStripe(); stripe.redirectToCheckout({ sessionId: data.sessionId }); } // 检测支付成功状态 if (data.status === "complete") { // 这里执行你的自定义前端逻辑 console.log("一次性支付成功,触发自定义函数"); // 示例:更新用户UI、发送本地通知等 // 记得取消监听避免内存泄漏 unsubscribe(); } }); };
方案2:用Firebase Cloud Function监听Firestore文档变更
如果需要执行后端逻辑(比如更新用户权限、生成订单记录),可以创建Cloud Function监听checkout_sessions文档的更新事件,当状态变为complete且mode为payment时触发:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); exports.onOneTimePaymentSuccess = functions.firestore .document("users/{uid}/checkout_sessions/{sessionId}") .onUpdate(async (change, context) => { const afterData = change.after.data(); // 确认是一次性支付且已完成 if (afterData.mode === "payment" && afterData.status === "complete") { const uid = context.params.uid; // 执行自定义后端逻辑 await admin.firestore().collection("users").doc(uid).update({ hasPaidOneTime: true, lastPaymentDate: admin.firestore.FieldValue.serverTimestamp() }); functions.logger.log(`用户 ${uid} 一次性支付完成,执行自定义逻辑`); } return null; });
方案3:配置扩展的Stripe Webhook到Cloud Function
「Run Payment with Stripe」扩展会自动配置Stripe Webhook到Firebase,你可以额外添加自定义Webhook事件来触发逻辑:
- 进入Firebase控制台的扩展页面,找到「Run Payment with Stripe」扩展
- 在扩展设置中,找到
Stripe webhook events配置项,添加checkout.session.completed事件 - 创建Cloud Function接收Stripe的Webhook请求:
const functions = require("firebase-functions"); const stripe = require("stripe")(functions.config().stripe.secret_key); const admin = require("firebase-admin"); admin.initializeApp(); exports.handleStripeWebhook = functions.https.onRequest(async (req, res) => { const sig = req.headers["stripe-signature"]; let event; try { event = stripe.webhooks.constructEvent( req.rawBody, sig, functions.config().stripe.webhook_secret ); } catch (err) { return res.status(400).send(`Webhook Error: ${err.message}`); } // 处理一次性支付完成事件 if (event.type === "checkout.session.completed") { const session = event.data.object; // 确认是一次性支付 if (session.mode === "payment") { const uid = session.metadata.firebaseUID; // 需在创建会话时传递用户UID // 执行自定义逻辑 await admin.firestore().collection("users").doc(uid).update({ oneTimePaymentCompleted: true }); } } res.json({ received: true }); });
注意:创建结账会话时需要添加metadata字段传递用户UID:
// 在add的参数中补充 metadata: { firebaseUID: uid }
内容的提问来源于stack exchange,提问作者Christopher Koziol
相关产品推荐
相关产品推荐

