条纹:在"period end"时降级用户



是否可以在期末而不是立即降级用户?我已经梳理了API文档,但还没能弄清楚如何实现这一点。

作为一种解决办法,我现在立即取消用户的订阅,然后为他们订阅较小的订阅,试用到月底。这将不起作用-我需要能够延迟降级直到周期结束(但在请求降级时使用/Stripe"记录")。

显然,有一些方法可以通过webhook回调和本地跟踪用户订阅来实现这一点,但如果可能的话,我希望避免这样做。


编辑

在任何人问之前-我使用Temboo的PHP SDK。然而,我不是在寻找一种特定于语言的方法,只是一个高层次的操作方法(如果可能的话)。

这里提出的大多数解决方案看起来都像是stripe发布订阅计划之后的hack,这可能是最优雅的解决方案。事实上,stripe文档中有一个示例,在这里演示了完全相同的场景。

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

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

$subscriptionSchedule = $stripe->subscriptionSchedules->create([
  'from_subscription' => 'sub_G678SASEGF',
]);

步骤3:用两个阶段更新新创建的时间表。phase 0为当前阶段,结束于current_period_end; phase 1为下一阶段,开始于current_period_end,采用降价方案。

$stripe->subscriptionSchedules->update(
  $subscriptionSchedule->id,
  [ 
    'end_behavior' => 'release',
    'phases' => [
      [
        'start_date' => $current_period_start,
        'end_date' => $current_period_end,
        'items' => [
          [
            'price' => $current_price_id
          ],
        ],
      ],
      [
        'start_date' => $current_period_end,
        'items' => [
          [
            'price' => $downgraded_price_id,
          ],
        ]
    ],
  ],
]

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

正如@Safinn和@Martin所提到的,您可以使用at_period_end: true在特定日期取消订阅。

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

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

是,使用最新版本的Stripe API

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

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

    $sub = $myUser->data['stripe_subscription_id'];
    $subscription = StripeSubscription::retrieve($sub);
    StripeSubscription::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();
    

通过将prorate设置为false, trial_end设置为$subscription->current_period_end, cancel_at_period_end设置为false,您可以有效地告诉Stripe:

在当前计费结束(在周期结束时取消)之前不要向该用户收费,不要在计划切换(按比例)上退还他们任何钱,并在当前计费周期结束时重新开始计费(试用结束)

在旧计划结束时将其账单更改为新计划的效果。

Stripe最近引入了订阅计划来解决这个问题:https://stripe.com/docs/api/subscription_schedules

你应该跟踪你的用户何时加入一个计划-在你的数据库中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 -如果cancel req可以为null)

你会有一个cron,每天在特定的时间运行,并检查这个stripe_actionable_table,如果这个月的一天与表中的一行相匹配,那么操作条纹请求。完成后,您可以删除或将该行标记为已删除。

对于每个正在寻找最新解决方案的人-请查看Stripe Subscription Schedules API链接

使用这个API,你可以简单地:

  • 在未来日期开始订阅,
  • 将订阅日期回溯到过去的日期和
  • 升级或降级订阅

你可以像这样简单地创建一个时间表:

StripeSubscriptionSchedule::create([
  'customer' => 'cus_ABC',
  'start_date' => 'now',
  'end_behavior' => 'release',
  'phases' => [
    [
      'items' => [
        [
          'price' => 'price_ABC',
          'quantity' => 1,
        ],
      ],
      'iterations' => 12,
    ],
  ],
]);

更多

现在可以使用Stripe的prorate标志。

$subscription = StripeSubscription::retrieve("sub_44ty4267H50z6c");
$itemID = $subscription->items->data[0]->id;
StripeSubscription::update("sub_44ty4267H50z6c", array(
  "items" => array(
    array(
      "id" => $itemID,
      "plan" => "basic-plan",
    ),
  ),
  "prorate" => false,
));

通过将prorate设置为false,您有效地告诉Stripe在当前周期结束之前不要应用计划更改。

官方文档在这里:

https://stripe.com/docs/subscriptions/upgrading-downgrading disable-prorations

澄清(根据下面的用户评论):请注意,Stripe 立即更新其自己的活动计划表示(只有用户的收费被延迟),因此您仍然需要在您自己的应用程序中手动管理延迟活动计划更改。

这是怎么做的。

我只是取消了现有的订阅,它将根据当前的计费周期结束。在取消它的时候,我在我的本地用户表中保存了客户请求的降级计划id。

然后我在stripe中为customer.subscription.deleted设置了一个webhook,并创建了一个处理程序,它将从我的本地用户表中选择已保存的降级计划,并立即使用该处理程序创建一个新的订阅。

似乎没有一种方法可以轻松地使用Stripe。

我在更新数量而不是改变计划,但这个想法也可以应用。

可能的解决方案是:

  1. 不按比例使用Stripe更新订阅数量。

  2. 保持之前的数量直到invoice.created事件

  3. 处理invoice.created事件时,将用户之前订阅的数量与用户订阅的数量进行比较,必要时减少。

如果您想在当前计费周期结束时取消订阅(即,在客户已经支付的时间内),则提供一个at_period_end值为true

https://stripe.com/docs/subscriptions/canceling-pausing

我认为你可以更新订阅并添加at_period_end: true,这样应该会在期限结束时取消订阅。

最新更新