我目前正在将Laravel Cashier(使用Stripe)集成到一个小应用程序中,该应用程序具有以下三个帐户层;
当前流程是,当用户在注册后确认其电子邮件地址时,他们会在免费计划(无卡)上注册Stripe。然后他们可以随时选择升级到付费计划。
我的困惑在于管理用户订阅的变化,其代码如下;
// Check if the user has a subscription
$activeSubscription = $user->subscriptions()->first();
if ($activeSubscription instanceof Subscription) {
return $activeSubscription->swap($targetPlan);
}
// No active plan (new registration) - create a new one
return $user->newSubscription($targetPlan, $targetPlan)->create();
使用swap
方法将用户的计划从免费更改为基本时,stripe_id
表中的subscriptions
列会更新以反映,这很好,因为用户基本上正在获取更多功能。但是,如果用户决定从高级版降级到基本级,则该表中没有记录用户应该保留高级功能直到该结算周期结束,因为它再次更新上表中的单行。
这里应该采取什么样的流程?如何管理此层次结构并确保在其结算周期结束之前将正确的计划称为“活动”?
修改
在考虑之后,我认为使用swap
只应用于直接掉期适用的情况(例如从月度计划到相同的年度计划)。执行上述操作的最佳方法是什么?我的猜测是取消现有的并订阅新目标,但是如何推迟后者的开始直到第一个时期结束?
这是完整的subscribe
方法,以防它有用;
public function subscribe(User $user, string $targetPlan, string $token = null)
{
$activeSubscription = $user->subscriptions()->first();
if ($targetPlan !== self::FREE_PLAN) {
if (null === $token && !$user->hasCardOnFile()) {
throw new SubscriptionException('No card token provided for paid subscription');
}
$user->updateCard($token);
}
// If the current user is in the cancellation grace period of the selected plan, resume that subscription
$existingSubscription = $user->subscription($targetPlan);
if ($existingSubscription instanceof Subscription && $existingSubscription->onGracePeriod()) {
return $existingSubscription->resume();
}
// If the user has an active subscription, and the target plan is different, swap to that plan
if ($activeSubscription instanceof Subscription) {
$activeSubscription->name = $targetPlan;
return $activeSubscription->swap($targetPlan);
}
return $user->newSubscription($targetPlan, $targetPlan)->create();
}