Cashier - обгортка над Stripe (і окремо над Paddle) для підписок: клієнти, способи оплати, пробні періоди, зміна тарифу, рахунки.
// оформлення через Stripe Checkout
return $request->user()
->newSubscription('default', 'price_monthly_pro')
->trialDays(14)
->checkout(['success_url' => route('billing.done'), 'cancel_url' => route('billing')]);
// перевірка доступу
if ($user->subscribed('default')) { /* ... */ }
$user->subscription('default')->swap('price_yearly_pro');
$user->subscription('default')->cancel(); // до кінця оплаченого періоду
Чому вебхуки критичні. Оплата - асинхронний процес, що відбувається поза вашим застосунком:
- автоматичне продовження підписки щомісяця;
- невдале списання, повторні спроби, скасування після кількох невдач;
- 3-D Secure (SCA): користувач підтверджує платіж у банку пізніше;
- повернення коштів, суперечки, зміни в панелі Stripe вручну.
Про все це застосунок дізнається лише через вебхуки. Cashier реєструє маршрут /stripe/webhook і сам оновлює таблиці subscriptions і subscription_items за подіями customer.subscription.*, invoice.payment_succeeded тощо. Без налаштованих вебхуків стан у базі розходиться з реальністю: користувач перестав платити, а доступ лишився.
php artisan cashier:webhook # створює вебхук у Stripe з потрібними подіями
Обов'язкове для продакшену:
- перевірка підпису -
STRIPE_WEBHOOK_SECRET; без неї будь-хто може надіслати «оплату пройшла»; - виключення з CSRF для маршруту вебхука;
- ідемпотентність власних обробників: Stripe може надіслати подію повторно, а порядок подій не гарантований. Обробник має давати той самий результат при повторі;
- черга для важкої роботи: відповісти Stripe швидко, а лист чи нарахування - у фонове завдання, інакше тайм-аут і повторна доставка;
- стани
incompleteіpast_due: підписка створена, але платіж не підтверджено. Вирішіть, чи давати доступ у цих станах, і перевіряйте їх явно.
Stripe чи Paddle: зі Stripe ви - продавець і самі відповідаєте за податки (Stripe Tax допомагає). Paddle - «merchant of record»: він продає від свого імені й сам сплачує ПДВ у різних країнах, що спрощує продаж по світу, але бере більшу комісію.
Тестування: тестові ключі, Stripe CLI (stripe listen --forward-to) для локальних вебхуків, тести обробників на збережених прикладах подій.