Stripe payments 订阅更改立即收费

Stripe payments 订阅更改立即收费,stripe-payments,Stripe Payments,我们正在对客户的订阅使用条带支付处理。当用户改变计划时,我们希望他们立即按比例收取费用。当计划具有不同的计费间隔时,Stripe会自动执行此操作,但当在具有相同间隔的计划之间进行更改时,Stripe会将付款延迟到下一个计费周期 我们现在处理这个问题的方法是在更新订阅后创建一个发票,但是如果账单失败,我们需要执行回滚 stripe.subscriptions.update(/* change plan */); if (plans_have_different_billing_intervals)

我们正在对客户的订阅使用条带支付处理。当用户改变计划时,我们希望他们立即按比例收取费用。当计划具有不同的计费间隔时,Stripe会自动执行此操作,但当在具有相同间隔的计划之间进行更改时,Stripe会将付款延迟到下一个计费周期

我们现在处理这个问题的方法是在更新订阅后创建一个发票,但是如果账单失败,我们需要执行回滚

stripe.subscriptions.update(/* change plan */);
if (plans_have_different_billing_intervals) {
  try {
    stripe.invoices.create(/* for all pending charges */);
  } catch (err) {
    /* rollback subscription to old plan */
  }
}
总的来说,这感觉是错误和复杂的。是否有一种更简单/更干净的方法来实现这一点,我们没有看到?

您可以在Stripe中使用。创建发票后,您可以立即对发票收费(立即开具发票)。如果发票付款失败,您可以使用webhook回滚到旧帐户


有关条带订阅的更多信息,请参阅本指南:

要为数量或订阅计划的更改付款,您需要执行以下操作:

  • 随着新的变化
  • 。 让我感到困惑的是,Stripe神奇地知道只为更新的订阅项目开具发票,而不为即将到来的计费周期项目开具发票

  • 这假设您的客户存储了付款方式
  • 只有在完成所有步骤后,您才能成功地对订阅更改收费(并且仅对更改收费)。你可以一次完成所有的工作。客户应在发票末尾收到Stripe的发票电子邮件

    正如OP所说,如果付款失败,情况会变得特别复杂。在我看来,你有三个选择:

  • 忽略失败的付款,让客户访问服务,并希望他们在下次尝试付款时付款
  • 回滚订阅升级,警告客户付款失败
  • 暂停整个订阅,直到客户付款
  • 我只提到#3,因为有时订阅升级过程可能会很复杂。而且,客户花了时间升级订阅,不希望工作被撤销,因为这可能是一个完全无害的原因(例如,他们的信用卡已经过期)


    从开发的角度来看,将订阅标记为未付比回滚或冻结(然后解冻)订阅的某些部分更容易。但是你会因为禁止客户使用他们已经付费的服务(他们现有的订阅服务)而受到处罚因为他们无法支付额外服务的费用。

    在更新订阅时,您可以使用
    计费周期\u锚定
    设置为
    立即
    ,强制其更改计费周期,从而始终立即向客户收费。我个人认为这更有意义。这也适用于按比例分配

    await stripe.subscriptions.update(subscription.id, {
      billing_cycle_anchor: 'now',
      items: [{ id: itemId, plan: planId }]
    });
    

    要在用户升级时立即按比例向用户收取差价,请在修改用户订阅时使用该选项。从文件中引用:

    。。。为了始终立即开具按比例分配的发票,请始终传递发票

    Python示例:

    stripe.Subscription.modify(
    订阅id,
    项目=[{
    “id”:项目id,
    “计划”:计划id,
    }],
    #立即按比例收取费用。
    按比例分配,
    )
    
    当用户更改为更昂贵的计划时,这会立即按比例向用户收取费用。但是,当用户更改为更便宜的计划时,用户将获得按比例分配的积分,从而使用户的下一张账单按比例分配的金额更便宜

    情节 在这些场景中,假设计费日期是每月的第一天。进一步假设该月有30天

    • 场景1:用户订阅了每月5美元的计划。用户决定在每月22日升级至30美元计划。当月剩余8天,5美元计划的未使用部分约为
      (8/30)*5=$1.33
      ,30美元计划的按比例金额为
      (8/30)*30=$8.00
      。因此,用户将立即被收取
      8.00-1.33=$6.67

    • 场景2:用户订阅了每月30美元的计划。用户决定在每月22日降级为5美元计划。当月剩余8天,30美元计划的未使用部分约为
      (8/30)*30=$8.00
      ,5美元计划的按比例金额为
      (8/30)*5=$1.33
      。在这种情况下,不会向用户收费,但用户的下一张账单(在下一个账单日期)将减少
      8.00-1.33=$6.67

    上面的示例计算仅仅是近似的,因为条带按精确的秒数而不是按天计算

    旁注 是正确的,但至少涉及三个API调用,而不是一个。要明确遵循该答案中的步骤,您可以这样做:

    #dearsina回答中的第一步:修改订阅。
    修改的订阅=stripe.subscription.modify(
    订阅id,
    项目=[{
    “id”:项目id,
    “计划”:计划id,
    }],
    )
    #步骤2和3:创建和检索发票。
    发票=stripe.invoice.create(客户=modified_subscription.customer)
    #步骤4和5:最终确定并支付发票。
    stripe.Invoice.pay(Invoice.id)
    

    但是,当您可以在一个API调用中完成所有步骤时,为什么要这样做呢?

    唯一的解决方案是使用它来知道要向它们收费多少,然后预先向它们收费,然后在禁用按比例升级的情况下才进行升级。我认为这是最简单的方法。谢谢,它很有魅力。嗨,我怎样才能达到你描述的#2选择?我想将订阅回滚到最新的活动状态。您需要将他们的订阅(再次)更新回付款人之前的状态