Stripeで月額課金サービスを実装してみる

はじめに
作成したアプリケーションに月額課金制を導入してみたかったのでやってみました。
実装にあたって、Stripeというサービスを利用しています。
今回はよく使いそうな関数等をまとめてDLLとして配布しています。
Stripeとは
オンライン決済サービスの1つで、とても簡単に決済サービスを導入できるサービスです。
一見めんどくさそうなオンライン決済処理ですが、Stripe提供のAPIによって非常に簡潔に構築できます。敷居の高かったオンライン決済のスタートアップを容易にする非常に優れたプロダクトであるといえます。
DLL配布場所と使い方
こちらの記事にて、配布&使い方紹介をしています。
前準備
Stripeの登録
Stripeへアクセスし、アカウントを作成します。
作成後にダッシュボードが表示されますが、後述のメールアドレスの確認の際に新しくページが立ち上がるのでここでは閉じてください。

メールアドレスの確認
アカウント作成時のメールアドレスに確認メールが届いていると思うのでリンクをクリックしメールアドレスの確認をしてください。確認と同時に、ダッシュボードが表示されます。
確認が出来たら表示されているメッセージは閉じてください。

電話番号の登録
テストでの使用であっても、電話番号の確認が必要なようです。
こちらからStripeの電話番号の登録ページに飛ぶので登録してください。
顧客情報を作り、クレジットカードの情報を登録する際に電話番号の確認メールが届くのでそちらからでもよいです。
APIキーを確認
プログラムで使用するAPIキーの取得を行います。
テスト環境は既に作成されており、キーも既に発行されているのでコピーを行うだけです。
画面左のメニューから「開発者」を選択して、次に「APIキー」を選択します。
Standard Keysのシークレットキー(テスト用)を表示してコピーします。
※後々使うのでメモ帳にでもコピーしておいてください。

商品と料金プランの登録
商品の登録と料金プランの作成を行います。
Stripeでは1商品に対して複数の料金プランを作成することが可能です。
プログラムから作成することも可能ですが、ダッシュボードが非常に優秀なのでダッシュボードから作成してみましょう。
画面左のメニューから、「商品」を選択します。
まだ商品は1点もありません。では追加してみましょう。

商品の追加時に、商品の情報を入力する必要があります。
決済方法や商品名などです。今回は月額課金サービスなので、定額利用する商品で進めます。次は料金プランの設定です。

料金プランの設定です。設定も非常にわかりやすいので悩むことはないと思います。
料金体系は「定額利用」とします。
「利用状況に基づく請求」というのは所謂、従量課金制のことで一定量の利用料に対して請求を行う料金プランです。

商品と料金プランの作成が完了しました。
作成した料金プランのIDを控えておく必要があるので料金プランを確認します。
画面の中段にある料金プランから先ほど作成した料金プランを選択します。

料金プランの詳細ページが表示されたら、画面上部の料金プランIDをコピーします。
(下記画像の赤枠部分です。)

これで一通り準備が完了しました。
次はここで作成した料金を顧客に紐づけたいと思います。
顧客情報はプログラムから登録して、ユーザー(私)に入力させたいと思います。
システムの構築
どんなシステムにするか
今回はユーザー登録から行い、サブスクリプション対象としたい機能の画面を表示するところまで行いたいと思います。
必要な機能の洗い出し
以下の画面が最低限必要であることがわかります。
- ユーザー登録画面
- ログイン画面
- サブスクリプション対象画面
今回はログイン画面を最初に表示して、登録を行っていないユーザーはログインできないのでユーザー登録画面へ遷移してもらい、登録後にログインしてもらうような作りにしたいと思います。
画面は誰でも表示できるが、機能は月額課金している人だけを対象に使用できるような形にしてみます。
プロジェクト作成
今回はC#.Netで開発を行います。
新規のプロジェクトで「Windowsフォームアプリケーション」を選択しプロジェクトを作成します。
名称は適当で大丈夫です。私は「SubscriptionTest」としました。

機能 (のようなもの) 作成
流石に何もないただのフォームが表示されても悲しいので、好きなコントロールでも配置してください。
私は「お金!ありがとう!」の文字が設定されたLabelを配置しました。
月額課金をしている人の場合には表示して、その他の場合は非表示で使用予定です。初期値は非表示に設定しています。
正直フォーム型である必要はありません。気分です。

Nugetパッケージのインストール
Stripe公式のパッケージをインストールします。
ソリューションエクスプローラーから「NuGetパッケージの管理」を押下します。

NuGetパッケージマネージャーのタブが開くので「参照」タブを選択して検索ボックスに「Stripe.net」と入力しましょう。
検索結果からStripe.netをインストールしてください。

DLLの参照設定
私が作成したDLLの参照設定を行います。
ソリューションエクスプローラーから「参照の追加」を押下します。
ダウンロードしていない方はこちらからどうぞ。

画面右下の「参照」ボタンからダウンロードしたDLLを選択して追加してください。


以上で参照設定は完了です。
続いて実装に移ります。
実装とソースコード
今回ログイン画面とユーザー登録画面については、DLL内に最小構成のログイン画面とユーザー登録画面を実装していますので、そちらを使用します。
SMS認証での本人確認や、メールアドレス存在確認など凝ったことをしたい方は使わないで自分で実装してください。
最小構成ですが、一応パスワードの暗号化くらいは行っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
using System; using System.Windows.Forms; using System.Linq; using Stripe; namespace SubscriptionTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } // DLLのインスタンス生成 StripeSubscription.Methods stripe = new StripeSubscription.Methods(); private void Form1_Shown(object sender, EventArgs e) { // APIキーを設定 StripeConfiguration.ApiKey = "sk_test_XXXXXXXXXXXXX"; // DLLで使用するAPIキーを設定 stripe.ApiKey = StripeConfiguration.ApiKey; // ログイン画面表示 // 返り値は顧客情報(ユーザー情報) // ログインできなかった場合はnullを返却 var cus = stripe.LoginFormShow(); // ログインできたかの判定 if (cus != null) { // 有効なプランの存在確認 var query = cus.Subscriptions.Any(x => x.Plan.Active && x.Plan.Id == "plan_FwSwPSELag9Bzb"); if (query) { // 存在する場合 label1.Visible = true; } else { // 存在しない場合、ユーザーに課金するか聞いてみる。 var result = MessageBox.Show("課金する?", "課金を促すメッセージ", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { // 月額課金プランの設定 stripe.SetPlan(cus.Id, "plan_FwSwPSELag9Bzb"); // プラン設定後、課金完了とみなす label1.Visible = true; } } } } } } |
APIキーの設定
コピーしておいたキーを設定してください。
設定以降、作成したStripeアカウントへの接続となります。
1 |
StripeConfiguration.ApiKey = "sk_test_XXXXXXXXXXXXX"; |
ログイン画面の表示
DLL側で処理を行っているので、記載はこれだけです。
ログインできた場合のみ顧客情報が返却され、ログインできない場合はnullが返却されます。
実用する際は関数を呼び出す前にフォームは非表示にした方が良いです。
1 |
var cus = stripe.LoginFormShow(); |
有効なプランの確認
プランが有効かつプランIDが一致するものがあるか判定を行います。
コピーしておいたプランIDを設定してください。
1 |
var query = cus.Subscriptions.Any(x => x.Plan.Active && x.Plan.Id == "plan_FwSwPSELag9Bzb"); |
プランの設定
有効なプランがない場合はユーザーに課金するかを問います。
実際には金額がいくら、請求頻度がどれくらい、利用規約なども色々表示したりする必要があると思いますが、あくまでテストなので今回は最小限のメッセージで行いました。
プラン設定後もプランが正しく設定され、有効になったことを確認した方がいいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 |
// 存在しない場合、ユーザーに課金するか聞いてみる。 var result = MessageBox.Show("課金する?", "課金を促すメッセージ", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { // 月額課金プランの設定 stripe.SetPlan(cus.Id, "plan_FwSwPSELag9Bzb"); // プラン設定後課金完了とみなす label1.Visible = true; } |
実行結果
カード情報はStripeテスト用カードを使用して以下のようなユーザーを登録してみます。
氏名:まりも
メールアドレス:info@marimox.net
パスワード:11223344
カード番号:424242424242
有効期限(月):03
有効期限(年):2020
CVC:123
カード名義人:MARIMO
ユーザー未登録でのログイン
まずは初期状態でログインを試みます。

もちろんログインすることはできません。
×ボタンでログイン画面を消せますが、フォームには何も表示されません。

ユーザー登録
ログイン画面のログインボタンの下に配置しているリンクを選択すると、ユーザー登録画面が立ち上がります。
ユーザーを登録してみましょう。

ユーザー登録が正常に終了して、メッセージでOKを選択するとログイン画面に戻ります。
プラン未設定でのログイン
わかりにくいですが、ログイン画面にはユーザー登録画面で登録した内容が自動的に反映されるようになっています。ではログインしてみましょう。

ユーザー登録は行ったものの、まだ課金はしていないので課金を促すフランクなメッセージが表示されました。課金を行ってみましょう。

出ました。お金!ありがとう!
次からは課金を促すメッセージ無しでログイン可能です。

一応ダッシュボードで顧客情報(ユーザー情報)を確認してみます。
ちゃんと「まりも」という顧客が作成され、定期支払の登録もできています。

以上です。
まだ、実装するにあたり考慮すべきことはたくさんありますが、ベースとしてはこんな感じで作ればいいというのがわかりました。
ディスカッション
コメント一覧
元木さん
コメントありがとうございます。
サイト自体を会員制サービスにする場合はいくつかプラグインがあったかと思います。
プログラムや、ファイルなど、サイトとは分離しているものを課金対象としたい場合にはPHPではなかったとしても何かしらのプログラムを書く必要がありそうですね。
はじめまして。
Stripeを使って月額の課金サービスを開始したいと思ったのですが、
PHPが全くわからず、Stripe Paymentsというプラグインを導入しました。
しかし、月額での課金ができないようで手詰まりです。
何かほかに方法はないでしょうか…?ご回答いただけますと幸いです。