首页 > 解决方案 > Laravel Cashier - 终身订阅

问题描述

我正在尝试进行每月、每年和终身订阅,其中每月和每年订阅都可以正常工作。我如何进行终身/永久订阅?每当我将计划名称和计划 ID 传递给$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);

标签: phplaravelstripe-paymentslaravel-cashier

解决方案


假设您使用的是价格而不是计划,您应该创建发票而不是订阅:

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 添加到您的 webhook 和您需要监听此通知。在这里您将找到匹配的发票并检查发票项目是否具有与 相同的 id $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()) {
    // ...
}

推荐阅读