Laravel Cashier — пожизненная подписка

Я пытаюсь сделать ежемесячную, годовую и пожизненную подписку, в которой ежемесячная и годовая подписка работает нормально. как я могу сделать пожизненную/навсегда подписку? всякий раз, когда я передаю имя плана и идентификатор плана в $user->newSubscription(), я получаю сообщение об ошибке:

You passed a non-recurring price but this field only accepts recurring prices.

ниже мой код для подписки:

$paymentMethod = $user->defaultPaymentMethod();

        if ($period == 'yearly') {
            $selectedPlan = $plan->plan_year;
        } elseif($period=='monthly') {
            $selectedPlan = $plan->plan_month;
        }
        else{
            $selectedPlan = $plan->plan_lifetime;
        }   

        $subscription = $user->newSubscription($plan->name, $selectedPlan);

person Naveed Ali    schedule 23.12.2020    source источник
comment
Может быть, не оформляйте подписку, так как это пожизненно, вы можете сделать только один платеж.   -  person HTMHell    schedule 23.12.2020
comment
но тогда как я проверю, подписался ли пользователь или уже сделал платеж.   -  person Naveed Ali    schedule 23.12.2020
comment
По вашей базе. В любом случае, вы не должны полагаться на одно решение для обработки (Stripe) и их код. Что произойдет, если вам придется переключить их или добавить другой способ оплаты?   -  person HTMHell    schedule 23.12.2020


Ответы (1)


Предполагая, что вы используете цены вместо планов, вам следует создать счет вместо подписки. :

if ($period == 'yearly') {
    $subscription = $user->newSubscription($plan->name, $plan->plan_year);
} elseif($period=='monthly') {
    $subscription = $user->newSubscription($plan->name, $plan->plan_month);
} else {
    // Create an invoice item with the lifetime price
    StripeInvoiceItem::create([
        'customer' => $user->stripeId(),
        'price' => $plan->plan_lifetime,
    ], $user->stripeOptions());

    // create the invoice with the lifetime item and finalize it automatically after 1 hour
    $user->invoice(['auto_advance' => true]);
}

Затем добавьте invoice.paid к своим веб-перехватчикам и вам нужно прослушать это уведомление, расширив WebhookController. Здесь вы найдете соответствующий счет и проверьте, имеет ли элемент счета тот же идентификатор, что и $plan->lifetime_plan. Если это так, вы можете обновить столбец в своей модели клиента, чтобы установить пожизненную подписку:

public function handleInvoicePaid(array $payload)
{
    if ($user = $this->getUserByStripeId($payload['data']['object']['customer'])) {
        $data = $payload['data']['object'];

        $invoice = $user->findInvoice($data['id']);

        if (isset($invoice)) {
            $plan = ...

            if ($invoice->invoiceItems()->contains(function (InvoiceLineItem $item) use ($plan) {
                return $item->price->id === $plan->lifetime_plan;
            })) {
                $user->update(['has_lifetime_subscription' => true]);
            }
        }
    }

    return $this->successMethod();
}

В своих приложениях вы можете проверить, есть ли у пользователя пожизненная подписка или обычная подписка:

if ($user->has_lifetime_subscription || $user->subscribed()) {
    // ...
}
person sebdesign    schedule 23.12.2020