要在用户升级时立即向用户收取按比例分配的差价,请在修改用户订阅时使用proration_behavior='always_invoice' 选项。引用文档:
...为了始终立即为按比例开具发票,请传递 always_invoice。
Python 示例:
stripe.Subscription.modify(
subscription_id,
items=[{
'id': item_id,
'plan': plan_id,
}],
# Charge the prorated amount immediately.
proration_behavior='always_invoice',
)
当用户更改为更昂贵的计划时,这会立即按比例向用户收取费用。但是,当用户更改为更便宜的计划时,用户将获得按比例分配的信用额度,从而使用户的下一个账单更便宜。
场景
在这些情况下,假设结算日期是每个月的第一天。进一步假设该月有 30 天。
-
场景 1:用户订阅了 5 美元的月度计划。用户决定在每月 22 日升级到 30 美元的计划。当月还剩 8 天时,5 美元计划的未使用部分约为(8 / 30) * 5 = $1.33,30 美元计划的按比例分配的金额为(8 / 30) * 30 = $8.00。因此用户将立即被收取8.00 - 1.33 = $6.67 的费用。
-
场景 2:用户订阅了 30 美元的月度计划。用户决定在每月 22 日降级到 5 美元的计划。当月还剩 8 天时,30 美元计划的未使用部分约为(8 / 30) * 30 = $8.00,5 美元计划的按比例分配的金额为(8 / 30) * 5 = $1.33。在这种情况下,不会向用户收费,但用户的下一个账单(在下一个账单日期)将减少8.00 - 1.33 = $6.67。
上面的示例计算只是近似值,因为 Stripe 会按比例精确到秒,而不是按天。
旁注
dearsina's answer 是正确的,但至少涉及三个 API 调用,而不是一个。要明确遵循该答案中的步骤,您可以这样做:
# Step 1 in dearsina's answer: Modify the subscription.
modified_subscription = stripe.Subscription.modify(
subscription_id,
items=[{
'id': item_id,
'plan': plan_id,
}],
)
# Steps 2 and 3: Create and retrieve invoice.
invoice = stripe.Invoice.create(customer=modified_subscription.customer)
# Steps 4 and 5: Finalize and pay invoice.
stripe.Invoice.pay(invoice.id)
但是,既然您可以在一个 API 调用中完成所有步骤,为什么还要这样做呢?