取消 Stripe 订阅后如何恢复订阅

20

假设用户想要取消他们的订阅,那么我会发出这样的命令:

stripe_subscription.delete(at_period_end: true)

后来,在期限结束之前,用户改变了主意。有没有一种方法可以撤销已安排的取消呢?

如果没有,那么最好的实现方式是什么?我的猜测是这样的:

new_subscription = stripe_customer.subscriptions.create(plan: stripe_subscription.plan.id, trial_end: stripe_subscription.current_period_end)
stripe_subscription.delete()   # if permitted
self.stripe_subscription = new_subscription
save!

有什么更好的事情可以做吗?

4个回答

20
如果订阅仍然有效,您只需更新当前订阅并再次传递计划ID,它就会恢复订阅。
在PHP中,您可以这样做:
$customer = Stripe_Customer::retrieve("cus_XXX");
$subscription = $customer->subscriptions->retrieve("sub_YYY");
$subscription->plan = "myPlanId";
$subscription->save();

这个问题在Stripe的支持文章中有更详细的介绍,请点击这里


该链接的支持文章指出,如果这只是一次性的操作,而不值得通过API实现,也可以通过Stripe仪表板完成。 - David Peden
1
更新了 Stripe 关于重新激活已取消订阅的子部分的永久链接:https://stripe.com/docs/subscriptions/canceling-pausing#reactivating-canceled-subscriptions - TJ Biddle
1
根据我的测试和文档显示,如果订阅已经到达取消日期的末尾(这意味着它要么立即被取消,要么其取消日期已过),那么您无法重新激活它,必须创建一个全新的订阅。 - derpedy-doo
1
那个链接非常有帮助。谢谢。如果你想要这样做的话,可能不应该在Stripe订阅上运行 delete 方法来取消它,而是应该对Stripe订阅进行更新,并将 cancel_at_period_end 参数设置为 true - HartleySan

6

不确定接受的答案是否为旧版,但对于最新版本的Stripe,您需要执行以下操作(使用PHP):

$sub->cancel_at_period_end = false;
return $sub->save();

在我看來,這意味著訂閱將立即被取消,而不是在期限結束時。這是否正確?您能更具體地說明一下您所提到的“最新版本”是什麼嗎? - The Senator
2
在我的测试中,我发现订阅在到期日之前都是有效的。当到达到期日时,API 会检查名为 "cancel_at_period_end" 的标志是否设置为 true 或 false。如果设置为 true,则不会续订,而是取消订阅。如果设置为 false,则会继续续订。因此,在我看来,这只是一个标志,供 API 决定是否取消或续订,并且它只在实际续订时起作用。 - supersan
我不应该怀疑你,同样适用于C#解决方案,我会单独添加,但你得到了我的支持! - The Senator
确实。C# 也是一样的(https://stripe.com/docs/billing/subscriptions/canceling-pausing)。subscriptionService.Update( subscriptionId: ss.Id, new SubscriptionUpdateOptions { CancelAtPeriodEnd = false, } ); - sobelito

3
从仪表板中,进入您的订阅详情,点击右上角的 Edit Details。一个未命名的模态框 "Reactivate subscription" 应该会弹出来,上面写着:

这个订阅将在期限结束时取消。您可以重新激活订阅,它将像往常一样继续。

点击 Reactivate

编辑

现在看起来操作会出现在取消前剩余天数的鼠标悬停上:

enter image description here

请注意,如果订阅已经被取消,它将不会显示。


1
似乎找不到这个。截图会有帮助的。 - Justin Putney
这似乎实际上并不存在。 - derpedy-doo
1
我已经添加了一张截图。请注意,如果订阅已经取消,它将不会显示。 - RafaSashi

1
根据Supersan的上述答案,使用最新的Stripe.net库21.4.1,此解决方案也适用于C#。
 var items = new [] { new SubscriptionItemUpdateOption() { Id = i.Id, PlanId = i.Plan.Id } }.ToList();
 var updateOptions = new SubscriptionUpdateOptions { Items = updatedItems, CancelAtPeriodEnd = false };
 await subscriptionService.UpdateAsync(externalSubscriptionId, updateOptions);

在这里我只是将 Id 和 Plan Id 设置为之前的值。如果您没有使用多个计划订阅,不确定它们是否必要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接