53

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

作为一种解决方法,我目前正在立即取消用户的订阅,然后将他们订阅到较小的订阅,试用到月底。但这不起作用 - 我需要能够将降级延迟到期末(但在请求降级时使用 Stripe“记录”它)。

显然,有办法通过 webhook 回调和本地跟踪用户订阅来实现这一点,但如果可能的话,我想避免这种情况。


编辑

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

4

10 回答 10

15

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

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

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

于 2017-05-05T13:31:01.047 回答
14

是的,使用最新版本的 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();
    

通过设置prorate为 false、trial_endto$subscription->current_period_endcancel_at_period_endfalse,您可以有效地告诉 Stripe:

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

当他们的旧计划结束时,这具有将他们的帐单更改为新计划的效果。

于 2018-07-26T01:31:43.197 回答
13

在 Stripe 发布订阅计划后,这里介绍的大多数解决方案看起来都像是 hack,这可能是最优雅的解决方案。事实上,条带文档有一个示例,说明了完全相同的场景

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

第 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,
        'plans' => [
          [
            'price' => $current_price_id
          ],
        ],
      ],
      [
        'start_date' => $current_period_end,
        'plans' => [
          [
            'price' => $downgraded_price_id,
          ],
        ]
    ],
  ],
]

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

于 2020-06-10T16:20:02.920 回答
10

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

于 2019-10-18T11:04:47.850 回答
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 请求。完成后,您可以删除该行或将该行标记为已删除。

于 2014-05-19T06:15:22.950 回答
3

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

例如

$subscription = \Stripe\Subscription::retrieve("sub_44ty4267H50z6c");
$itemID = $subscription->items->data[0]->id;

\Stripe\Subscription::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立即更新其自己的活动计划表示(仅延迟用户的收费),因此您仍然需要手动管理延迟从您自己的活动计划更改应用。

于 2017-12-19T11:09:55.137 回答
1

我就是这样做的。

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

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

于 2019-11-19T14:42:34.903 回答
0

似乎没有办法用 Stripe 轻松做到这一点。

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

可能的解决方案是:

  1. 使用 Stripe 更新订阅数量,无需按比例分配。

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

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

于 2017-02-06T05:38:37.350 回答
0

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

使用此 API,您可以简单地:

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

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

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

有关更多信息,请参阅文档

于 2021-08-16T09:39:15.137 回答
-2

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

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

我认为您可以更新订阅并添加at_period_end: true,并且应该在期末取消它。

于 2017-04-15T07:41:52.140 回答