首先,一些注释
- 订阅更新API上的Prorate标志确定客户在当前计费周期内是否按比例收取额外费用。
- 然而,一旦订阅为客户运行,计费日期和周期就被固定了。因此,默认情况下,Stripe实际上不会在下一个计费日期之前向客户收取升级后的订阅费用。
- 请注意,Stripe到秒使用ProrationDate,因此如果您向客户显示更改的“预览”,则实际收费可能会有所不同,直到实际执行。还要注意,ProrationDate不能早于订阅开始,因此如果您诱惑去掉ProrationDate的时间(例如,如果客户在购买当天更改订阅),请小心。最好记住预览中使用的时间戳。
- Stripe已经对更改订阅期间进行了计算,即为旧订阅未使用时间向客户记入贷方,并为新订阅按比例计费向客户记入借方。
第1步
使用UpcomingInvoice
API和新订阅信息一起查看旧订阅与新订阅之间的价格差异,如下所示:
var proRataDate = DateTime.UtcNow; // Or use your clock abstraction
var proRata = new UpcomingInvoiceOptions
{
CustomerId = ...,
SubscriptionId = ...,
SubscriptionItems = ... upgraded InvoiceSubscriptionItemOptions,
SubscriptionProrationDate = proRataDate,
CouponId = ...
};
var upcomingInvoice = await _stripeInvoiceService.UpcomingAsync(proRata);
// Note that UpcomingAsync might return the next full month's bill as well.
var proRataCents = upcomingInvoice.Lines
.Where(l => l.Period.Start?.Date == proRataDate.Date)
.Sum(l => l.Amount);
proRataCents
是要在用户界面上显示为“应付款项”的金额。
第二步:
对您的订阅进行更改:
var stripeSubscription = await _stripeSubscriptionService.UpdateAsync(
... subscription id,
new SubscriptionUpdateOptions
{
Prorate = true,
ProrationDate = proRataDate,
CouponId = ...,
Items = ... New subscription items
});
第三步
如果您不想等到下一个客户账单周期,您可以立即向客户收取差额费用(假设是正数)。可能还有其他的方法来实现这一点,但是这种方式似乎是可行的,即创建并支付一个发票,使用现有的付款方式,以补足订阅差额。Stripe会跟踪订阅的会计,因此按比例收取的费用在下一个计费周期开始时不会再次收取。
var invoiceOptions = new InvoiceCreateOptions
{
CustomerId = ... customer id,
AutoAdvance = false,
SubscriptionId = ... subscriptionId,
Billing = Billing.ChargeAutomatically
};
var diffInvoice = await _stripeInvoiceService.CreateAsync(invoiceOptions);
await _stripeInvoiceService.PayAsync(diffInvoice.Id, new InvoicePayOptions());