Laravel如何处理取消条带订阅?

时间:2018-01-11 17:59:01

标签: php laravel

当我调用$user->subscription('main')->cancelNow()方法时,它确实可以正常工作。它将ends_at设置为当前日期,并且还更新了Stripe,我可以看到订阅已在Stripe上取消。

但是,当我调用$user->subscription('main')->cancel()方法时,它会将ends_at设置为当前句点的结尾,但它不会更新Stripe。订阅仍然有效。所以我的问题是,当前期间结束时订阅将如何被取消?

1 个答案:

答案 0 :(得分:2)

你说的是什么:

  

当我拨打$ user->订阅(' main') - > cancel()方法时,它会设置   ends_at到当前句点的结尾,但它不会更新   条纹

这是假的。

让我们先看一下cancelNow()代码:

/**
 * Cancel the subscription immediately.
 *
 * @return $this
 */
public function cancelNow()
{
    $subscription = $this->asStripeSubscription();

    $subscription->cancel();

    $this->markAsCancelled();

    return $this;
}

/**
 * Mark the subscription as cancelled.
 *
 * @return void
 */
public function markAsCancelled()
{
    $this->fill(['ends_at' => Carbon::now()])->save();
}

这只是立即取消Stripe上的订阅(因为它没有指定ends_at),并在您自己的数据库中将其标记为已取消。

现在让我们看一下cancel()代码:

/**
 * Cancel the subscription at the end of the billing period.
 *
 * @return $this
 */
public function cancel()
{
    $subscription = $this->asStripeSubscription();

    $subscription->cancel(['at_period_end' => true]);

    // If the user was on trial, we will set the grace period to end when the trial
    // would have ended. Otherwise, we'll retrieve the end of the billing period
    // period and make that the end of the grace period for this current user.
    if ($this->onTrial()) {
        $this->ends_at = $this->trial_ends_at;
    } else {
        $this->ends_at = Carbon::createFromTimestamp(
            $subscription->current_period_end
        );
    }

    $this->save();

    return $this;
}

这也取消了Stripe上的订阅,但它传递了['at_period_end' => true]。这意味着只有在续订订阅期限时才会在Stripe上取消订阅。但 Stripe仍然有更新!然后它也会更新您自己的数据库。

所以你使用cancel()并让Stripe完成剩余的工作,你不需要任何后台工作或crontabs来处理这个问题!