ライセンス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.有料機能のブロックと購入ページのトランジション

有料メニューのボタンをクリックします。

  1. verifyCached(licenseCode, machineCode, activationToken) 折り返し有効且つ期限が過ぎていません→通します;
  2. 無効に戻ります/有効期限が切れます/未活働→ウィンドウを弾くヒント"を購入して許可を活働させる必要があります";
  3. 生成します 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)です。