Stripe:在"期末"降级用户

Mad*_*aks 40 downgrade stripe-payments temboo

是否可以在期末而不是立即降级用户?我已经梳理了API Docs,但却无法弄清楚如何实现这一目标.

作为一种解决方法,我目前正在取消用户的订阅,然后订阅较少的订阅,试用到月底.这不会起作用 - 我需要能够将降级延迟到期末(但是在请求降级时"记录"它与Stripe).

很明显,有一些方法可以通过webhook回调和本地跟踪用户订阅来实现这一目标,但我希望尽可能避免这种情况.


编辑

在有人要求之前 - 我正在使用Temboo的PHP SDK.但是,我不是在寻找一种特定于语言的方法,只是一种高级的方法(如果可能的话).

Sne*_*ack 11

正如@Safinn和@Martin所提到的,您可以取消订阅, at_period_end: true以便在特定日期采取取消措施.

为了降级到不同的计划,我解决它的方法是执行上述操作,然后创建一个在同一日期/时间结束的新计划的免费试用.这样,旧计划将在新计划的审判结束的同一天取消(使其处于活动状态).

这让Stripe完全处理降级(这应该是更直接的恕我直言),而不是在数据库中设置webhooks或跟踪日期.

  • 我理解Stripe的来源,但我的理解是,试验(和一般的订阅)计算到第二个,所以从理论上来说,2个潜艇之间不应该有一个奇怪的状态.根据我使用这种方法的经验,我从来没有遇到任何麻烦,我们用它进行了大量的测试.我希望有所帮助. (2认同)

小智 10

Stripe 最近推出了解决这个问题的订阅计划:https : //stripe.com/docs/api/subscription_schedules


Jai*_*dya 9

在 Stripe 发布订阅计划后,这里介绍的大多数解决方案看起来像是 hack,这可能是最优雅的解决方案。事实上,条纹文档有确切说明相同的情况下的例子在这里

第 1 步:current_period_end从您希望降级的现有订阅中获取价值。

步骤 2:从现有订阅创建新的订阅计划。

$subscriptionSchedule = $stripe->subscriptionSchedules->create([
  'from_subscription' => 'sub_G678SASEGF',
]);
Run Code Online (Sandbox Code Playgroud)

第 3 步:用两个阶段更新新创建的计划。phase 0在当前阶段,在结束current_period_endphase 1为下一阶段即开始在current_period_end与下调价格的计划。

$stripe->subscriptionSchedules->update(
  $subscriptionSchedule->id,
  [ 
    'end_behavior' => 'release',
    'phases' => [
      [
        'start_date' => $current_period_start,
        'end_date' => $current_period_end,
        'plans' => [
          [
            'price' => $current_price_id
          ],
        ],
      ],
      [
        'start_date' => $current_period_end,
        'plans' => [
          [
            'price' => $downgraded_price_id,
          ],
        ]
    ],
  ],
]
Run Code Online (Sandbox Code Playgroud)

您始终可以检查订阅对象以查看是否有活动的计划,然后检索计划以利用任何未来的降级。这种方法的优点是它可以应用于任何降级和/或计费周期更改。使用前面回答中描述的多计划方法,一个订阅只能包含具有相同计费周期的项目。

  • 非常感谢您提供代码示例!我正在使用 Python API,但这仍然对我有很大帮助。对于用户不断在计划之间切换的情况,我建议在数据库中保存当前计划的开始结束日期(以及订阅计划 ID),并使用它们而不是每次都在“订阅”对象中查找,因为这些阶段只会继续向前传播。您可以为“invoice.created”创建一个 webhook,然后根据需要从数据库中删除订阅计划 ID(因为我相信 Stripe 会在最后一个阶段后将其从末尾删除) (3认同)

Gar*_*orn 7

是的,使用最新版本的Stripe API。

(您可能在Temboo的SDK中使用的Stripe令牌与Stripe的常规PHP库兼容)

  • 创建具有多个定价计划的产品
  • 为客户订阅这些计划ID之一
  • 将客户更新为新计划时,只需执行以下操作:

    $sub = $myUser->data['stripe_subscription_id'];
    $subscription = \Stripe\Subscription::retrieve($sub);
    \Stripe\Subscription::update($sub, [    
        'cancel_at_period_end' => false,
        'items' => [
            [
                'id' => $subscription->items->data[0]->id,
                'plan' => $plan,
            ],
        ],
        'prorate' => false,
        'trial_end' => $subscription->current_period_end
    ]);
    $subscription->save();
    
    Run Code Online (Sandbox Code Playgroud)

通过设置prorate为false,trial_end$subscription->current_period_endcancel_at_period_end为false,则有效地告诉条纹:

直到该用户当前的帐单到期(在期末取消)这一天之前都不向其收费,不要在计划开关(按比例分配)上向他们退还任何款项,并在其当前帐单周期结束时(试用期结束)重新开始计费。

这样可以在旧计划结束后将其帐单更改为新计划。


Mar*_*tin 5

您应该跟踪您的用户何时加入计划 - 在您的数据库中的 customer_id 旁边保留一个日期字段。您可以使用此日期来确定他们加入的月份的哪一天,从而确定计费周期。如果账单日是当月的 31 日,那么在较短的月份,Stripe 将在这些月的最后一天 ( https://support.stripe.com/questions/subscription-date-at-end-of-month )计费。

现在,当用户希望降级时,他们会在登录时完成您网站上的操作。您记下此降级请求并将其存储在数据库中,我们将其称为“stripe_actionable_table”。此表中的重要字段是:

  • actionable_date(执行 Stripe 请求的日期 - 您需要一些逻辑来确定上述较短的月份)
  • stripe_customer_id
  • what_to_do(升级/降级/取消)
  • change_plan_to(计划 ID - 如果取消请求可以为空)

然后,您将有一个每天在特定时间运行的 cron,并检查此 stripe_actionable_table,如果一个月中的某一天与表中的某一行匹配,则操作 Stripe 请求。完成后,您可以删除该行或将该行标记为已删除。

  • 如何使用设置为 TRUE 的参数“at_period_end”取消订阅。然后设置一个可以侦听 Stripe 事件的 webhook,以便您可以检测事件:“customer.subscription.deleted”。当您选择它时,只需将客户设置为较低的订阅计划即可。 (11认同)
  • 谢谢。是的,有各种各样的方法可以通过在我们端管理事情来完成 - 我的问题是,有没有一种方法可以让 Stripe 在期末自动处理降级。这是一个很常见的场景,与 webhooks 结合使用 * 可能* 如此简单。但是正如您的答案(和我们的解决方案)所证明的那样,这是一个主要的麻烦。 (10认同)