英文:
How to handle multiple subscriptions in signle checkout? How to handle stripe webhook event?
问题
以下是翻译好的部分:
"For context I'm implementing the same billing interval subscriptions in one checkout"
"为了解释背景,我正在一个结账中实施相同的计费间隔订阅。"
"As far as I've understood, I've added multiple line_items
with their price_ids and quantity and all checkout is working fine."
"据我所了解,我已添加了多个具有其价格ID和数量的line_items
,并且所有的结账都正常工作。"
"But I'm not able to handle the webhook events for this kinda multiple subscriptions checkout."
"但我无法处理此类多个订阅结账的Webhook事件。"
"When we do single subscription checkout we get the subscription data in checkout.session.complete event object."
"当我们进行单个订阅结账时,我们在checkout.session.complete事件对象中获取订阅数据。"
"How can we get all the subscriptions data from this object. So that for all subscriptions we can loop through this array and create a record in our 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
英文:
For context I'm implementing the same billing interval subscriptions in one checkout
As far as I've understood, I've added multiple line_items
with their price_ids and quantity and all checkout is working fine.
But I'm not able to handle the webhook events for this kinda multiple subscriptions checkout.
When we do single subscription checkout we get the subscription data in checkout.session.complete event object.
How can we get the all the subscriptions data from this object. So that for all subscriotions we can loop through this array and create a record in our 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
得分: 0
一个 subscription
模式的 CheckoutSession 只能创建一个订阅,无法使用一个 CheckoutSession 创建多个订阅。
英文:
One subscription
mode CheckoutSession can only create one subscription, there's no way to create multiple subscriptions with one CheckoutSession.
答案2
得分: 0
当事件为 'invoice.payment.succeeded' 时,
输出 "invoice.payment.succeeded\n",
仅当事件数据对象中存在订阅信息时继续执行。
使用以下代码检索Stripe订阅信息:`stripe_subscriptions = Stripe::Subscription.retrieve(event.data.object.subscription)`
获取订阅项目数据:`subscriptions_items = stripe_subscriptions.items.data`
# 查找与Stripe订阅相关联的所有订阅
遍历每个订阅项目:
```
subscriptions_items.each do |subscription_item|
subscription = Subscription.find_by(subscription_item_id: subscription_item.id)
subscription.update(
status: stripe_subscriptions.status,
current_period_start: Time.at(stripe_subscriptions.current_period_start).to_datetime,
current_period_end: Time.at(stripe_subscriptions.current_period_end).to_datetime,
interval: subscription_item.price.recurring.interval
)
end
```
英文:
when 'invoice.payment.succeeded'
puts "invoice.payment.succeeded\n"
return unless event.data.object.subscription.present?
stripe_subscriptions = Stripe::Subscription.retrieve(event.data.object.subscription)
subscriptions_items = stripe_subscriptions.items.data
# find all the subscriptions associate with the stripe subscription
subscriptions_items.each do |subscription_item|
subscription = Subscription.find_by(subscription_item_id: subscription_item.id)
subscription.update(
status: stripe_subscriptions.status,
current_period_start: Time.at(stripe_subscriptions.current_period_start).to_datetime,
current_period_end: Time.at(stripe_subscriptions.current_period_end).to_datetime,
interval: subscription_item.price.recurring.interval
)
end
Basically we have to listen for the invoice.payment.succeeded
event which returns the object which has included the subscription id. And we can retrieve the subscriptions using following line stripe_subscriptions = Stripe::Subscription.retrieve(event.data.object.subscription)
And we can for_each the each sub-subscription that user has subscribed to and save in our database.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论