1. 准备产品与许可证
先使用设备绑定许可证和普通导出功能,确认授权流程正常后再增加功能次数计量。
设备额度按当前激活设备计算,释放后返还;普通授权离线仍占用,浮动授权租约到期后自动返还。
- 在控制台“产品”复制产品 ID,点击同一产品的“签名公钥”,将每一组密钥 ID、公钥填进初始化代码,替换 YOUR_PRODUCT_ID、YOUR_KEY_ID 和 YOUR_PUBLIC_KEY。快速接入也可以直接复制已填好的代码。无需配置文件;SDK 默认连接 https://www.licentivo.com。
- 在「快速接入」创建或选择产品,在策略中启用名为 export 的功能,并准备测试许可证。
2. 安装 SDK
在自己的应用项目中运行下方安装命令或加入构建依赖,安装 SDK 0.11.6。包管理器负责获取 SDK,无需下载解压源码包或设置本地源码路径。
npm install @licentivo/sdk@0.11.63. 保护一次实际导出
将 SDK 初始化接到自己软件的启动或激活入口,从激活窗口读取客户授权码,传入自己的产品 ID、受信公钥并保持客户端存活。把 RunFeature 放在真实业务入口,将导出示例函数替换成自己的实际功能。
import {writeFile} from 'node:fs/promises';
import {Client} from '@licentivo/sdk'; // Installed package: import from '@licentivo/sdk'.
// BEGIN LICENTIVO PRODUCT
// Copy Product ID and all key ID/public key pairs from Console > Products > Signing public keys.
const PRODUCT_ID = 'YOUR_PRODUCT_ID';
const TRUSTED_KEYS = {'YOUR_KEY_ID': 'YOUR_PUBLIC_KEY'};
// END LICENTIVO PRODUCT
export async function exportReport(path) {
// Replace this write with your existing, non-metered export operation.
await writeFile(path, 'A report generated by the licensed application.\n', {mode: 0o600});
}
async function main() {
// In Electron, create this in the main process, using customer activation input.
const client = await Client.openProduct(
PRODUCT_ID, TRUSTED_KEYS,
process.env.LICENTIVO_LICENSE_KEY ?? '',
error => console.error('Background verification:', error.message),
);
try {
const feature = process.env.LICENTIVO_FEATURE ?? 'export';
const path = process.env.LICENTIVO_OUTPUT ?? 'licensed-report.txt';
const action = () => exportReport(path);
if (process.env.LICENTIVO_METERED === '1') {
await client.runMeteredFeature(feature, 1, process.env.LICENTIVO_OPERATION_ID ?? '', action);
} else {
await client.runFeature(feature, action);
}
console.log(`License OK: ${feature} is available\nExport completed: ${path}`);
} finally {
await client.close(); // In your application, close only when the app exits.
}
}
main().catch(error => {console.error(error.message); process.exitCode = 2;});
4. 在应用退出时关闭客户端
本命令行示例执行一次操作后退出。接入桌面应用时,在启动时创建一个客户端,在导出按钮或命令中调用功能回调,直到应用退出才关闭客户端。
首次激活后,后续启动可将 LICENTIVO_LICENSE_KEY 留空,在相同用户及缓存位置恢复私有设备凭据。凭据保存在用户应用数据目录,不随安装包分发。关闭客户端会停止心跳并归还浮动席位;普通退出不应注销设备绑定。
只有策略允许、签名授权仍有效时才能离线使用。许可证过期或功能被拒绝时继续阻止业务操作;功能次数计量需要联网。
Electron 中由主进程持有 Client,通过明确的 IPC 接口提供需要保护的业务操作。等待 runFeature 和 close 完成,并让客户端覆盖整个应用生命周期;异步业务实际完成后才能返回成功。
5. 运行并核对结果
在控制台“产品”复制产品 ID,点击同一产品的“签名公钥”,将每一组密钥 ID、公钥填进初始化代码,替换 YOUR_PRODUCT_ID、YOUR_KEY_ID 和 YOUR_PUBLIC_KEY。快速接入也可以直接复制已填好的代码。无需配置文件;SDK 默认连接 https://www.licentivo.com。
- 使用允许 export 的有效许可证运行,确认生成 licensed-report.txt。
- 清空 LICENTIVO_LICENSE_KEY,以相同用户再次运行,确认可恢复已保存的设备凭据。
- 把 LICENTIVO_FEATURE 改为许可证没有的功能,并将 LICENTIVO_OUTPUT 改为新文件名。程序应提示拒绝,且不生成新文件。
- 仅在策略允许且签名授权未到期时测试离线重启。后台刷新报错后,也不能绕过失败的功能检查。
$env:LICENTIVO_LICENSE_KEY = 'YOUR_LICENSE_KEY'
node main.mjsLICENTIVO_LICENSE_KEY=YOUR_LICENSE_KEY node main.mjs常见接入问题
检查产品 ID、每组密钥 ID 和公钥、客户输入的授权码。公钥属于产品;客户许可证和本机凭证分别管理。开发测试授权码和厂商管理 API Key 不进入客户安装包。
功能被拒绝、设备数已满或许可证过期:在控制台核对许可证及策略,并向客户显示 SDK 错误。授权失败时不能调用导出函数。
普通功能接口只检查权限;计次接口负责预留和结算已配置的用量。每项真实业务使用独立且稳定的操作编号;中断恢复前先核对持久化业务结果。
找不到模块时,在 main.mjs 所在项目安装 @licentivo/sdk。配置 proxy_url 时还需要安装与 Node.js 版本匹配的可选 undici 包。