Laravel Cashier - Berlangganan Seumur Hidup

saya mencoba melakukan langganan bulanan, tahunan, dan seumur hidup di mana langganan bulanan dan tahunan berfungsi dengan baik. bagaimana saya bisa berlangganan seumur hidup/selamanya? setiap kali saya meneruskan nama paket dan id paket ke $user->newSubscription() saya mendapatkan kesalahan:

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

di bawah ini adalah kode saya untuk berlangganan:

$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 sumber
comment
Mungkin jangan berlangganan, karena seumur hidup Anda cukup melakukan satu kali pembayaran.   -  person HTMHell    schedule 23.12.2020
comment
tapi kemudian bagaimana saya akan memeriksa apakah pengguna berlangganan atau sudah melakukan pembayaran.   -  person Naveed Ali    schedule 23.12.2020
comment
Menurut database Anda. Bagaimanapun, Anda tidak boleh bergantung pada satu solusi pemrosesan (Stripe) dan kodenya. Apa yang terjadi jika Anda harus menggantinya, atau menambahkan metode pembayaran lain?   -  person HTMHell    schedule 23.12.2020


Jawaban (1)


Dengan asumsi Anda menggunakan harga dan bukan paket, Anda harus membuat faktur, bukan berlangganan :

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]);
}

Selanjutnya, tambahkan invoice.paid ke webhook Anda dan kebutuhan Anda untuk mendengarkan pemberitahuan ini dengan memperluas WebhookController. Di sini Anda akan menemukan faktur yang cocok dan memeriksa apakah item faktur memiliki id yang sama dengan $plan->lifetime_plan. Jika demikian, Anda dapat memperbarui kolom pada model pelanggan Anda untuk mengatur bahwa mereka memiliki langganan seumur hidup:

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();
}

Di aplikasi Anda, Anda dapat memeriksa apakah pengguna memiliki langganan seumur hidup atau langganan normal:

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