Laravel 收银员 `$user->subscribed()` 在没有订阅存在时返回 true

Laravel cashier `$user->subscribed()` returning true when no subscription exists

我的代码很简单:

if($user->subscribed('main')){
    $user->subscription('main')->cancel();
}

我收到这样的回复:

Stripe \ Error \ InvalidRequest
No such subscription: sub_EQTvxKjit2Ak6i

该订阅实际上之前已被取消,因此它不应该给出 true 响应。

我尝试返回 $user->subscribed('main'),结果返回为 true

该用户还有其他订阅,但 'main' 未激活。

我错过了什么吗?

$user->subscribed() 只检查数据库的订阅状态——它根本不查询 Stripe API。但是当您尝试取消该订阅时,它会查询 API.

因此,如果您的数据库与 Stripe 中的数据不同步,可能会产生这样的错误。也许您的数据库已从 Stripe 测试模式订阅,但您正在查询 Stripe 生产 API?或者反之亦然?

如果您阅读 Billable trait,您会在那里找到此功能

public function subscribed($subscription = 'default', $plan = null)
{
    $subscription = $this->subscription($subscription);

    if (is_null($subscription)) {
        return false;
    }

    if (is_null($plan)) {
        return $subscription->valid();
    }

    return $subscription->valid() &&
           $subscription->stripe_plan === $plan;
}

此功能只检查subscriptions table 中是否存在订阅记录。 根据上述功能,如果订阅不存在,那么它将 return false.

确保你没有做错任何事情。

更新收银台 v13.4

您可以先使用 Stripe 同步数据库条目:

optional($user->subscription('main'))->syncStripeStatus();

然后调用

 if ($user->subscribed('main')) { ... }