以下は、ユーザー向けポータルで提供する「マイライセンス一覧」ページの仕様および運用ガイドです。ブロックエディタにそのまま貼り付けて使えるよう、テキスト/リスト/コードのみで構成しています。
目的
- 購入済み(または発行済み)のライセンスキーの一覧表示
- キーの閲覧(マスク/フル表示の切替)・コピー
- アクティベーション状態(使用ドメイン数/残数)の可視化
- ドメインの解除(=スロット解放)
- プランのアップグレード開始(差額課金)
ここは「エンドユーザー(購入者)」が自分のライセンスをセルフサービスで管理する画面です。管理者は別途「管理画面>ライセンス」で同様の操作が可能です。
ページ構成(推奨UI)
- 見出し:マイライセンス
- サブヘッダ:メールアドレス(ログインユーザーのもの)と注意書き
- フィルタバー
- キーワード検索(製品名/ライセンスキーの一部でヒット)
- ステータス(active/expired/revoked)
- ソート(発行日/更新日/製品名/使用数)
- リストテーブル
- カラム例:
- 製品名(Product)
- ライセンスキー(マスク表示+[表示/隠す]・[コピー])
- ステータス(active / expired / revoked)
- 期限(Expires)
- 使用状況(Used / Limit / Remaining)
- アクション(ドメイン管理/アップグレード)
- カラム例:
- ページネーション(10〜50件/ページ)
表示データ仕様
- 製品名:AppCotton の「プロダクト」名称
- ライセンスキー:既定はマスク(
ABCD-****-****-WXYZ)- ボタン「表示/隠す」で切り替え
- ボタン「コピー」でフルキーをクリップボードにコピー
- ステータス:
active(使用可)/expired(期限切れ)/revoked(無効) - 期限:
YYYY-MM-DD HH:MM(未設定は—) - 使用状況:
used:現在アクティブなドメイン数limit:上限(-1は無制限)remaining:残り使用可能枠(無制限は∞表示)
できること(ユーザー操作)
1) ライセンスキーの閲覧・コピー
- 表示/隠す:マスク⇄フルのトグル
- コピー:クリックでフルキーをコピー(完了トースト表示)
2) ドメイン管理(解除)
- ライセンス行の「ドメイン管理」を押下 → モーダル表示
- モーダル内に現在アクティブなドメイン一覧(
domain/first_activated_at/last_checked_at) - 選択したドメインを解除(deactivate)すると枠が1つ空き、新しいサイトで再アクティベーション可能
- 解除後は使用状況カウンタを即時更新(AJAX)
3) プランのアップグレード開始(差額課金)
- 「アップグレード」ボタン → プラン比較ダイアログ
- 現在のプラン(例:3サイト)
- 目標プラン(例:5サイト/無制限)
- 差額(プロレートではなく差分のみ前提)
- 「進む」で**チェックアウト(Stripe)**へ遷移
- 成功後、ライセンスの
activation_limitが更新され、一覧にも反映
内部フロー(概要)
A. 一覧データの取得
- ログインユーザーIDをキーに、該当ユーザーのライセンスを取得
- 各ライセンスごとに
usage(used/limit/remaining/activations)を付与 - JSON をページに埋め込み or REST で逐次取得し、テーブル描画
B. ドメイン解除
- ライセンスキー+ドメインを指定して
/licenses/deactivateを呼ぶ - 成功時:
used/remainingを再計算し、テーブルを更新 - 失敗時:エラーをトースト表示(ネットワーク/権限/ドメイン不一致等)
C. 差額アップグレード
- 画面で目標プランを選択
/checkout(upgrade start)相当のエンドポイントで差額の支払いセッションを作成- Stripe 成功リダイレクト後、バックエンドでライセンスの
activation_limitを更新 - 一覧をリロードして新しい上限を表示
セキュリティと権限
- 本人のみ閲覧:ログイン必須。ユーザーIDまたはメールの照合でスコープ制限
- キー表示の既定はマスク:フルキーはユーザー操作時のみ表示
- CSRF:REST 呼び出し時に
X-WP-Nonceを必須化 - レート制限:連打対策としてキー表示/コピー/解除の頻度制御(前端またはAPI側)
エラー表示(利用者向け)
- ネットワークエラー:
- 「ネットワークエラーです。時間をおいて再度お試しください。」
- 権限エラー(未ログイン/他人のライセンス):
- 「この操作を行う権限がありません。」
- ビジネスルール(解除不可など):
- 「このドメインはすでに解除済みです。」
- 「上限に達しています。アップグレードをご検討ください。」
- 決済失敗:
- 「お支払いが完了しませんでした。もう一度お試しください。」
画面要素の最小セット(ブロック例)
- 見出し:
H2: マイライセンス - 段落: ユーザーの登録メールを表示(例:
example@domain.tld でログイン中) - 検索ブロック+プルダウン(ステータス/ソート)
- テーブルブロック(上記カラムを列で定義)
- ページネーション(ナビ)
- 注釈ブロック:
- 「※ ライセンスキーは既定でマスク表示されます。」
- 「※ ドメイン解除後、同じライセンスキーで別ドメインを再認証できます。」
REST/API 呼び出し(参考コード)
// 例:使用状況の取得(キーを入力済みの前提)
const res = await AppCottonLicense.getUsage('YOUR-LICENSE-KEY');
if (res && typeof res.used !== 'undefined') {
// used / limit / remaining / activations[] をテーブルに反映
}
// 例:ドメイン解除
const result = await AppCottonLicense.deactivate('YOUR-LICENSE-KEY', 'https://example.com');
if (result.success) {
// テーブル行の used/remaining を更新
} else {
// result.message をユーザに表示
}
よくある質問(FAQ)
Q. ライセンスキーが表示されない/コピーできない
A. ブラウザのクリップボード許可設定をご確認ください。HTTPS 環境での利用を推奨します。
Q. ドメイン解除をしても使用数が減りません
A. ネットワークキャッシュの可能性があります。数秒待ってから再読込。解消しない場合は管理者へお問い合わせください。
Q. 上限に達しました。どうすれば使えますか?
A. 「アップグレード」から上位プランに差額で変更可能です。あるいは使っていないドメインを解除してください。
運用メモ(管理者向け)
- 「設定>ポータル」からポータルページのスラッグや表示上限、並び順を調整可能にしておくと管理が楽です。
- 問い合わせ対応のため、**監査ログ(解除履歴/アップグレード履歴)**の保持を推奨します。
- 差額課金の計算は、「現在のプラン価格」⇄「目標プラン価格」の差分を原則とし、クーポンや期間限定価格の適用ルールを別途明記してください。
以上です。ユーザーはここからキー閲覧/ドメイン解除/アップグレードを自走でき、管理者の問合せ対応コストを大きく削減できます。