개요
Laravel Cashier (Stripe)는 Stripe의 과금 기능을 Laravel에서 다루기 위한 공식 패키지입니다. Subscription의 생성·상태 확인·취소, 1회 결제, 청구서 다운로드, Webhook 처리를 통일된 API로 구현할 수 있습니다.설치와 설정
먼저 Cashier를 설치하고, 필요한 테이블을 생성해 주세요.App\Models\User 같은 과금 대상 모델에 Billable 트레이트를 추가합니다.
.env에 Stripe 키를 설정합니다.
고객 관리
Stripe Customer를 아직 생성하지 않았을 가능성이 있는 경우createOrGetStripeCustomer()를 사용합니다.
createAsStripeCustomer()를 사용합니다.
Subscription
신규 생성
newSubscription()과 create()로 Subscription을 시작합니다.
$paymentMethodId에는 Stripe.js 등에서 취득한 Payment Method ID를 전달합니다.
price_monthly는 예시입니다. 실제 구현 시에는 Stripe 대시보드에서 생성한 실제 Price ID를 지정해 주세요.
상태 확인
subscribed()로 유효한 Subscription인지 확인할 수 있습니다.
취소와 재개
1회 결제 (Charge)
charge()로 1회만 과금할 수 있습니다. 금액은 통화의 최소 단위로 전달해 주세요(예: USD라면 100은 $1.00).
여기서도 $paymentMethodId에는 Stripe에서 생성한 Payment Method ID를 사용합니다.
charge()는 예외를 던집니다.
Payment Element
Stripe의 Payment Element를 사용하면 카드·Apple Pay·Google Pay·iDEAL 등 여러 결제 수단을 통일적으로 다룰 수 있습니다.Subscription에서의 이용
Setup Intent를 생성해 뷰에 전달합니다.client_secret을 전달합니다.
setup_intent 파라미터가 부여됩니다. 이를 사용해 Payment Method ID를 취득하고, Subscription을 생성합니다.
1회 결제에서의 이용
1회 결제에서는pay()로 Payment Intent를 생성합니다. Order 모델에는 user_id, amount, status, stripe_payment_intent_id 컬럼이 필요합니다.
payment_intent 파라미터로 Order를 검색하고, Payment Intent가 인증된 사용자의 것이며 succeeded 상태인지 확인한 후 주문을 확정합니다.
청구서
청구서 목록은invoices()로 가져올 수 있습니다.
dompdf/dompdf를 설치하고, downloadInvoice()를 사용합니다. $invoiceId에는 invoices()로 가져온 청구서 ID를 전달해 주세요.
Webhook 설정
Cashier는 Stripe Webhook용 라우트를 자동 등록하며, 기본적으로/stripe/webhook을 사용합니다. Stripe 대시보드에 이 URL을 설정해 주세요.
Webhook 생성은 cashier:webhook으로 실행할 수 있습니다.
stripe/*를 제외해 주세요.
STRIPE_WEBHOOK_SECRET을 .env에 설정하면 Cashier의 서명 검증 미들웨어에서 Webhook 요청을 검증할 수 있습니다.