ライセンスSDK仕様です
vv3.1
ライセンスSDK仕様書(v3)です。
根拠です:
ps-help/v3/doc/售卖方式与授权购买链路_v3.md、ヘルプセンターライセンスです。_APIです_DOC (v3)です。 目標:Node / Python / Javaの3言語SDK動作一致(機械コード、署名、インターフェイス、キャッシュ、エラーコード、購入ページジャンプ)です。
1.機械式アルゴリズム(言語間一致)
同じマシンで同じ3言語のSDKを生成しなければなりません machineCodeです。
指紋の出所です優先順位です有効な値がとれたら停止します。
fingerprint = 硬件序列号 → 系统机器 ID → hostname | os | arch(兜底)
優先度1:ハードウェアシーケンス番号(BIOS SN、再インストールしても変わりません)
| システムです | ソースです | 入手方法です | 権限です |
|---|---|---|---|
| Windowsです | BIOS SerialNumberです | wmic bios get serialnumberダウングレードされたパワーシェルです Get-CimInstance Win32_BIOS)です。 |
一般ユーザーです |
| macOSです | ハードウェアシリアル番号です | system_profiler SPHardwareDataType 抽出します Serial Number |
一般ユーザーです |
| Linuxです | シリアル番号です | 読みます /sys/class/dmi/id/product_serial降格です dmidecode -s system-serial-number)です。 |
rootが必要です |
優先度2:システムマシンID(インストール時に生成し、同机は変更しません)
| システムです | ソースです | 入手方法です | 権限です |
|---|---|---|---|
| Windowsです | MachineGuid | 登録フォームです。 HKLM\SOFTWARE\Microsoft\Cryptography |
一般ユーザーです |
| macOSです | IOPlatformUUIDです | ioreg -d2 -c IOPlatformPlatformDevice |
一般ユーザーです |
| Linuxです | machine-idです | 読みます /etc/machine-id降格です /var/lib/dbus/machine-id)です。 |
全ユーザーです |
優先度3:ポケットの底(hostname)です。 | osです | archです)
ハードウェアシリアル番号とシステムマシンIDの両方の取得に失敗した場合に使用します。
| フィールドです | ノードです | Pythonです | Javaです |
|---|---|---|---|
| hostnameです | os.hostname() |
socket.gethostname() |
InetAddress.getLocalHost().getHostName() |
| osです | os.platform() |
sys.platform |
System.getProperty("os.name") |
| archです | os.arch() |
platform.machine() |
System.getProperty("os.arch") |
一括処理します。
- すべてのフィールドは首尾空白を取り除き小文字を回します;
- フィルタメーカーのポジション値です(
To be filled by O.E.M./None/0/Default/Not Available/Not Specified)です; - パッチワークは統一されました
|全体的に再構築しますtoLowerCase()です。
machineCode = 'M' + base64url( sha256( fingerprint ) ).slice(0, 32)
machineCode 少なくとも8ビット、プラットフォーム全体で唯一、SDK内部キャッシュ(プロセス内)です。
2.署名ルール(software/generate、software/upgrade必須)
署名列は固定の順序で、改行区切り(デフォルト穴埋め値:edition 空串です。expiryDays 0です。licenseCode 空串です):
productUniqueCode \n machineCode \n edition \n expiryDays \n clientOrderId \n licenseCode \n timestamp
signature = base64url( HMAC-SHA256( licenseApiSecret, 签名串 ) );timestamp ミリ秒で、プラットフォームチェックとサーバーの時間差≦5分(再生防止)です。
3インターフェースリストです
プレフィックス:ですhttps://www.powersoftware.app/frontApi(通れます baseUrl )をカバーします。
| インターフェースです | 経路です | 権限を認めます | SDKメソッドです |
|---|---|---|---|
| 活性化します | POST /license/activate |
ありません | activate(licenseCode, machineCode) |
| チェックです | POST /license/verify |
ありません | verify(licenseCode, machineCode, activationToken) |
| 縛りを解く | POST /license/deactivate |
ログイン(ブラウザのシーン)です。 | deactivate(licenseCode, machineCode) |
| ソフト内コード化です | POST /license/software/generate |
HMAC署名です | generateForSoftware({...}) |
| ソフト内アップデート/継続料金です | POST /license/software/upgrade |
HMAC署名です | upgradeForSoftware({...}) |
| お試し受給です | POST /license/trial/claim |
ありません | claimTrial(machineCode) |
generateForSoftware / upgradeForSoftware 自動補充です timestamp + signature;claimTrial 製品は前払いです。
4.ローカルな信用証明とチェックキャッシュです
- 地元ですただ残るだけです:です。
licenseCodeです。activationToken最近のverifyの結果ですが{ valid, edition, expiryTime, trialExpiryTime }+タイムスタンプです)。trialExpiryTimeは試用期限スナップショット(ISO8601、試用からのアップグレードでない場合はnull)で、上位機能の猶予期間として利用できます。 - 貯蓄しません復号可能な完全な許可情報(逆解読は無意味で、キャッシュとしてのみ使用されます)。
- キャッシュを検査しますTTL 60s:有料機能をクリックする時先にキャッシュを調べて、期限が過ぎていないで直接使います;使用期限が切れたか、失敗した場合は再調整します。
verifyです。 - サービス側の取り消し/払い戻し/アップグレードはアクティブにキャッシュを無効にします(プラットフォーム側は実装済み)、SDKは感知する必要はありません。
5.有料機能のブロックと購入ページのトランジション
有料メニューのボタンをクリックします。
verifyCached(licenseCode, machineCode, activationToken)折り返し有効且つ期限が過ぎていません→通します;- 無効に戻ります/有効期限が切れます/未活働→ウィンドウを弾くヒント"を購入して許可を活働させる必要があります";
- 生成します
machineCode購入ページにジャンプします。productUniqueCode機械コードを携帯します
https://www.powersoftware.app/product/license/purchase?productUniqueCode={productUniqueCode}&machineCode={machineCode}
(多言語サイトはパスの前に言語接頭辞を付けます。 /en-US/product/license/purchase;productUniqueCode コンストラクターから入ってきます。)
5.1購入ステーション選択です:.app(国際駅です)vs .cn(国内駅です)
冪スタックには2つのサイトがありますSDKの purchaseUrl() 通過します base パラメータ切り替えます:
powersoftware.app(国際駅です) |
powersoftware.cn(国内駅です) |
|
|---|---|---|
| 支払い方法です | アリペイ+ペイパル | アリペイだけです |
| 国/通貨です | CloudflareはIPで自動認識します(CN→CNY、その他→USD) | 固定します country=CN人民元です |
| 言語です | URLプレフィックスを押します/ Accept-Language 自動検出です |
固定します zh-CN |
| 適用ユーザーです | 国際ユーザー/海外です | 中国大陸のユーザーです |
SDKデフォルトです .app自動判断はしません。 どちらを送るかはクライアントソフトが決める必要があります baseです。
判断の仕方です
①システム別言語(推奨)です。
import locale
def get_purchase_base():
sys_lang = locale.getdefaultlocale()[0] or ""
if sys_lang.startswith("zh"):
return "https://www.powersoftware.cn"
return "https://www.powersoftware.app"
function getPurchaseBase() {
const lang = process.env.LANG || "";
return lang.toLowerCase().startsWith("zh")
? "https://www.powersoftware.cn"
: "https://www.powersoftware.app";
}
String getPurchaseBase() {
return "zh".equals(Locale.getDefault().getLanguage())
? "https://www.powersoftware.cn"
: "https://www.powersoftware.app";
}
その2:ユーザー設定項目です ——設定画面に「地域」を提供し、ユーザーが選択します。
方法その3ハードコーディングです ——国内ユーザー向けのソフトだけが、そのまま死んでしまいました。 base="https://www.powersoftware.cn"です。
詳しく見ます 语言与国家逻辑 2.4です。
6.エラーコード(SDKドロップエラー一括携帯errorCode)です。
codeNotFoundです。revokedです。expiredです。machineLimitです。tooManyAttemptsです。signatureInvalidです。apiSecretMissingです。productNotEnabledです。trialNotEnabledです。trialAlreadyPurchasedです。trialAlreadyPurchasedです。trialAlreadyPurchasedです。machineCodeInvalidです。orderAlreadyUsedです。editionRequiredです。productNotFoundです。trialFirstRequiredです。alreadyOwned などです;ネットワーク/タイムアウトエラーを統一します。 NETWORK_ERRORです。
7.パッケージ構造です
ps-sdk/
node/ @mizhanchengxi/ps-license-sdk(ESM,零依赖)
python/ ps-license-sdk(py3,零依赖)
java/ com.powersoftware:sdk(Java 8+,JDK 自带 HTTP/加密)
3つのパッケージはすべて提供します:machineCode()です。sign()です。LicenseClient(上記6つの方法+ verifyCached + purchaseUrl)です。