首先,一些注意事项
- 订阅更新 API 上的
Prorate 标志确定在当前计费周期内是否按比例向客户收取额外费用。
- 但是,一旦为客户运行订阅,计费日期和期间是固定的,因此默认情况下,Stripe 不会实际向客户计费
升级订阅,直到下一个结算日期。
- 请注意,Stripe 使用
ProrationDate 到第二个,因此如果您向客户展示更改的“预览”,实际收费可能会在执行时略有不同。另请注意,ProrationDate 不能在订阅开始之前,因此请注意,例如很想从ProrationDate 中抽出时间(例如,如果客户在购买的同一天更改订阅)。最好记住预览中使用的时间戳。
- Stripe 已经具有更改订阅期中的计算,即将客户在旧订阅中未使用的时间记入贷方,并按比例向客户借记新订阅的时间。
第 1 步
使用带有NEW订阅信息的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 是您希望在 UI 上向客户显示为“现在到期”的金额。
第 2 步
对您的订阅进行更改:
var stripeSubscription = await _stripeSubscriptionService.UpdateAsync(
... subscription id,
new SubscriptionUpdateOptions
{
Prorate = true,
ProrationDate = proRataDate,
CouponId = ...,
Items = ... New subscription items
});
第 3 步
如果您不想等到客户的下一个结算周期,您现在可以向客户收取差价(假设是正数)。可能还有其他方法可以做到这一点,但这似乎可行,即为订阅的差额创建然后使用现有付款方式支付发票。 Stripe 会跟踪订阅的记帐,因此在下一个计费周期开始时不会再次按比例收取费用。
var invoiceOptions = new InvoiceCreateOptions
{
CustomerId = ... customer id,
AutoAdvance = false,
SubscriptionId = ... subscriptionId,
Billing = Billing.ChargeAutomatically
};
var diffInvoice = await _stripeInvoiceService.CreateAsync(invoiceOptions);
// There's an alternative using Invoice Finalization, but this seems quicker
await _stripeInvoiceService.PayAsync(diffInvoice.Id, new InvoicePayOptions());