Stripe支付 - 如何更改订阅计划并立即收费?

4
我正在使用C#创建Stripe支付API的订阅。基础知识都很好,但现在我想允许客户更改订阅(例如升级到更大的计划)。例如,假设客户正在使用每月$20的计划,然后在月中升级到每月$50的计划。然后,我想将客户升级到每月$50的计划,并立即向他们收取$25的费用,这是以新的更高费率计算的当前月份剩余时间的比例金额。当然,在未来的月份,他们会按每月$50续订。默认情况下,Stripe文档指出,在订阅更改时,它不会向客户发送发票或收费:

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

他们的文档说,如果您想立即向客户开具发票,需要生成发票。然而,在如何实际操作方面,文档没有提供任何信息(至少我找不到)。 有人知道如何在C#中让Stripe发起差额收费吗?非常感谢任何帮助。

1
这不是按照文档中所述的比例计算吗?(https://stripe.com/docs/billing/subscriptions/prorations#previewing-proration),然后链接了如何生成“即将到来的发票”?(https://stripe.com/docs/api/invoices/upcoming) - stuartd
@stuartd 感谢您的快速回复。您分享的即将到来的发票链接返回了一个发票预览。如何实际收取该发票而不是生成预览? - A X
请参见:https://dev59.com/1lcP5IYBdhLWcg3wcZYj#60225670 (示例是用Python编写的,但对于C#仍然相关) - Flux
1个回答

4

首先,一些注释

  • 订阅更新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);
// There's an alternative using Invoice Finalization, but this seems quicker
await _stripeInvoiceService.PayAsync(diffInvoice.Id, new InvoicePayOptions());

感谢@StuartLC,非常感激。所以只是确认一下。如果我有一个订阅X,并使用预览功能获取比例金额,然后立即收取此金额-Stripe将以某种方式知道不要在续订时再次收取此额外金额?我真的希望确保这最后一部分是“官方支持”的行为,因为我没有在文档中看到这一点,所以有点担心如果现在可以工作,将来会出现问题。所以没有“标志”明确告诉条纹这张发票是用于比例金额的吗? - A X
是的 - 实际上,我们甚至不会在创建发票时告诉Stripe要收取多少费用 - Stripe会在内部计算出来,然后确定现在应该支付多少费用。如果按比例计算的金额为负数,则您可以决定立即退款给客户,或者减少的订阅仅在计费周期结束时生效。 - StuartLC
@AX 我相信这只适用于在现有订阅内更改定价,而不是从一个订阅更改到另一个订阅。当您这样做时,似乎必须取消现有的订阅,并创建一个新的订阅并将用户移动到该订阅。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接