当我调用$user->subscription('main')->cancelNow()
方法时,它确实可以正常工作。它将ends_at
设置为当前日期,并且还更新了Stripe,我可以看到订阅已在Stripe上取消。
但是,当我调用$user->subscription('main')->cancel()
方法时,它会将ends_at
设置为当前句点的结尾,但它不会更新Stripe。订阅仍然有效。所以我的问题是,当前期间结束时订阅将如何被取消?
答案 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来处理这个问题!