うむ、これは手順書化した方がいい★
Gumroad公式を現行仕様で確認してきた。今回の「1購入=1サイト」の軽量戸締まりは、GumroadのLicense Keyとusesを使えば組める。重要なのは、Gumroad自身が1サイト制限をしてくれるわけではなく、Kaia側がusesを見て制御すること。Gumroad公式も「enforcementはcreator側」と明記してる。(Gumroad)
Planet投入用ならこれでいける。
Gumroad One-License / One-Site Lock Rule
Purpose: Kaia Specの買い切りWordPress製品について、通常利用者に対して「1購入ライセンスキー=1サイト」の軽量な利用制限を設ける。
Table of contents1. Scope
これは強固なDRMではない。
目的は、購入者が同じZIPと同じLicense Keyを別サイトへそのまま持っていき、通常のWordPress操作だけで複数サイト利用することを防ぐこと。
コード改変・DB直接編集など、意図的な技術的回避への完全対抗は目的としない。
2. Gumroad側の準備
対象商品でLicense Keyを有効にする。
Gumroadの商品Content編集画面から、
Insert → License key
を追加する。
ここに表示される対象商品のProduct IDを取得する。
2023-01-09以降に作成された商品では、License Verify APIに
product_idが必要。顧客にはGumroadがLicense Keyを発行する。
顧客は購入メール、ダウンロードページ等からLicense Keyを取得できる。
3. WordPress側のActivation UI
未認証状態では、Kaia製品の管理画面に最低限のLicense Activation UIを表示する。
必要要素:
- License Key入力欄
- Activateボタン
- 成功/失敗表示
認証後は完全なLicense Keyを画面へ再表示しない。
表示例:
License: Active
4. Activation — Step A
ユーザーがActivateを押したら、まずGumroad License Verify APIへ確認だけ行う。
Endpoint:
POST https://api.gumroad.com/v2/licenses/verifyParameters:
product_id
license_key
increment_uses_count=false最初から使用回数を増やしてはいけない。
Gumroadは
increment_uses_countを省略するとデフォルトで使用回数を増やすため、事前確認では必ずfalseを明示する。
5. Activation — Step B
API結果を確認する。
最低限確認:
success == true- 対象Product IDが正しい
uses == 0refunded == falsedisputed == falsechargebacked == false条件を満たさない場合はActivationしない。
uses >= 1の場合:このLicense Keyは既に使用されている
として拒否する。
サイト移転の場合はKaia Specへ問い合わせるよう案内する。
6. Activation — Step C
未使用で正常なLicense Keyだった場合のみ、もう一度Verify APIを呼ぶ。
今度は:
increment_uses_count=trueとする。
Gumroadの
usesが1増える。成功し、返却された
usesが想定どおりになったことを確認してからローカルActivationを確定する。
7. Local Activation State
WordPress側には最低限、
- Activated状態
- 対象Product
- 現在サイトのSite Identity
を保存する。
Activation後の通常アクセスでGumroad APIを毎回呼ばない。
License Keyそのものも、Activation後の常時保存が不要なら保存しない。
8. Site Identity
Activation時のWordPressサイトを識別できる値を保存する。
現在サイトと保存済みSite Identityが一致している場合:
→ Activated
DBを別サイトへコピーする等してSite Identityが変わった場合:
→ Activated扱いにしない
→ 再Activationを要求
これにより、一般的な「WPサイト丸ごと複製」でActivation状態までコピーされるケースも軽く防ぐ。
Site Identityの具体的な正規化方式は実装時に固定し、製品間で共通LEGO化する。
9. Normal Runtime
一度正常Activationされたサイトでは、
ページ表示のたびに
increment_uses_count=trueを送らない。Gumroad公式仕様では、License Verifyは指定しなければ
usesを増加させるため、単なる確認処理で誤って使用回数を増やさないこと。
10. Second Site
同じZIPとLicense Keyを別のWordPressサイトへインストールした場合:
新サイトにはローカルActivationがない。
↓
License Key入力
↓
increment_uses_count=false↓
Gumroad response:
uses >= 1↓
Activation拒否
表示例:
This license is already in use on another site.
If you are moving your site, please contact Kaia Spec for a license transfer.
11. License Transfer
正規のサイト移転では、新しいLicense Keyを発行し直すことを基本動作にしない。
顧客から:
- 購入時EmailまたはLicense Key
- 旧サイトURL
- 新サイトURL
を確認する。
Kaia Spec側で購入を確認する。
Gumroad Sales Dashboardから対象購入を開き、License KeyのUsesをResetして0へ戻す。
その後、新サイトで同じLicense KeyをActivationしてもらう。
Gumroad公式ではUsesをResetして0へ戻すことができ、±1または任意値への編集も可能。
この運用を License Transfer / ライセンス移転 と呼ぶ。
12. Failure Handling
Gumroad APIに接続できない:
→ 使用済み扱いにしない。
→ Activation失敗/通信失敗として再試行を案内。
Invalid License:
→ Activationしない。
Used License:
→ Activationしない。
Refunded / disputed / chargebacked:
→ Activationしない。
APIエラーを「ライセンス使用済み」と誤認しない。
13. WordPress Safety
Activation処理にはWordPress標準の管理者権限確認とnonceを使用する。
API通信にはWordPress HTTP APIを使用する。
License Keyをログへ不用意に出力しない。
HTMLへ完全なLicense Keyを再出力しない。
Kaia Spec独自サーバーへLicense Key・購入Email・サイトURLを送信する仕組みは、この方式には不要。
GumroadとのLicense Verify通信だけで成立させる。
14. Pre-release Test
製品化前に最低限以下を実機確認する。
- 未使用の正規Key → 1サイト目Activation成功
- 管理画面Reload → Active維持
- Plugin deactivate → reactivate → Active維持
- 同じKeyを2サイト目へ入力 → 拒否
- 不正Key → 拒否
- Gumroad通信失敗 → 誤ってUsesを消費しない
- Gumroad Uses Reset → 新サイトでActivation成功
- Site Identity変更 → ローカルActivationを引き継がない
- Counter既存データ・Refill・Stock等へ影響なし
15. Reuse / LEGO Boundary
この仕組みはCounter固有コードに埋め込まない。
Gumroad One-License / One-Site Lockとして切り出せる構造を維持する。
製品ごとに交換する値は原則:
- Product ID
- Product name / slug
- 表示文言
その他のActivation、Uses確認、Site Identity、Transfer前提、エラー処理は共通LEGO候補とする。
Counter Standardで実機検証後、Timestamp Standard、Serial Standard等へ再利用する。
これ、公式仕様との対応もかなり綺麗。GumroadはLicense Keyの検証、usesのカウント、返金・紛争状態などを返せるし、Usesは販売管理画面からResetできる。(Gumroad)
一点だけ実装前に決め打ちしない方がいい箇所がある。Site Identityの正規化だな。https/http変更、www有無、サブディレクトリ型WPなどを「同じサイト」とする境界は、RCへ封入するときに実物を見ながら一回決める。ここを手順書で適当に固定すると、後で正規ユーザーを自分の罠に引っ掛けるw
あと、これを実装するにはCounter Standardの商品用Gumroad Product IDが必要。これはLicense Keyブロックの商品編集画面に表示される。(Gumroad)
というわけで、Planetにはこれを製品横断LEGO候補の手順書として置いていいと思う。Counterで実機通ったら「候補」を外して実証済みにできる★


No comments yet.