EC-CUBE×Stripeで疑似サブスクリプション

EC-CUBEとStripeを使って疑似サブスクリプション機能を追加したお話です。

QiitaにStripeの実装例を書きました。
https://qiita.com/dev_belltzel/items/32d3505f7bb68180cab6

なぜ疑似サブスクリプション?

Stripeにはサブスクリプションの機能があるのですが、その機能は利用していません。

なので、疑似サブスクリプションと勝手に言っています。
(サブスクリプション:以下サブスク)

Stripeのサブスク機能を使わなかった理由

いろいろ要望があったのですが、一番のネックは課金しない月(休む月)を設定したいという要望でした。

Stripeにはサブスクを一時停止する機能が追加されていたのですが、受注毎にAPIを叩かなければならないのと、現時点から〇月〇日までの期間でしか一時停止の設定が出来ないので(確かそのような設定だったはず。)、EC-CUBE側で制御した方が楽だと判断しました。

一時停止の制御を行うよりは、必要な時に決済を行う方が楽ですよね?ね?

他にも、Stripeのサブスク機能は日割り計算などがあり、今回の要望を満たす為に、その辺の制御も難しかったという事もあります。サンプルを作成して試した結果、他にも細かな理由はいくつかありました。

Stripeのどの機能を使ってサブスクを実現したのか

SetupIntentsというカード情報だけ収集する機能があります。
ここで収集したカード情報は、後からの支払いで利用できます。

毎月、課金のタイミングが来たら、SetupIntentsで収集したカード情報を使いPaymentIntentsで決済を行います。

参考にしたドキュメントはこちらです。
https://stripe.com/docs/payments/setup-intents

EC-CUBE側はどのように実装したのか

・商品
まず、商品種別を利用して通常商品とサブスクを設定できるようにします。

商品毎に休み月を設定できるようになるので、サブスク商品は商品毎にカートを別にしています。
これは、休み月が違う商品が同じオーダーになると、課金時に毎回金額を計算しなければならないので、カートは別にする仕様にしました。
(カートを別にしなければ大変すぎます。)

・受注
サブスクリプションの受注オーダーは親オーダーとし、子オーダーは課金時に親オーダーをコピーして作成するようにしました。

なので、受注データの種類としては
 1.通常商品のデータ
 2.サブスクの親データ
 3.サブスクの子データ
の3種になります。

EC-CUBE側で集計もしたいという要望もあったので、これで、集計の方は困らないと思います。

・課金のタイミング
サブスク課金のコマンドを作成してcronで動かすようにしています。

EC-CUBEのコマンド作成はこちら
https://doc4.ec-cube.net/customize_symfony#command

・決済結果
すべての決済が正常に終わるとは限りません。

決済の状態は大きく3つあり
 1.正常に決済完了
 2.3Dセキュアの認証が必要
 3.決済エラー(有効期限切れなど様々なエラー)
になります。

2、3の場合は会員のアクションが必要になるので、マイページの履歴から、認証やカード情報の変更が出来るようにしています。

・マイページの履歴
マイページには購入履歴がありますが、サブスク親用の履歴を作成しています。

決済エラーがあった場合は、サブスク親データの履歴詳細ページで、新しいカード情報を登録できるようにしています。

3Dセキュアの認証が必要な場合は、サブスク子データの履歴詳細ページで、3Dセキュア認証が出来るようにしています。
認証が通らない場合は、新しいカード情報を登録できるようにしています。

以上!
こんな感じでEC-CUBE×Stripeで疑似サブスクを実装したよ!!というお話でした。

いいなと思ったら応援しよう!