manabubannai / gift.place

9 stars 0 forks source link

サブスクリプション処理 #2

Open RikuHirose opened 3 years ago

RikuHirose commented 3 years ago

https://readouble.com/laravel/7.x/ja/billing.html

=> 保存できるカードは1枚までとし、users tableに保存 切り替えたい場合はusers tableを更新し、stripeのpayment methodを更新 + 次からのサブスク処理を新しく登録したカードで処理できるようにする

RikuHirose commented 3 years ago

task

RikuHirose commented 3 years ago

請求モデル: licensed Subscription 開始時に請求が始まり、各期間の始めに plan に設定された単価(amount)と数量(quantity)をもとに定期的に請求

RikuHirose commented 3 years ago

退会処理のロジック

入会 => 退会 => 入会 というフローもあり得るので考慮する

案1: 退会時にuser tableのstripe情報はnullにして、stripe上のcustomerは削除する 再入会時のロジックがシンプル 再入会時でも、過去の支払い情報はuseridを使ってsubscriptions tableから取得することはできる

or

案2: 退会時にuser tableのstripe情報は残す

=> users tableは特にいじらない

また、ユーザーがサブスクリプションをキャンセルしているが、まだ完全に期限が切れる前の「猶予期間」中であるかを調べることもできます。たとえば、ユーザーが3月5日にサブスクリプションをキャンセルし、3月10日で無効になる場合、そのユーザーは3月10日までは「猶予期間」中です。subscribedメソッドは、この期間中、まだtrueを返すことに注目してください。

退会

RikuHirose commented 3 years ago

サブスクリプション不可

顧客のクレジットカードが有効期限切れだったら? 心配いりません。CashierのWebhookコントローラが顧客のサブスクリプションをキャンセルします。失敗した支払いは自動的に捉えられ、コントローラにより処理されます。このコントローラはStripeがサブスクリプションに失敗したと判断した場合、顧客のサブスクリプションを取り消します。(通常、3回の課金失敗)

RikuHirose commented 3 years ago

課金失敗の処理 サブスクリプションへの支払い、もしくは一回のみの課金は失敗することがあります。これが発生したことを知らせるため、CashierはIncompletePayment例外を投げます。この例外を補足した後の処理方法は、2つの選択肢があります。

最初の方法は、その顧客をCashierに含まれている支払い確認専門ページへリダイレクトする方法です。このページに紐つけたルートは、Cashierのサービスプロバイダで登録済みです。IncompletePayment例外を捉えたら、支払い確認ページへリダイレクトします。

https://qiita.com/mimoe/items/8f5d9ce46b72b7fecff5 https://stripe.com/docs/api/errors#errors-card_error

https://teratail.com/questions/272376

初回error => try catchする 2回目以降のerror => webhookがhandlingする

RikuHirose commented 3 years ago

Stripeでの課金を払い戻す必要がある場合は、refundメソッドを使用します。このメソッドの第1引数は、Stripe Payment Intent IDです。

$payment = $user->charge(100, $paymentMethod);

$user->refund($payment->id);

返金手続きはユーザーにキャンセルしてもらって、stripe dashboardから手動で返金で対応することとする

RikuHirose commented 3 years ago

Cashierを使用するアプリケーションをテストする場合、Stripe APIに対する実際のHTTPリクエストをモックしたいことがあります。しかしながら、これはCashier自身の動作を部分的に再実装する必要があります。そのためテストでは実際のStripe APIへアクセスすることを勧めます。この方法は低速ですが、アプリケーションが期待どおりに動作していることをより確信できます。そして遅いテストは独自のPHPUnitテストグループに配置できます。

Cashier自身はすでに十分なテストスーツを持っているため、Cashierの裏で実行されているすべての振る舞いをテストする必要がないことを思い出してください。自分のアプリケーションにおけるサブスクリプションと支払いのフローをテストすることだけに集中すべきでしょう。

使用開始する前に、phpunit.xmlファイルへtestingバージョンのStripeシークレットを追加します。

https://stackoverflow.com/questions/60398112/laravel-cashier-unit-tests-with-creating-subscriptions-with-payment-methods https://levelup.gitconnected.com/laravel-lightning-fast-testing-for-subscription-payments-with-stripe-167cfb43280a https://laravel-news.com/stripe-tokens-for-testing https://driesvints.com/blog/testing-cashier/

laravel dust https://jasonmccreary.me/articles/testing-stripe-checkout-laravel-dusk/

RikuHirose commented 3 years ago