Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
3 tasks done
RikuHirose opened this issue Sep 28, 2020 · 8 comments
Open
3 tasks done

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

RikuHirose opened this issue Sep 28, 2020 · 8 comments

Comments

@RikuHirose
Copy link
Collaborator

RikuHirose commented Sep 28, 2020

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

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

@RikuHirose
Copy link
Collaborator Author

RikuHirose commented Oct 13, 2020

task

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

webhookで受け付けれるのでemailとか?

  • カード変更後、そのカードでサブスク決済できるのか

  • 退会した時即時無効化するのか or 残りの日にち分は有効化するのか
    => 即無効化とする

  • 退会時にstripe上のcustomerなどはどう扱うのか
    => 退会 => 再度入会もあるので、消さない?

  • 決済周りはもう少しちゃんとかきたい

  • 決済成功 or fail時にemail
    https://qiita.com/mimoe/items/8f5d9ce46b72b7fecff5

@RikuHirose
Copy link
Collaborator Author

RikuHirose commented Oct 13, 2020

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

@RikuHirose
Copy link
Collaborator Author

RikuHirose commented Oct 25, 2020

退会処理のロジック

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

  • 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を返すことに注目してください。
  • 再入会時にcard情報をどう扱うかを考える

退会

  • 退会時に有効期限が残っている場合、残りの有効期限をユーザーに見せる?
    再入会
  • 有効期限が残っている場合、サブスクリプション再開
  • 有効期限が残っていない場合、登録されているカード情報 or カードを変更したのち、決済させる

@RikuHirose
Copy link
Collaborator Author

RikuHirose commented Oct 25, 2020

サブスクリプション不可

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

@RikuHirose
Copy link
Collaborator Author

RikuHirose commented Oct 26, 2020

  • 決済失敗のエラーハンドリング

課金失敗の処理
サブスクリプションへの支払い、もしくは一回のみの課金は失敗することがあります。これが発生したことを知らせるため、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
Copy link
Collaborator Author

RikuHirose commented Oct 26, 2020

  • 購入から2週間以内は無料で返金

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

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

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

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

@RikuHirose
Copy link
Collaborator Author

RikuHirose commented Oct 26, 2020

  • 決済テスト

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 added a commit that referenced this issue Oct 31, 2020
@RikuHirose
Copy link
Collaborator Author

RikuHirose commented Nov 2, 2020

  • 以下ケースのエラーハンドリング && テスト
Attaching this card to a Customer object succeeds, but attempts to charge the customer fail.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant