#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()) {
// ...
}