1

我使用 next.js 和 Stripe webhooks 将结帐会话插入到 Supabase,这将创建客户的订单历史记录。我能够将有关整个订单的信息写入名为“orders”的表中,但我想知道将每个结帐会话中的单个项目添加到另一个名为“order_items”的表中的最佳方法是什么。这样我就可以映射主订单,然后是子项目。感谢提供的任何帮助。这是我获得与客户相关的订单的内容:

const upsertOrderRecord = async (session: Stripe.Checkout.Session, customerId: string) => {
  const { data: customerData, error: noCustomerError } = await supabaseAdmin
    .from<Customer>('customers')
    .select('id')
    .eq('stripe_customer_id', customerId)
    .single();
  if (noCustomerError) throw noCustomerError;

  const { id: uuid } = customerData || {};
    const sessionData: Session = {
      id: session.id,
      amount_total: session.amount_total ?? undefined,
      user_id: uuid ?? undefined
    };

    const { error } = await supabaseAdmin.from<Session>('orders').insert([sessionData], { upsert: true });
    if (error) throw error;
    console.log(`Product inserted/updated: ${session.id}`);
  };
4

1 回答 1

1

Checkout Session 对象包含一个line_items字段,该字段是包含在购买中的每个项目的列表。

但是,此字段默认包含在对象中,因此不会成为您的 webhook 有效负载的一部分。相反,您需要在 webhook 句柄中进行 API 调用以检索Checkout Session 对象,并传递expand参数以包含该line_items字段:

const session = await stripe.checkout.sessions.retrieve('cs_test_xxx', {
  expand: ['line_items']
});
于 2022-02-16T09:41:24.277 回答