AppCotton のライセンスは、単に「ライセンスキーが正しいか」だけではなく、
どのドメインで使用されているか を検証することで正当な利用を保証します。
これにより、複数サイト・代理店・開発環境など、さまざまな使用シーンで柔軟に対応できます。
認証の基本フロー
アプリ / プラグイン側のコードから、AppCotton API に対して POST リクエスト を送信します。
/wp-json/appcotton/v1/licenses/validate
送信される情報:
| キー | 説明 |
|---|---|
license_key | ユーザーが入力 / 保持しているライセンスキー |
product_slug | 製品識別子(例: combpass_premium) |
domain | 現在動作しているサイトのドメイン(正規化前でも可) |
site_url | フルURL(オプション・履歴確認用) |
AppCotton側での確認処理
リクエストを受け取ったサーバー側では、順に以下のチェックを行います。
1. ライセンスキーが存在するか?
存在しない → invalid_license
2. ライセンスが active 状態か?
expired → expired_license
revoked → revoked_license
3. product_slug が一致しているか?
キーが別製品向けなら → wrong_product
4. ドメインを正規化(normalize)する
例:
https://www.example.com/ → example.com
http://sub.example.com → sub.example.com
クエリ・トラッキング → すべて無視
5. ドメインがすでに登録されているか?
- すでに登録済み → そのまま
last_checked_at更新 - 未登録 → 次のステップへ
6. 利用可能サイト数のチェック(activation_limit)
| 状況 | 判定 |
|---|---|
| 登録済み + 新規ドメイン < サイト数上限 | ✅ 新規登録(アクティベーション) |
| 上限に達している | ❌ domain_limit_reached |
アクティベーション保存の仕組み
新しいドメインが認証された場合、以下のように記録します:
wp_appcotton_license_activations
license_id: ライセンスID
domain: 正規化後のドメイン
status: active
first_activated_at: 現在日時
last_checked_at: 現在日時
既存登録ドメインの場合は、last_checked_at のみ更新します。
なぜ last_checked_at を更新するのか?
- ライセンスが本当に「利用され続けている」か追跡できる
- 長期間アクセスされていないサイトを「自動整理」できる
- 制作会社が引き渡し後に使用状況を確認できる
解除(deactivation)
ユーザーは「不要になったドメイン」をマイページから解除できます。
status: active → deactivated
解除後:
利用可能サイト数 = 残り枠 + 1
→ 新しいサイトで再利用可能
同じサイト内でのマルチ環境対応
必要に応じて、開発 / 本番を区別するために instance_id を使うことができます。
例:
| 環境 | instance_id |
|---|---|
| localhost:8888 | dev |
| staging.example.com | staging |
| example.com | production |
認証結果レスポンス例
成功(active)
{
"status": "active",
"licensed": true,
"remaining_slots": 2
}
上限超過
{
"error": "domain_limit_reached",
"message": "ライセンスの使用可能数を超えています。不要なドメインを解除してください。"
}
期限切れ
{
"error": "expired_license"
}
まとめ
1. アプリが API に license_key + domain を送信する
2. サーバー側でライセンス状態をチェックする
3. ドメインを正規化し、使用状況テーブルに記録する
4. サイト数上限・期限切れ・取り消しが自動反映される
5. ユーザーは不要ドメインを解除して再利用可能