c# - Stripe Payments - 如何更改订阅计划并立即收费?
问题描述
我正在使用 C# 在 Stripe Payments API 中创建订阅。一切都很好,但现在我希望能够允许客户更改订阅(例如升级到更大的计划)。
例如,假设客户使用 20 美元/月的计划,然后在月中升级到 50 美元/月的计划。然后我想将客户升级到每月 50 美元的计划,并立即向他们收取 25 美元,即当月剩余时间以新的更高费率按比例分配的金额。对于未来的几个月,他们当然会以每月 50 美元的价格续订。
默认情况下,Stripe 文档说它不会在订阅更改时向客户开具发票或向客户收费:
https://stripe.com/docs/billing/subscriptions/upgrading-downgrading
他们的文档说,如果您想立即为客户开具发票,则需要生成发票。但是,它没有提供有关如何实际执行此操作的任何信息(至少,我可以找到)。
有谁知道如何让 Stripe 对 C# 的差异发起收费?对此的任何帮助将不胜感激。
解决方案
首先,一些注意事项
- 订阅更新 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
是您希望在 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());
推荐阅读
- .net - 在 Xamarin shell 中创建嵌套导航
- android - 在flutter(androidstudio)中运行iOS代码时出现问题
- python - 从 BigQuery 查询到 Jupyter 时出现“'NotebookFormatter' 对象没有属性 'get_result'”错误?
- python - 我的代码意外删除了 Discord.py 音乐机器人中的“song.mp3”文件
- unity3d - 尝试在统一 2d 中移动对象
- javascript - react 不会根据状态更新本地存储值
- clang - 一维循环上的多面体优化
- java - 构建期间未找到符号
- python - 为什么类 __dict__ 和 __weakref__ 从未在 Python 中重新定义?
- ios - SwiftUI - 在包含 .toolbar 的最小项目中呈现 .sheet 时崩溃