Open RikuHirose opened 3 years ago
task
[x] consoleでplan作成
[x] stripe elementでcard情報を取得
[x] ccard情報を保存する
[x] userApplySubscription
[ ] オーソリしてcheckしcaptureする
[x] userCancelSubscription => サブスクキャンセル = 退会
[x] userChangeCard
[x] setup stripe webhook https://blog.capilano-fw.com/?p=3893#_8211_1 https://nekorokkekun.hatenablog.com/entry/2019/08/25/213501 https://github.com/spatie/laravel-stripe-webhooks
[ ] stripe決済に失敗した場合の扱い
顧客のクレジットカードが有効期限切れだったら? 心配いりません。CashierのWebhookコントローラが顧客のサブスクリプションをキャンセルします。失敗した支払いは自動的に捉えられ、コントローラにより処理されます。このコントローラはStripeがサブスクリプションに失敗したと判断した場合、顧客のサブスクリプションを取り消します。(通常、3回の課金失敗)
webhookで受け付けれるのでemailとか?
[ ] カード変更後、そのカードでサブスク決済できるのか
[x] 退会した時即時無効化するのか or 残りの日にち分は有効化するのか => 即無効化とする
[x] 退会時にstripe上のcustomerなどはどう扱うのか => 退会 => 再度入会もあるので、消さない?
[ ] 決済周りはもう少しちゃんとかきたい
[x] 決済成功 or fail時にemail https://qiita.com/mimoe/items/8f5d9ce46b72b7fecff5
請求モデル: licensed Subscription 開始時に請求が始まり、各期間の始めに plan に設定された単価(amount)と数量(quantity)をもとに定期的に請求
退会処理のロジック
入会 => 退会 => 入会 というフローもあり得るので考慮する
dbでの扱い 論理削除 users tableのcustoeridなどはnullにupdate
stripe上のcustomer 削除する
案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を返すことに注目してください。
退会
サブスクリプション不可
顧客のクレジットカードが有効期限切れだったら? 心配いりません。CashierのWebhookコントローラが顧客のサブスクリプションをキャンセルします。失敗した支払いは自動的に捉えられ、コントローラにより処理されます。このコントローラはStripeがサブスクリプションに失敗したと判断した場合、顧客のサブスクリプションを取り消します。(通常、3回の課金失敗)
課金失敗の処理 サブスクリプションへの支払い、もしくは一回のみの課金は失敗することがあります。これが発生したことを知らせるため、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する
Stripeでの課金を払い戻す必要がある場合は、refundメソッドを使用します。このメソッドの第1引数は、Stripe Payment Intent IDです。
$payment = $user->charge(100, $paymentMethod);
$user->refund($payment->id);
返金手続きはユーザーにキャンセルしてもらって、stripe dashboardから手動で返金で対応することとする
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/
Attaching this card to a Customer object succeeds, but attempts to charge the customer fail.
https://readouble.com/laravel/7.x/ja/billing.html
[x] そもそもの月額課金の仕様を作成する https://qiita.com/y_toku/items/235b5e7ee00792edcbbf https://tech.innovator.jp.net/entry/stripe-subscription-billing-lifecycle-event product作成 => plan作成 => サブスク処理というながれ
[x] card情報を保存するか否か 決済は一つのサブスクにしか使用しないので保存する必要ない? 一度登録したカードとは違うカードに支払いを切り替えたいという要望も出てくる
=> 保存できるカードは1枚までとし、users tableに保存 切り替えたい場合はusers tableを更新し、stripeのpayment methodを更新 + 次からのサブスク処理を新しく登録したカードで処理できるようにする