Stripe & Firebase によるサブスクリプションのメモ
はじめに
Stripe & Firebase によるサブスクリプションを試した際のメモ。
TL;DR
- Stripe 公式の サブスク用 Firebase Extension を試した
- 導入後の Tips を簡単に整理した
- 購読状況の確認は Firestore の
status
とcurrent_period_end
を使えば OK - 購読キャンセルは Stripe でカスタマーポータルの設定を変更すれば OK
- 購読状況の確認は Firestore の
目次
環境・条件
1 | $ sw_vers |
詳細
Firebase Extension の導入
Stripe が公式提供している Firebase Extension があるのでそれを使う。
上記 Extension 中にも手順が書かれているが、以下の Qiita 記事をベースに作業するのがおすすめ。
Qiita 記事と似たような内容になるが、ざっくりやったこと概要。
- Stripe アカウント作成
- Firebase プロジェクト作成
- Firebase Extensions インストール
- Firebase Authentication 初期化
- Firebase Firestore 初期化
- Firestore ルール変更
- インストールした Extensions からコピペする
- Stripe extension の webhook 設定
- Stripe extension から webhook endpoint URL をコピー
- Stripe の webhook ページでエンドポイント追加
- 発行された secret を Stripe extension 側に設定
- 拡張機能の再構成
- 数分かかるので待つ。待たずに Stripe の商品作成とかやると反映されないので注意
- Stripe カスタマーポータル
- 設定 → カスタマーポータル → リンク → 利用規約/プライバシーポリシー
- Stripe 税率設定
- 税率ID をコピーしていおく
- Stripe 商品設定
- Firebase アプリ追加
- GitHub のサンプルコード をセットアップ
- DL(
git clone git@github.com:stripe-samples/firebase-subscription-payments.git
) public/javascript/app.js
を変更STRIPE_PUBLISHABLE_KEY
taxRates
firebaseConfig
functionLocation
- DL(
- サンプル実行
- ローカル:
firebase serve --project <your-project-id>
- デプロイ:
firebase use --add
してからfirebase deploy
- ローカル:
Tips
ここからは Firebase ExtensionsのRun Subscription Payments with Stripeを使ってサブスク課金をコードを書かずに実装する - Qiita に出てこない話を中心に記述。
購読状況の確認
何らかのプロダクトに Stripe & Firebase によるサブスクを導入したとして、ユーザーが現在サブスク購読中かどうかを確認したい場合の話。
(購読停止したユーザーには機能制限するなど)
Firebase ExtensionsのRun Subscription Payments with Stripeを使ってサブスク課金をコードを書かずに実装する - Qiita にも書かれている通り、購読状況は Firestore に格納される。
具体的には customers/xxxx/subscriptions/sub_yyyy
に格納される。
基本的には current_period_end
と status
だけ見れば良い(はず)。
1 | status === 'active' && |
上記をクエリできるように複合インデックスを作成しておく。(インデックス作成してないとエラーになる)
なお オレンジ枠内に書いてある通り、インデックスが必要なクエリを実行すると「このリンクでインデックス作ってね」と言われるので、そこから作る感じでも良いと思う。
1 | app.firestore() |
Node.js のコンソールで簡単に確認した。
参考: Firebase を JavaScript プロジェクトに追加する
まずは Firebase client SDK をインストール。
1 | $ npm i firebase |
以下、サンプルコード。
1 | const firebase = require("firebase/app"); |
個人的には Firebase の API Reference 分かりづらい(探しづらい)と思うので、リンク貼りつつ概要解説。
initializeApp
で初期化signInWithEmailAndPassword
で認証- 戻り値が
Promise<UserCredential>
(非同期) なので注意
- 戻り値が
currentUser
で認証済みユーザー取得uid
を Firestore のパス指定に使う
- サブスクは
/customers/xxxx/subscriptions/
以下に格納されているので、collection
でパスを指定し、where
で条件を指定し、get
でQuerySnapshot
を取得し、size
やempty
を見れば購読状況を判断できる- ドキュメント詳細を見たい場合は
docs
を使う
Auth での認証
Firestore のクエリ周り
定期購読のキャンセル
参考: Integrating the customer portal
Stripe のデフォルト設定のまま試すと、利用者(サブスク購読者)側からサブスクのキャンセルができない(はず)。
Stripe のダッシュボードで「設定」→「Billing」→「カスタマーポータル」にアクセスし、
「定期支払いをキャンセル」を有効にすると、カスタマーポータルからキャンセルできるようになる。
有効化後はカスタマーポータル上に「プランをキャンセル」ボタンが出てくる。
キャンセルすると Firestore の cancel_at
, canceled_at
などに反映される。
キャンセル後、カスタマーポータルには「プランを更新」ボタンが出てくる。
「プランを更新」すると、Firestore の cancel_at
, canceled_at
などがクリアされる。(画像略)
他にも色々と細かい設定ができるので、詳細は公式ドキュメント参照。(英語だけど)
まとめ
- Stripe 公式の サブスク用 Firebase Extension を試した
- 導入後の Tips を簡単に整理した
- 購読状況の確認は Firestore の
status
とcurrent_period_end
を使えば OK - 購読キャンセルは Stripe でカスタマーポータルの設定を変更すれば OK
- 購読状況の確認は Firestore の
その他・メモ
単発購入について
別記事で試した。
決済システムの導入にあたって
以下も合わせて要確認
- 「これは革命」とまでは言わないけれど、Webサービスへのサブスク導入がめちゃめちゃ楽なのでぜひ知って欲しいStripeのFirebase Extensions
- 決済システムを作るまえにこれだけは知っておこう - shiodaifuku.io
参考文献
- Firebase Extensions | Run Subscription Payments with Stripe
- Firebase ExtensionsのRun Subscription Payments with Stripeを使ってサブスク課金をコードを書かずに実装する - Qiita
- stripe-samples/firebase-subscription-payments - GitHub
- Firebase を JavaScript プロジェクトに追加する
- firebase/firebase-js-sdk: Firebase Javascript SDK - GitHub
- ウェブサイトで Firebase Authentication を使ってみる | Firebase
- Cloud Firestore を使ってみる | Firebase
- app | JavaScript SDK | Firebase
- auth | JavaScript SDK | Firebase
- firestore | JavaScript SDK | Firebase
- Cloud Firestore: Node.js Client - Home - Documentation
- Integrating the customer portal - Stripe
関連記事
- Stripe & Firebase による支払い処理のチュートリアル
- Chrome 拡張機能で Firebase Authentication の認証
- axios で添付ファイルありのリクエスト(multipart/form-data の POST)
- axios で unable to verify the first certificate の対応方法
- Node.js で firebase-admin を使ってサーバからプッシュ通知
- NestJS のチュートリアル
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア