Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 条带支付-如何更改订阅计划并立即收费?_C#_Asp.net_Stripe Payments - Fatal编程技术网

C# 条带支付-如何更改订阅计划并立即收费?

C# 条带支付-如何更改订阅计划并立即收费?,c#,asp.net,stripe-payments,C#,Asp.net,Stripe Payments,我正在使用C#在Stripe Payments API中创建订阅。基本上一切都很好,但现在我希望能够允许客户更改订阅(例如升级到更大的计划) 例如,假设客户使用20美元/月的计划,然后在月中升级到50美元/月的计划。然后,我想将客户升级到50美元/月计划,并立即向他们收取25美元,即本月剩余时间按新的更高费率按比例分摊的金额。在未来的几个月里,他们当然会以每月50美元的价格续约 默认情况下,Stripe文档表示,在订阅更改时,不会为更改向客户开具发票或收取费用: 他们的文档表明,如果您想立即向

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

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

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

他们的文档表明,如果您想立即向客户开具发票,则需要生成发票。然而,它没有提供任何关于如何实际做到这一点的信息(至少我能找到)


有人知道如何让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());

首先,一些注释

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

,然后链接如何生成@stuartd感谢您的快速回复。共享的即将发布的发票链接将返回发票的预览。您实际上如何对发票收费而不是生成预览?请参阅:(示例是Python,但它仍然与C#相关),然后链接如何生成@stuartd感谢您的快速回复。共享的即将发布的发票链接将返回发票的预览。您如何实际收取发票费用而不是生成预览?请参阅:(示例是Python,但它仍然与C#相关)谢谢@StuartLC,非常感谢。所以只是为了合作