Laravel Кассир — Пожизненная подписка

#php #laravel #stripe-payments #laravel-cashier

#php #laravel #stripe-платежи #laravel-кассир

Вопрос:

я пытаюсь сделать ежемесячную, годовую и пожизненную подписку, в которой ежемесячная и годовая подписка работает нормально. как я могу сделать пожизненную / вечную подписку? всякий раз, когда я передаю имя плана и идентификатор плана $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);
 

Комментарии:

1. Может быть, не оформляйте подписку, поскольку она пожизненная, вы можете просто сделать один платеж.

2. но тогда как я буду проверять, подписался ли пользователь или уже сделал платеж.

3. Согласно вашей базе данных. В любом случае, вы не должны полагаться на одно решение для обработки (Stripe) и их код. Что произойдет, если вам придется переключить их или добавить другой способ оплаты?

Ответ №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()) {
    // ...
}