reactjs - 从 Stripe 预建结账成功后更新数据库中的用户

标签 reactjs firebase stripe-payments

我正在使用 Stripe 的预建结帐以及 react 和 firebase。结帐过程工作正常并将用户定向到 succes_url,但我也想更新数据库中用户下的字段。我不明白如何包含更新成功结帐后运行的数据库的函数。

export const checkoutWithStripe = async(user) => {
    const checkoutSessionsRef = collection(db, 'users', user.uid, 'checkout_sessions');

    const singleCheckoutSessionRef = await addDoc(checkoutSessionsRef, {
        price: 'price_xyz',
        allow_promotion_codes: true,
        success_url: `${window.location.origin}/dashboard/app?success=true`,
        cancel_url: `${window.location.origin}/dashboard/app?canceled=true`
    });

    onSnapshot(singleCheckoutSessionRef, (snap) => {
        const { error, url: checkoutUrl } = snap.data();

        if (error) {
            console.error(`An checkout error occured: ${error.message}`);
        }
        if (checkoutUrl) {
            window.location.assign(checkoutUrl);
        }
        
    });

    // TODO: Update user type in firebase from free to starter on successful checkout
};

感谢任何帮助。

更新:

我分两部分解决了它。

  1. 在 Stripe 中,我创建了一个新的 webhook,它指向一个导出的 firebase 函数 (2),该函数在触发“checkout.session.completed”时触发。

  2. 在 Firebase 中,我创建了一个函数来监听“checkout.session.completed”事件,然后调用一个函数来根据我从 Stripe 事件中获得的用户电子邮件更新数据库。

这是监听事件的 Firebase 函数:

/**
 * A webhook handler function for the relevant Stripe events.
 */
exports.updateCustomer = functions.https.onRequest((req, resp) => {

    functions.logger.log("updateCustomer body", req);

    const relevantEvents = new Set([
        'checkout.session.completed'
    ]);
    let event;

    // Instead of getting the `Stripe.Event`
    // object directly from `req.body`,
    // use the Stripe webhooks API to make sure
    // this webhook call came from a trusted source
    try {
        event = stripe.webhooks.constructEvent(
            req.rawBody,
            req.headers['stripe-signature'],
            endpointSecret
        );
    } catch (error) {
        functions.logger.log(`Webhook Error: Invalid Secret`);
        resp.status(401).send('Webhook Error: Invalid Secret');
        return;
    }

    functions.logger.log("updateCustomer", event.type);

    if (relevantEvents.has(event.type)) {
        // logs.startWebhookEventProcessing(event.id, event.type);
        try {
            switch (event.type) {
                case 'checkout.session.completed':
                    const session = event.data.object;
                    functions.logger.log("checkout.session.completed:", session);
                    updatePlan(session.customer_details.email);
                    break;
                default:
                    functions.logger.log(`Unhandled event type ${event.type}`);
            }
        } catch (error) {
            functions.logger.log(`Unhandled event error ${event.type}`);
            resp.json({
                error: 'Webhook handler failed. View function logs in Firebase.',
            });
            return;
        }
    }

    // Return a response to Stripe to acknowledge receipt of the event.
    resp.json({ received: true });
});

最佳答案

如果您需要在 Checkout Session 成功时运行一些代码,那么您应该使用 Stripe webhooks 并监听 checkout.session.completed 事件。这包含在 the Stripe documentation 中.

关于reactjs - 从 Stripe 预建结账成功后更新数据库中的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71940264/

相关文章:

javascript - ReactJS 身份验证不起作用,重定向到登录页面失败

javascript - 在 AntD 中更改 form.item 标签字体大小

reactjs - 精确且严格的 Prop 使用

android - Firebase,相同方法中的第二个 push() 不起作用

java - 为什么我的 Java 服务器代码在尝试从 stripe 接收 Webhook 时抛出 502 错误?

javascript - Uncaught ReferenceError : Stripe is not defined - STRIPE ERROR

javascript - 在reactjs中将表单提交的数据与json文件中的数据进行比较

ios - 使用 UpdateChildValues 从 Firebase 中删除

ios - Firebase 实时数据库分页,一次显示 20 条记录

php - Stripe : list all charges with PHP