BackEnd

Stripe Connectを使って複合プランの継続課金を実装

投稿日:2021年5月31日 更新日:

はじめに

今回の記事は、Stripe Connectを使ってCheckoutを利用した継続課金を実装の続きとなります。

前回に引き続き、継続課金の実装について紹介していきます。今回は、実際のサービスでの利用を意識して、複数の継続課金を併用した場合について見ていきます。

想定する継続課金

企業向けの架空のファイルアップロードサービスを例にした継続課金になります。はじめに、ユーザ企業はプラン(定額)を契約し、その後、サービスを利用するユーザ数分のID(従量課金)を購入します。

プランは3種類あり、金額に応じて一人あたりのアップロード可能数が増加します。

  • プランA 1,000円/月 1GB/人まで
  • プランB 2,000円/月 5GB/人まで
  • プランC 3,000円/月 無制限

ID数の方は、一人あたり一律100円かかります。例えば、プランAを選択し、30人のユーザが利用する場合、毎月の費用は4,000円になります。

想定するシチュエーション

今回の記事では、以下のようなシチュエーションを想定しています。

  • プランAとID数を30契約
  • ID数をさらに20購入
  • プランAからプランBにアップグレード
  • ID数を10解約
  • プランBからプランAにダウングレード

継続課金商品の作成

プランの継続課金商品の作成

Stripeの管理画面の商品からプランとID数の継続課金商品を作成します。

プランの継続課金商品は、料金体系モデルで標準の料金体系を選択し、料金設定を行います。

 

更に料金を2つ追加すると、以下のようになります。

ID数の継続課金商品の作成

次にID数の継続課金商品を作成します。

ID数の継続課金商品は、数量ベースの料金体系を選択します。

この設定では、一人あたり毎月一律100円かかります。

実装

前回の記事では、継続課金商品の契約はCheckout画面で行いましたが、今回は請求タイミングを月末に固定したいので、コード上から契約を行います。

プランAとID数を30契約する

Subscription::create() メソッドで継続課金商品を契約します。このメソッドでは、以下のように一度に複数の継続課金商品を契約することができます。

billing_cycle_anchor で指定した日付に次回の請求が行われます。また、当月の請求は日割り計算となります。

ID数をさらに20購入

継続課金商品の契約個数を更新する前に、追加の月額を計算することができます。

$invoice の内容を抜粋すると以下の通りです。

proration_behavioralways_invoice を指定すると、変更にかかる金額が即時決済されます。 total の金額が追加の決済金額です。

その後、実際にID数を50に変更する処理がこちらです。 Subscription::update() メソッドで、IDの数量を変更しています。

このように、追加分が即時決済されます。

プランAからプランBにアップグレード

プランの変更もID数の変更と同様に Subscription::update() メソッドで行います。

こちらも、ID数を変更する場合と同様に、プランを変更する前に追加の金額を表示する必要があるでしょう。

ID数を10解約

プランのダウングレードやID数を減らす場合、日割り計算はせず、次月の請求から変更が反映されるものとします。ID数を増やす場合と殆ど変わりませんが、 Subscription::update() メソッドのパラメータの proration_behaviornone で指定します( proration_date は不要)。

この場合の Invoce::upcoming() メソッドのレスポンスは以下のとおりです。

total の値は、次回の請求金額になります。

ちなみに、ID数を減らした後、次の請求より前にID数を増やす場合、日割り金額は減らした後のID数をもとに計算されます。

プランBからプランAにダウングレード

最後に、プランBからプランAにダウングレードする場合です。こちらもID数を減らす場合とほとんど変わりません。

さいごに

前回に引き続き、継続課金について、複数の継続課金を併用し、途中で内容を変更する方法を紹介しました。

おすすめ書籍

PHPフレームワーク Laravel Webアプリケーション開発 バージョン8.x対応 PHP本格入門[上] ~プログラミングとオブジェクト指向の基礎からデータベース連携まで

blog-page_footer_336




blog-page_footer_336




-BackEnd
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

laravel logo

[Laravel]データベースの暗号化について考えてみる

1 はじめに2 環境3 Laravelでの暗号化4 暗号化されたカラムは、そのままではLIKE検索ができない4.1 問題点4.2 解決案1:全件取得してPHP側でがんばって検索する4.3 解決案2:暗 ...

rails

Ruby、Railsの時間に関するメソッドを使用してみた

はじめに 普段PHPのお仕事をしています、tonnyです。 半年程前からRuby on Railsの勉強を始めました。 今回はよく使う時間に関するメソッドついてまとめたいと思います。 目次 1 はじめ ...

Go言語

GoのWeb Application Framework

1 はじめに2 代表的なGoのWAF2.1 軽量なWAF2.2 フルスタックなWAF3 Ginを使ってみる3.1 クエリパラメータ+ポストパラメータ3.2 ファイルアップロード3.3 URLのグループ ...

Go言語

Go言語、ゴルーチン(goroutine)で並列処理を

1 はじめに2 ゴルーチン2.1 go文2.2 ゴルーチンの終了条件2.3 WaitGroup3 チャネル3.1 チャネルの型3.2 チャネルの生成3.3 チャネルの送受信3.4 チャネルとゴルーチン ...

js

Moment Timezoneを使ってJavaScriptで日付を変換する

1 はじめに2 Moment Timezone2.1 セットアップ2.2 使用例3 Moment Timezoneの機能3.1 タイムゾーンの一覧を表示する3.2 現在のタイムゾーンを表示する3.3 ...

フォロー

blog-page_side_responsive

2021年5月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。