是否可以减少 Metered Billing Plan 中的使用量(使用 Laravel Cashier - Stripe)

Is it possible to decrease the usage in Metered Billing Plan ( using Laravel Cashier - Stripe)

我正在创建一个约会应用程序,用户按约会计费,有时用户会取消订阅。在那个时候我们需要减少使用量,这是正确的方法吗?如果可以,Laravel 收银台是否有任何设施?

在 Stripe 文档中,它提到了 Action ENUM,我们可以使用它吗?

可以使用 set 而不是增量:

在源代码中我们可以看到如下SubscriptionItem#reportUsage:

    public function reportUsage($quantity = 1, $timestamp = null)
    {
        $timestamp = $timestamp instanceof DateTimeInterface ? $timestamp->getTimestamp() : $timestamp;

        return $this->subscription->owner->stripe()->subscriptionItems->createUsageRecord($this->stripe_id, [
            'quantity' => $quantity,
            'action' => $timestamp ? 'set' : 'increment',
            'timestamp' => $timestamp ?? time(),
        ]);
    }

Subscription#reportUsage

调用
    public function reportUsage($quantity = 1, $timestamp = null, $price = null)
    {
        if (! $price) {
            $this->guardAgainstMultiplePrices();
        }

        return $this->findItemOrFail($price ?? $this->stripe_price)->reportUsage($quantity, $timestamp);
    }

所以如果你想递减你只会得到当前的用法并设置一个新的用法,你必须包含时间戳参数来使用set而不是递增:

// get current usage
$newUsage = $currentUsage - $decrement;

$user = User::find(1);

$user->subscription('default')->reportUsage($newUsage, time());

正如所问,@Alex Harris 的回答是使用 Cashier 的一个很好的例子。为了将其推广到其他 Stripe 集成,在创建使用记录 (API ref) 时使用 action=set 支持:

curl https://api.stripe.com/v1/subscription_items/si_123/usage_records \
  -u sk_test_456: \
  -d quantity=100 \
  -d action=set \
  -d timestamp=1571252444