Techioz Blog

1 回のチェックアウトで複数のサブスクリプションを処理するにはどうすればよいですか?ストライプ Webhook イベントを処理するにはどうすればよいですか?

概要

コンテキストとして、1 回のチェックアウトで同じ請求間隔のサブスクリプションを実装しています。

私が理解している限り、複数の line_items をprice_idと数量とともに追加しましたが、すべてのチェックアウトは正常に機能しています。 しかし、このような複数のサブスクリプションのチェックアウトの Webhook イベントを処理することはできません。

単一のサブスクリプション チェックアウトを行うと、checkout.session.complete イベント オブジェクトでサブスクリプション データを取得します。

このオブジェクトからすべてのサブスクリプション データを取得するにはどうすればよいですか。すべてのサブスクリプションについて、この配列をループして DB にレコードを作成できるようにします。


def handle_checkout_session_completed(event)
  puts "checkout.session.completed\n"
  return unless User.exists?(event.data.object.client_reference_id)

  checkout_session = event.data.object
  puts "checkout_session: #{checkout_session}\n"

  session = Stripe::Checkout::Session.retrieve({
    id: checkout_session['id'],
    expand: ['line_items']
  })

  line_items = session.line_items.data
  puts line_items

  if checkout_session.payment_status == 'paid'
    fulfill_order(checkout_session, line_items)
  end
end

def fulfill_order(checkout_session, line_items)
  user = User.find(checkout_session.client_reference_id)
  user.update(stripe_id: checkout_session.customer)

  line_items.each do |line_item|
    product_id = line_item.price.product
    tool_id = determine_tool_id(product_id)

    Subscription.create(
      user: user,
      subscription_id: checkout_session.subscription,
      plan_id: tool_id,
      interval: line_item.price.recurring.interval,
      status: 'active',
      current_period_start: Time.at(checkout_session.subscription.current_period_start).to_datetime,
      current_period_end: Time.at(checkout_session.subscription.current_period_end).to_datetime
    )
  end
end

解決策

1 つのサブスクリプション モード CheckoutSession は 1 つのサブスクリプションのみを作成できます。1 つの CheckoutSession で複数のサブスクリプションを作成する方法はありません。