You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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事件来触发逻辑:

  1. 进入Firebase控制台的扩展页面,找到「Run Payment with Stripe」扩展
  2. 在扩展设置中,找到Stripe webhook events配置项,添加checkout.session.completed事件
  3. 创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:46:17