SvelteKit Stripe webhook 处理程序未完成 Supabase 操作 - 如何确保执行? (托管在 Cloudflare)

问题描述 投票:0回答:1

我在 SvelteKit 项目中遇到了 Stripe webhook 处理程序的问题。该处理程序处理结账会话,并应将客户 ID 存储在 Supabase 中,但该操作似乎在完成之前就被终止了。这是相关代码:

export const storeStripeCustomerId = async (session: Stripe.Checkout.Session) => {
    let customerId: string = '';
    if (typeof session.customer === 'string') {
        customerId = session.customer;
    } else if (session.customer !== null) {
        customerId = session.customer.id;
    }
    console.log("Storing Stripe customer ID", customerId, "for session", session.id);
    if (customerId) {
        // This being logged
        console.log("session.client_reference_id", session.client_reference_id);
        const {error} = await SUPABASE_SERVICE_ROLE.schema('stripe').from('user_id_table').upsert({
            id: session.client_reference_id,
            stripe_customerid: customerId,
            stripe_email: session.customer_details?.email
        });
    

        // This is not logged anymore
        console.log("Test");
        console.log(error);
        handleEntitlement(customerId);
        if (error) {
            console.error(error);
            errorReturn(400, "Supabase: " + error.message);
        }
    }
}
// /api/stripe/webhook
...
case 'checkout.session.completed': {
    const session: Stripe.Checkout.Session = event.data.object
    storeStripeCustomerId(session);
    break;
}

问题是Supabase

upsert
操作后的日志没有出现,提示函数执行被切断。但是,我等不及了,因为我需要向 Stripe 发送快速回复。

我已验证 Supabase 的环境变量是否正确,并且 webhook 本身工作正常(由 stripe 调用)。即使主处理程序已经响应,如何确保

storeStripeCustomerId
函数完成执行? 附加背景:

  • 这是一个 SvelteKit 项目
  • 我使用 Supabase 作为我的数据库
  • webhook 需要快速响应 Stripe
  • 这托管在 Cloudflare 上
  • 本地一切正常

任何有关如何在 SvelteKit 上下文中正确处理此异步操作的建议将不胜感激。

async-await stripe-payments cloudflare sveltekit supabase
1个回答
0
投票

我无法谈论 Supabase upsert 的问题,但就这一点而言:

但是,我等不及了,因为我需要向 Stripe 发送快速回复。

您应该:

  1. 首先响应 Stripe webhook 传送请求 然后执行较慢的处理,或者
  2. 将事件放入队列而不进行处理,响应 Stripe 传送请求,然后异步处理该队列。

注意条纹文档说:

您的端点必须在任何可能导致超时的复杂逻辑之前快速返回成功状态代码 (2xx)。例如,在更新会计系统中已付款的客户发票之前,您必须返回 200 响应。

© www.soinside.com 2019 - 2024. All rights reserved.