Product
販売するソフトウェア本体です。1つの Product に価格、説明、サポート先、アクティベーション上限が紐づきます。
Concepts
Quickstartで出てくる言葉と、実装時に迷いやすい境界をまとめています。
販売するソフトウェア本体です。1つの Product に価格、説明、サポート先、アクティベーション上限が紐づきます。
購入後に発行されるキーです。ユーザーがアプリに入力し、アプリが Activatist API に送って検証します。ログに出してはいけません。
「この端末で使い始める」操作です。同じ端末の再アクティベーションは冪等で、別端末は activation_limit を超えると拒否されます。
端末を見分けるための匿名IDです。メールアドレスや氏名などの個人情報を入れず、安定したランダムIDを使います。
Boundary
https://license.souko.workLifecycle
| タイミング | 呼ぶAPI | 理由 |
|---|---|---|
| 初回ライセンス入力 | activate | この端末を利用枠として登録します。 |
| アプリ起動時 | validate | seatを増やさず、revoke/refund/expiredを確認します。 |
| 24時間に1回程度 | validate | 状態変化を反映しつつ、過剰なAPI呼び出しを避けます。 |
| ユーザーが端末解除 | deactivate | ポリシーが許す場合に利用枠を空けます。 |
| ネットワーク不通 | 短いgrace | 最後の成功状態を短時間だけ使い、復旧後にvalidateします。 |
Device Fingerprint
SDKを使う場合とHTTP APIを直接呼ぶ場合で、実装者がやることが変わります。
SDKが端末IDを生成・保存します。アプリ側はユーザー入力のlicense keyを渡すだけです。UUID v4相当のランダムIDなら衝突確率は実用上ほぼ無視できます。
アプリ側で安定した device_fingerprint を生成・保存してください。メール、氏名、電話番号、IPアドレス、raw hardware serial は使いません。
backendは端末IDのraw値を保存せず、HMAC hashとして扱います。アプリ側でもログには出さないでください。
Application Support 配下、可能なら Keychain。ファイル保存なら権限を絞ります。
AppData 配下、可能なら Credential Manager / DPAPI を検討します。
XDG config 配下に保存し、権限は 0600 相当にします。
EncryptedSharedPreferences や Jetpack Security を優先します。広告ID、電話番号、Googleアカウントなどの個人情報を使いません。
Activation
activate は「ライセンスキーが使えるか」と「この端末を利用枠に登録できるか」を同時に確認します。
Errors
| HTTP | 意味 | アプリ側の表示例 |
|---|---|---|
| 400 | 入力が不足、形式が不正 | 入力内容を確認してください。 |
| 403 | キーが使えない状態 | このライセンスは利用できません。 |
| 404 | 対象が見つからない | ライセンス情報が見つかりません。 |
| 409 | アクティベーション上限超過 | 利用可能な端末数の上限に達しました。 |
| 429 | 短時間にリクエストが多すぎる | 少し待ってから再試行してください。 |
| 5xx | 一時的なサーバー障害 | 時間をおいて再試行してください。 |
Safety Rules
ライセンスキー、completion token、buyer email、Firebase token、Bearer token、Stripe/Resend/R2/Cloudflare の秘密情報、presigned URL はログや共有メモに出さないでください。
device_fingerprint にメールアドレス、氏名、電話番号、住所などを入れないでください。ランダムIDを作って端末内に保存する方式が扱いやすいです。
起動時チェックは validate、端末登録は activate、端末解除は deactivate と役割を分けます。
Activatist は first-party software license 用です。ギフトカード、ポイント、第三者キー転売、C2C resale には使えません。