是否可以在期末而不是立即降级用户?我已经梳理了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。
我在更新数量而不是改变计划,但这个想法也可以应用。
可能的解决方案是:
-
不按比例使用Stripe更新订阅数量。
-
保持之前的数量直到
invoice.created
事件 -
处理
invoice.created
事件时,将用户之前订阅的数量与用户订阅的数量进行比较,必要时减少。
https://stripe.com/docs/subscriptions/canceling-pausing如果您想在当前计费周期结束时取消订阅(即,在客户已经支付的时间内),则提供一个at_period_end值为true
我认为你可以更新订阅并添加at_period_end: true
,这样应该会在期限结束时取消订阅。