更改 Stripe 中具有多个订阅项的订阅的订阅间隔

Change subscription interval for subscription with multiple subscription items in Stripe

我正在使用 Stripe(PHP 客户端,Laravel)来处理我们的订阅。我们都有 Stripe 似乎不原生支持的订阅和插件 - 但是我找到了解决方法,但我遇到了问题。

设置
我们为用户提供了一些不同的订阅。

每月:

每年:

插件:

假设用户订阅了每月 5 个实体的计划($40/月),每月有 2 个额外的插件($20/月)。总计 60 美元/月。

使用 Stripe 的 PHP 客户端库将插件添加为 SubscriptionItem。

我如何将用户升级到这样的年度订阅:

如您所见,唯一的区别是计费间隔和价格,但对我们系统的访问相同。

我尝试只升级订阅计划(不是插件),但由于不同的计费间隔,我收到一个错误,这似乎是合乎逻辑的。

我是否必须删除所有订阅插件 (SubscriptionItems),然后进行升级,以及何时使用新的计费间隔再次添加订阅插件? 我不喜欢这种方法,因为我必须删除初始订阅,然后 return 用户无处可去,以防收费失败...

另一种方法是创建一个全新的订阅,其中的插件与初始订阅分开。然后我可以将新订阅分配给客户并删除旧订阅。

所有这些看起来都有些奇怪,因为 Stripe 是如此简单和灵活。我可能会遗漏什么?我是吗?

当我在订阅中有其他订阅项目时,在月度和年度计划之间切换的最佳方式是什么?

希望你理解我的问题。谢谢!

Subscription 对象下的所有 Subscription Items 必须使用相同的计费间隔。

如果您想将用户从按月订阅改为按年订阅,您需要同时将所有 项目更新为按年订阅。从 Stripe 的角度来看,你会做类似的事情:

// create a customer
$customer = \Stripe\Customer::create([
    "source" => "tok_visa",
    "description" => "change my subscription customer"
]);

// create a sub with two monthly items
$sub = \Stripe\Subscription::create([
    "customer" => $customer->id,
    "items" => [
        [
            "plan" => "gold-monthly"
        ],
        [
            "plan" => "silver-monthly"
        ],
    ]
]);

// let's pretend we later retrieved that subscription
$subscription = \Stripe\Subscription::retrieve($sub->id);

// grab the items attached, change both to annual
echo \Stripe\Subscription::update($subscription->id, [
    'items' => [
        [
            'id' => $subscription->items->data[0]->id,
            'plan' => 'gold-annual',
        ],
        [
            'id' => $subscription->items->data[1]->id,
            'plan' => 'silver-annual',
        ],
    ],
]);