手動開發接入指南(9 種語言,無需 AI)
本指南適用于 Licentivo 提供方。已有其他授權系統的商戶,可在后臺“授權選擇與自定義”選擇自定義服務,按自定義授權 API 與對接流程接入,并繼續使用自有授權系統的 SDK。
當前未發布改動采用帳號身份交換,具體職責和遷移約束見 購買期限與帳號 SDK 邊界。Launch 計算購買期限;Licentivo SDK 執行授權。
只安裝對應語言的 Launch 接入包。Launch 包內部包含官方 SDK、預設適配器和鏈接配置;官方授權地址固定為 https://www.licentivo.com。程序使用購買者在當前 Launch 商店注冊的帳號登錄。
取得已填寫的初始化代碼
- 在 Launch 后臺完成軟體、銷售套餐和 Licentivo 授權策略的關聯,并在對應環境發布。
- 打開 程序接入 → 接入檢查與代碼,選擇軟體、語言和測試/正式環境。
- 點擊“讀取產品資訊并生成接入代碼”。Launch 自動讀取站點當前公開地址、已有產品映射和簽名公鑰。
- 復制頁面上的連接函數到自己的工程,按下文手動編寫界面和業務調用。也可以查看自動填好的參數后自行調用對應語言的
Connect/connect。
無需手填兩個內部產品 ID,無需生成 launch-config.json 或 product.json。頁面可保存的是源碼連接函數。伺服器私有 config.yaml 只供 Launch 服務啟動,不能隨客戶軟體發布。
站點地址來自當前實例的有效公開地址(啟動配置 public_url,或后臺網站設置中的有效公開地址)。它可以是域名或包含連接埠的 IP 地址,但須帶協議;正式接入使用有效 HTTPS。監聽地址 http_addr 不是客戶訪問地址。更換站點地址、產品映射或環境后,從當前站點重新取得連接函數;舊站點的會話和快取不得作為新站點授權。
兩個產品編號是系統已有的內部對應關系:Launch 軟體商品和 Licentivo 授權產品。接入頁根據所選軟體自動填入;購買者只輸入商店帳號。簽名公鑰由伺服器使用已配置的 Licentivo 連接讀取,管理密鑰和客戶授權憑據不會進入源碼。
Connect/connect 的作用
Connect/connect 是不同語言對“創建 Launch 應用客戶端”這一操作的命名。Go、C# 和部分原生接口使用首字母大寫的 Connect,Python、JavaScript、Ruby 等語言按各自風格使用 connect。后臺生成的 connectLaunch()、connect_launch() 或 LaunchConnection.Open() 是把公開參數預先填好的項目函數,內部調用的就是對應語言入口。
連接只完成初始化:它驗證商店地址、產品映射、環境與簽名公鑰,創建 Launch 客戶端,并配置包內官方 Licentivo SDK。它不會驗證客戶身份,也不會直接開放付費功能。完整順序為:
Connect/connect → Login or Restore → RunFeature → Logout / Close
└──────────→ ReleaseDevice (explicit device unlink only)
應用運行期間應保留同一個客戶端對象,讓 SDK 正常處理心跳與浮動席位。普通關閉保留設備綁定;客戶明確退出與 ReleaseDevice 兼容入口調用同一官方 SDK 退出流程。
安裝與初始化入口
0.1.6 的九種語言公開安裝驗證已全部通過(9/9),下表安裝方式均已驗證。GitHub Release 也提供原生包和離線文件,使用方式見下載包安裝說明。
| 語言 | 只安裝 Launch | 頁面提供的連接函數 | 包內直接初始化 API |
|---|---|---|---|
| Go | go get github.com/spf86/licentivo-launch-sdk/pkg/launchclient@v0.1.6 |
connectLaunch() |
launchclient.Connect |
| Python 3.10+ | python -m pip install licentivo-launch==0.1.6 |
connect_launch() |
Application.connect |
| C# / .NET 8+ | dotnet add package Licentivo.Launch --version 0.1.6 |
LaunchConnection.Open() |
Application.Connect |
| Java 17+ | Maven/Gradle:com.licentivo.launch:launch-client:0.1.6 |
LaunchConnection.open() |
Launch.connect |
| Node.js 20.3+ | npm install @licentivo/launch@0.1.6 |
connectLaunch() |
Application.connect |
| Rust 1.85+ | cargo add licentivo-launch@=0.1.6 |
connect_launch() |
Application::connect |
| Ruby 3.1+ | gem install licentivo-launch --version 0.1.6 |
connect_launch |
Application.connect |
| C11 | 從 GitHub Release 下載原生包,CMake 導入 | connect_launch() |
launch_application_connect |
| C++17 | 使用同一 Launch 原生包 | connectLaunch() |
Application::Connect |
公開源碼和各語言 README 見 Launch SDK 倉庫,原生包與離線文件見 v0.1.6 Release,公開安裝結果見 九種語言注冊表驗證。每個包自己的 README 提供安裝命令和 API。JavaScript 包包含 TypeScript 聲明。普通語言依賴由包管理器解析,例如 Python 的 cryptography、C# 的 BouncyCastle 和 Ruby 的 base64;無需安裝官方 SDK 包。
Go 公開模塊名為 github.com/spf86/licentivo-launch-sdk,導入路徑為 github.com/spf86/licentivo-launch-sdk/pkg/launchclient,應用無需本地 replace。Windows 原生包采用 amd64 GNU/MinGW,另有 Linux amd64 原生包。Ruby 平臺包和 Rust/native 的 Windows 分發包含 curl;其他平臺源碼構建需要常規 C11、curl/OpenSSL 開發依賴。平臺工具鏈說明見各包 README。
登錄與受保護操作
以下片段使用上一步復制的連接函數。email、password 來自自己的登錄界面;不得將密碼寫入源碼或配置。export 必須替換為套餐策略中實際存在的功能名。
Go
app, err := connectLaunch()
if err != nil { return err }
defer app.Close()
if _, err := app.Login(ctx, email, password); err != nil { return err }
return app.RunFeature("export", func() error {
return exportReport()
})
ctx 使用應用生命周期上下文,不能在登錄請求結束時立即取消心跳。網路操作放在后臺工作線程。恢復調用 Restore(ctx);退出帳號調用 Logout(ctx);釋放設備調用 ReleaseDevice(ctx)。
Python
with connect_launch() as app:
app.login(email, password)
result = app.run_feature("export", export_report)
restore() 恢復已有安全會話;無會話時顯示登錄界面。logout() 清理帳號;release_device() 明確釋放設備。不要讓同步網路操作阻塞桌面事件循環。
C# / .NET
await using var app = LaunchConnection.Open();
await app.Login(email, password);
await app.RunFeature("export", async () => {
await ExportReport();
});
使用 await Restore()、await Logout() 和 await ReleaseDevice()。保持應用存活期間的 SDK 生命周期,使用異步界面流程。
Java
try (var app = LaunchConnection.open()) {
app.login(email, passwordChars);
app.runFeature("export", () -> exportReport());
}
密碼使用 char[]。restore() 無會話時返回 NO_SESSION 失敗,應顯示登錄界面;其它失敗不能視為授權。logout() 和 releaseDevice() 是不同操作。try-with-resources 負責關閉。
JavaScript / Node.js / TypeScript
const app = connectLaunch();
try {
await app.login(email, password);
const result = await app.runFeature('export', () => exportReport());
} finally {
await app.close();
}
restore() 沒有會話時返回 null;正常恢復后才允許執行業務。logout() 的布爾返回值表示遠端退出是否確認,設備釋放失敗應顯示錯誤。代碼運行在 Node.js、Electron 主進程或可信后端;瀏覽器和 Electron 渲染進程不保存授權憑據。
Rust
let mut app = connect_launch()?;
app.login(&email, &password)?;
let result = app.run_feature("export", || {
export_report()?;
Ok(())
})?;
app.close();
回調返回 Result<T, Failure>。restore()、logout()、release_device() 返回結果,必須處理失敗。Drop 也負責關閉運行時。預設原生核心由 build.rs 編譯和鏈接,不需自己鏈接官方 SDK。
Ruby
app = connect_launch
begin
app.login(email, password)
result = app.run_feature('export') { export_report }
ensure
app.close
end
restore 恢復會話,logout 退出帳號,release_device 釋放設備。保護操作使用代碼塊;異常不能轉換為成功。
C
static int export_action(void *context) {
return export_report(context); /* Return 1 only on success. */
}
launch_application *app = connect_launch();
if (!app) return 0;
int ok = launch_application_login(app, email, password);
if (ok) ok = launch_application_run_feature(app, "export", export_action, context);
/* Check launch_application_error(app) on failure; never log credentials. */
launch_application_close(app);
return ok;
launch_application_restore 為三態:1 已恢復、0 沒有會話、-1 失敗。只有沒有會話時正常顯示登錄;拒絕或異常不能當作成功。logout 和 release_device 的返回值也必須檢查。
CMake 只導入 Launch:
find_package(LicentivoLaunch CONFIG REQUIRED)
add_executable(myapp main.c)
licentivo_launch_link(myapp)
C++
auto app = connectLaunch();
app.Login(email.c_str(), password.c_str());
app.RunFeature("export", [&] { exportReport(); });
Restore()、Logout()、ReleaseDevice() 遵循 C++ 異常語義。RAII 析構負責關閉。CMake 使用 licentivo_launch_link(myapp CXX),Launch 自動處理 SDK 鏈接和分發包內運行庫。
生命周期、安全存儲與錯誤
創建連接對象只完成初始化。程序必須登錄或恢復成功,并在每次業務操作中使用功能保護回調。訂單已付款、會話存在或按鈕可點擊都不能代替 SDK 驗證。
預設會話僅保存在內存。記住登錄需要安全存儲:Go、Python、C# 和原生 C/C++ 提供 Windows 當前用戶 DPAPI;Java、Node、Rust 和 Ruby 提供使用調用方密鑰的 AES-GCM 存儲。跨平臺應用應對接系統憑據庫。不能把密鑰和密文放在同一普通目錄。
普通關閉保留用戶主動記住的會話并停止運行時。退出帳號先調用官方 SDK 統一退出,再清理 Launch 自有帳號記錄。ReleaseDevice 是同一流程的兼容入口,遠端撤銷待完成時不能提示釋放成功。不要清理官方 SDK 的快取目錄或退出恢復日志。Launch 的會話保護不代表官方 SDK 的全部設備文件都已加密,應限制快取目錄權限。
| 狀態 | 程序處理 |
|---|---|
| 帳號或密碼失敗 | 顯示通用登錄失敗,不泄露帳號是否存在 |
| EMAIL_VERIFICATION_REQUIRED | 引導完成商店郵箱驗證 |
| ENTITLEMENT_PENDING | 顯示同步中,按包的有限重試和 Retry-After 等待 |
| ENTITLEMENT_NOT_PURCHASED | 引導購買或切換帳號 |
| ENTITLEMENT_EXPIRED | 引導續費,不使用舊憑據繞過拒絕 |
| ENTITLEMENT_SUSPENDED | 停止受保護功能,聯系商家 |
| 設備數量已滿 | 引導管理或明確釋放設備 |
| 網路/HTTP 5xx | 僅可使用 SDK 已驗證、仍在有效期內的離線授權 |
明確的 401/403/404、帳號不符、取消或限流不能變成離線授權成功。首次激活和禁止離線的策略仍需聯網。服務端域名/IP 無法訪問時應顯示連接問題,不能偷偷連接其它站點。
驗收與參考
驗證真實登錄、所屬帳號授權、受保護操作、重啟恢復、有效離線與離線到期、快取篡改、退出、帳號切換和設備釋放。本文不要求使用 AI。測試工具和外部驗收邊界見 acceptance.md;本地包和構建說明見 integration-packages.md。
配置檢查、代碼生成和本地測試不會自動證明真實支付、授權簽發或官網激活成功。外部商店和支付沙箱需配置后單獨驗收。