分条付款-如何更改订阅计划并立即收费?

时间:2019-12-29 01:38:41

标签: c# asp.net stripe-payments

我正在使用C#在Stripe Payments API中创建订阅。一切基本都不错,但现在我希望能够允许客户更改订阅(例如升级到更大的套餐)。

例如,假设客户采用每月20美元的计划,然后在该月中旬升级到每月50美元的计划。然后,我想将客户升级到$ 50 / month计划,并立即向他们收取$ 25,即本月剩余时间按新的更高费率按比例分配的金额。当然,在未来的几个月中,它们将以每月50美元的价格续订。

默认情况下,Stripe文档说,在订阅更改时,它不为更改开票或向客户收费:

https://stripe.com/docs/billing/subscriptions/upgrading-downgrading

他们的文档说,如果您想立即开票给客户,则需要生成一张发票。但是,它没有提供有关如何实际执行此操作的任何信息(至少,我可以找到)。

有人知道Stripe如何针对C#的差异收取费用吗?任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:2)

首先,一些注意事项

  • Subscription Update API上的Prorate标志确定在当前结算期是否向客户按比例收取额外费用。
  • 但是,一旦为客户运行了订阅,账单日期和期限便是固定的,因此默认情况下,Stripe不会为客户实际为 升级的订阅,直到下一个结算日期。
  • 请注意,Stripe使用ProrationDate到秒,因此,如果您向客户显示更改的“预览”,则实际收费可能会在执行时有所不同。另请注意,ProrationDate不能在订阅开始之前,因此请注意试图减少ProrationDate的时间(例如,如果客户在购买的同一天更改了订阅)。最好是记住预览中使用的时间戳。
  • Stripe已具有用于在中期更改订阅的计算,即,将旧订阅的未使用时间记入客户贷方,新订阅中的按比例记入借方费用的客户记入借方。

第1步

UpcomingInvoice API与 NEW 订阅信息一起使用,以查看新旧订阅之间的价格差异,例如:

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是您希望在用户界面上显示为“到期”的金额。

第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());