【问题标题】:Stripe Payments - how to change subscription plan and charge immediately?Stripe Payments - 如何更改订阅计划并立即收费?
【发布时间】:2020-04-18 08:10:26
【问题描述】:

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

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

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

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

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

有谁知道如何让 Stripe 对 C# 中的差异发起收费?对此的任何帮助将不胜感激。

【问题讨论】:

标签: c# asp.net stripe-payments


【解决方案1】:

首先,一些注意事项

  • 订阅更新 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());

【讨论】:

  • 感谢@StuartLC,非常感谢。所以只是为了确认。如果我有订阅 X,并且我使用预览功能来获得按比例支付的金额,然后我立即收取费用 - Stripe 会以某种方式知道在续订时不再收取这笔额外费用吗?我真的想确保最后一部分是“官方支持”的行为,因为我没有在文档中看到这一点,所以有点担心如果它现在有效,它会在未来中断吗?所以没有“标志”来明确告诉条纹这张发票是按比例计算的?
  • 是的 - 事实上,当我们创建发票时,我们甚至不会告诉 Stripe 收取什么费用 - Stripe 会在内部进行计算,然后 Stripe 会立即计算出应付款的金额。如果 pro rate 金额为负数,您可以决定是现在退还客户,还是减少的订阅仅在计费期结束时生效。
猜你喜欢
  • 2017-11-09
  • 2018-12-01
  • 1970-01-01
  • 2020-09-29
  • 2019-01-03
  • 1970-01-01
  • 2023-03-27
  • 2019-06-21
  • 2017-09-27
相关资源
最近更新 更多