generated at
baberu: 課金機能を作る
モチベーション
課金の実装をしてみたい

要件
1ユーザー2週間使用期間を設ける
それ以上使う場合には買い切り1000円

しくみ
mermaid
sequenceDiagram actor User participant BOOTH participant Developer participant Firestore participant ChromeExt as Chrome拡張 participant CloudFunction User->>BOOTH: 製品購入 BOOTH-->>Developer: 購入通知 Developer->>Developer: UUIDベースのライセンスキー生成 Developer->>Firestore: ライセンス情報登録 Developer-->>User: ライセンスキー送信 User->>ChromeExt: インストール User->>ChromeExt: ライセンスキー入力 User->>ChromeExt: Googleアカウントでサインイン ChromeExt->>CloudFunction: ユーザー情報とライセンスキー送信 CloudFunction->>Firestore: ライセンス検証 alt ライセンスが有効 Firestore-->>CloudFunction: 検証OK CloudFunction->>Firestore: ユーザーIDとライセンスキーを関連付け CloudFunction-->>ChromeExt: アクティベーション成功 ChromeExt-->>User: アクティベーション完了通知 else ライセンスが無効 Firestore-->>CloudFunction: 検証NG CloudFunction-->>ChromeExt: アクティベーション失敗 ChromeExt-->>User: エラーメッセージ表示 end

GPT-4o全体のフロー
デベロッパー側の対応:
BOOTHで購入があった際に、デベロッパーは注文番号からUUIDベースのライセンスキーを手動で生成します。
Firestoreに次のようなcollectionを作成する
yml
licenses (コレクション) └── {licenseKey} (ドキュメントID、例: "c2b1e4b0-8f29-11e9-b475-0800200c9a66") ├── userId: "firebase-user-id-12345" ├── orderNumber: "123456789" ├── issuedAt: (発行日時のタイムスタンプ) ├── isActive: true ├── linkedAt: (ユーザーに関連付けられた日時のタイムスタンプ) └── userId: null // 初期状態ではnull、ユーザーが登録後に更新される
購入者にメール等でライセンスキーを送信します。
この時点ではユーザーのGoogle認証情報は不明です。
ユーザー側の対応:
Chrome拡張をインストール後、ユーザーは設定画面でライセンスキーを入力し、Googleアカウントでサインインします
Chrome拡張での処理:
Chrome拡張はユーザーのGoogle認証情報(user.uid)と入力されたライセンスキーをFirebaseのCloud Functionに送信します。
yml
licenses (コレクション) └── {licenseKey} (ドキュメントID、例: "c2b1e4b0-8f29-11e9-b475-0800200c9a66") ├── linkedAt: (ユーザーに関連付けられた日時のタイムスタンプ) └── userId: 12345
ライセンスの検証と登録:
Firebase Cloud Functionは、Firestore内でライセンスキーが存在し、未使用かつ有効であることを確認します。
未使用かどうかは if(userId==null) で判定する基素
出鱈目なライセンスを打っても、デベロッパーがlicensensに登録していないので有効にならない
ライセンスが有効であれば、user.uidとライセンスキーを関連付け、Firestoreにユーザー情報を登録します。
ライセンスの無効化基素
isActiveをfalseにする
注意点基素
licensesの発行方法は予測されてはいけない
UUID4を使う


検討 v1

ユーザーの認証と課金情報を実装する必要がある
Firebase + stripeでやろうかと思ったが、特定商取引法を守るのが困難
やっている人を見かけたが、普通に守ってなかった。厳密に突っ込まれれば違法になるだろう
ソフトウェアを「匿名」(消費者はlegal actionをとることができ、とる際には顕明になるレベルでの匿名)で販売する方法があまりない
文章やイラストやデータの販売はBoothやnoteの企業努力によってこのレベルまでは実現できている
というわけで、boothでのライセンス販売をする
どうやってるんだろう?
>Boothの購入処理を確認する関係上、引き換えコードの発行は最大で12時間かかることがあります。
手動で運用している可能性がある基素
boothの購入履歴からメールアドレスを取得して一括で送るプログラムを使っているとかかなぁ
実装を検討した。いけそう。