openAPI
OpenAPI
简介
深盾提供 OpenAPI 可以方便软件开发商的官网、CRM、ERP系统做集成对接,实现全程电子化
实现效果
许可签发、用户注册、用户许可更新等一系列操作都在软件开发商原有平台完成,不改变原有使用方式和提高用户体验。
更新历史
版本 | 日期 | 备注 |
---|---|---|
2.0.0 beta | 2017.05.17 | 初稿 |
2.0.1 beta | 2017.06.13 | 添加用户成功后, 可区分出是否之前已在用户中心注册过 添加用户的接口修改支持使用手机号作为用户名 |
2.0.2 beta | 2017.09.07 | 添加查询某用户已发许可的 API 添加发布软锁许可的 API |
2.0.3 beta | 2017.09.21 | 添加不依赖模板发布云锁或软锁许可的 API 添加用于更新(修改)已发的云锁或软锁许可的 API |
2.0.4 beta | 2017.09.28 | 添加标签管理相关 API |
2.0.5 beta | 2017.10.25 | 添加软锁查询相关 API 许可计次限制统一使用 "counter" |
2.0.6 | 2018.11.15 | 添加授权码管理相关 API |
2.0.7 | 2018.12.12 | 授权码生成、更新 API 支持高级属性设置 |
2.0.8 | 2019.01.10 | 云锁许可新增计费相关参数设置 |
2.0.9 | 2019.01.25 | 新增获取账号许可使用情况接口 |
2.0.10 | 2019.04.26 | 支持按照套餐发布许可, 部分描述和限制更新 |
2.0.11 | 2019.05.29 | 新增授权码兑换接口 |
2.0.12 | 2019.07.25 | 产品相关接口增加"显示名称"字段, 部分描述更新 |
2.0.13 | 2019.08.06 | 产品相关接口新增对"硬件锁"产品的支持 修正部分目录标题名称 |
2.0.14 | 2019.08.30 | 授权码管理相关接口增加"系统平台"字段, 支持生成面向安卓平台的授权码, 部分描述更新 |
2.0.15 | 2019.09.04 | 授权码管理相关接口增加"累积绑定设备数"字段 新增获取授权码使用情况接口 |
2.0.16 | 2019.09.10 | 新增硬件锁许可管理接口, 详见第十节 新增硬件锁信息管理接口, 详见第十一节 |
2.0.17 | 2019.11.28 | 授权码管理相关接口增加对集团许可的支持 |
2.0.18 | 2020.02.13 | 调整部分名词称谓, 与开发者中心保持一致 |
2.0.19 | 2020.09.15 | 云锁模板以及云锁许可支持踢出设置, 详见第七节对应字段描述 |
2.0.20 | 2020.11.20 | 新增获取账户余额信息接口, 详见第六节 |
2.0.21 | 2020.12.16 | 授权码许可支持 C2D/D2C 文件有效期设置, 详见第九节对应字段描述 |
2.0.22 | 2021.03.03 | 授权码管理, 新增"授权码解绑"接口 "获取授权码的绑定列表"接口返回数据新增字段, 详见第九节对应接口及字段描述 |
2.0.23 | 2021.05.11 | 授权码管理, 数据区支持编辑模式设置, 与开发者中心界面操作功能保持对应, 详见接口字段描述 硬件锁许可管理, 数据区支持编辑模式设置, 与开发者中心界面操作功能保持对应, 详见接口字段描述 |
2.0.24 | 2021.09.24 | 新增获取账单信息接口, 详见第六节 |
2.0.25 | 2022.06.20 | 修改产品、修改模板新增可选是否同步参数 |
2.0.26 | 2022.09.28 | 新增使用 C2D 反查授权码/账号许可接口 |
2.0.27 | 2022.10.20 | 云软(即账号)模板/许可相关接口支持 Key/Value 数据区 |
2.0.28 | 2022.12.26 | 生成授权码接口: 支持 PPM 更新授权码接口: 支持将永久许可更新为非永久许可 账号许可/授权码许可: 增加锁定/解锁接口 |
2.0.29 | 2023.02.09 | 支持使用多访问密钥调用接口, 计费相关接口支持根据访问密钥绑定的账户计费更新 账号许可/更新授权码: 支持修改订阅模式 |
2.0.30 | 2023.03.06 | 账号许可: 新增软锁获取累计绑定设备接口 |
2.1.0 | 2023.06.08 | 授权码: 含有多个产品的授权码, 支持分别设置许可条款 |
2.1.1 | 2023.09.28 | 签发/更新许可, 支持设置备注/合同编号/标签 |
2.1.2 | 2023.11.06 | 模板和许可, 数据区为文件模式时, 也可以指定读写区大小 |
2.1.3 | 2023.12.13 | 模板和不依赖模板的许可, 扣费方式为套餐时, 支持自动匹配 |
2.1.4 | 2024.04.25 | 授权码许可, 新增在线借阅/集团借阅参数 |
目录
- OpenAPI
一. 约定
- 术语
- 普通账号: 必须用邮箱或手机号作为登录账号, 云平台全局可用, 可使用不同开发者发布的许可, 此类账号可以在终端自助登录云平台的中间件来使用许可软件;
- 影子账号: 账号由创建该账号的开发者管理, 仅用于跟开发者自己的账号系统建立关联, 此类账号由开发者应用自己管理登录过程;
- licenseId: 产品在深思云平台的许可 ID, 取值范围: [1, 4294967295];
- 数据区: 为开发者提供三个数据存储区域, 可以存储任意数据:
- rom: 在许可使用过程中不能修改, 最大 65535 byte;
- raw: 在许可使用过程中可以修改, 最大 65535 byte;
- pub: 在许可使用过程中不能修改, 最大 65535 byte
- 接口概述
- 请求结构:
- 服务接口 URL:
https://openapi.senseyun.com/v2/sv/${请求操作}
- 通信协议:
HTTPS
- 请求方法:
POST
Content-Type
:application/json
- 字符编码: 请求和响应都以
UTF-8
编码 - 请求结构: JSON
- 响应结构: JSON
- API 规范: 此 API 不使用 rest 风格, 响应 JSON 中
code
属性为0
表示成功, 为其它值表示失败.
- 服务接口 URL:
- 公共参数: 需要将下列公共请求参数加入 HTTP Header 中
参数名称 | 必选 | 描述 |
---|---|---|
SenseAppID | 是 | 开发者的 APPID, 获取方式见下文 |
SenseTimestamp | 是 | UTC 时间戳(毫秒), 与服务器时间相差过大将导致认证失败 |
SenseNonce | 是 | 每次调用需传入不重复的值, 用于抗重放, 可实现为使用 UUID |
SenseSign | 是 | 用于认证的签名, 计算方式见下文 |
登录深盾开发者中心, 右上角点击 "开发者信息"
注意事项:
- 默认访问密钥调用 OpenAPI 时, 涉及计费相关的接口统一使用主账户进行计费.
- 其他访问密钥调用 OpenAPI 时, 涉及计费相关的接口将使用该访问密钥绑定的计费账户进行计费.
- 签名机制
- 说明 用于验证调用者合法性, 同时实现抗重放、防篡改的安全机制.
- 签名过程
ResourceURI
: 请求操作, 例如:v2/sv/addUser
;BodyContent
: 请求中的 JSON;Secret
: 深盾 OpenAPI 访问密钥, 获取过程见上文;SenseSign
= Base64(HMAC_SHA256(SenseTimestamp + SenseNonce + ResourceURI + BodyContent, Secret));
- 请求示例:
POST https://openapi.senseyun.com/v2/sv/addUser
Content-Type: application/json
SenseAppID: ab73d14ec3ab4a3a8275c90200f6e5d7
SenseTimestamp: 1490950471521
SenseNonce: 4a3a8275c90200fab73d14ec3ab6e5d7
SenseSign: rrkEBbMf8DaIrefRAcnDoDG/5lXmmBFE05rlopXAU4c=
{
"userAccount": "test@test.com.cn",
"nickname": "张三",
"passwd": "123456"
}
- 代码示例(Java 11+):
import com.fasterxml.jackson.databind.node.*;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.*;
private static final String APPID = "深盾 OpenAPI 访问 ID";
private static final String SECRET = "深盾 OpenAPI 访问密钥";
private static final HttpClient CLIENT = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10L))
.followRedirects(HttpClient.Redirect.ALWAYS)
.build();
private static Map<String, String> buildHeader(String uri, String body) {
long now = System.currentTimeMillis();
String nonce = removeAll(UUID.randomUUID().toString(), '-');
String timestampStr = String.valueOf(now);
byte[] timestampBytes = timestampStr.getBytes(StandardCharsets.UTF_8);
byte[] nonceBytes = nonce.getBytes(StandardCharsets.UTF_8);
byte[] uriBytes = uri.getBytes(StandardCharsets.UTF_8);
byte[] bodyBytes = body.getBytes(StandardCharsets.UTF_8);
byte[] allSrcBytes = new byte[timestampBytes.length + nonceBytes.length + uriBytes.length + bodyBytes.length];
int offset = 0;
System.arraycopy(timestampBytes, 0, allSrcBytes, offset, timestampBytes.length);
offset += timestampBytes.length;
System.arraycopy(nonceBytes, 0, allSrcBytes, offset, nonceBytes.length);
offset += nonceBytes.length;
System.arraycopy(uriBytes, 0, allSrcBytes, offset, uriBytes.length);
offset += uriBytes.length;
System.arraycopy(bodyBytes, 0, allSrcBytes, offset, bodyBytes.length);
byte[] secretBytes = SECRET.getBytes(StandardCharsets.UTF_8);
byte[] signBytes = hMacSHA256(allSrcBytes, secretBytes);
String senseSign = Base64.getEncoder().encodeToString(signBytes);
Map<String, String> headers = new HashMap<>(4);
headers.put("SenseAppID", APPID);
headers.put("SenseTimestamp", timestampStr);
headers.put("SenseNonce", nonce);
headers.put("SenseSign", senseSign);
return headers;
}
private static String removeAll(final CharSequence str, final char ch) {
if (Objects.isNull(str)) {
return null;
}
final int len = str.length();
final StringBuilder sb = new StringBuilder(len);
char c1;
for (int i = 0; i < len; i++) {
c1 = str.charAt(i);
if (c1 != ch) {
sb.append(c1);
}
}
return sb.toString();
}
private static byte[] hMacSHA256(byte[] data, byte[] key) {
try {
final String algorithm = "HmacSHA256";
SecretKeySpec spec = new SecretKeySpec(key, algorithm);
Mac mac = Mac.getInstance(algorithm);
mac.init(spec);
return mac.doFinal(data);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private static void send(String uri, ObjectNode json) {
String body = json.toString();
Map<String, String> headers = buildHeader(uri, body);
HttpRequest.Builder builder = HttpRequest.newBuilder()
.uri(URI.create("https://openapi.senseyun.com" + uri))
.POST(HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8))
.header("Content-Type", "application/json");
headers.forEach(builder::header);
HttpRequest request = builder.build();
HttpResponse<String> resp;
try {
resp = CLIENT.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
int code = resp.statusCode();
String respBody = resp.body();
System.out.println("code: " + code);
System.out.println("resp: " + respBody);
}
public static void main(String[] args) throws Exception {
final String uri = "/v2/sv/addUser";
ObjectNode json = new ObjectNode(JsonNodeFactory.instance);
json.set("userAccount", new TextNode("test@test.com.cn"));
json.set("nickname", new TextNode("张三"));
json.set("passwd", new TextNode("123456"));
send(uri, json);
}
- 接口限制
- 未转正的开发者
- 最多添加 100 个账号; 批量导入单次不超过 10 个账号;
- 转正后的开发者
- 出于安全考虑, 接口调用有频次限制, 具体限制根据业务量设置;
二. API概览
API | 描述 |
---|---|
账号相关 | |
addUser | 添加普通账号 |
addShadowUser | 添加影子账号 |
modifyUserPasswd | 修改影子账号的密码 |
modifyUser | 修改账号备注信息 |
deleteUser | 删除账号(包含普通账号和影子账号) |
findUsers | 查找账号 |
产品相关 | |
addProduct | 添加产品 |
modifyProduct | 修改产品信息 |
getProductInfo | 按照产品 ID 获得产品信息 |
productList | 按照产品名称模糊搜索产品信息 |
deleteProduct | 按照产品 ID 删除产品 |
账号模板相关 | |
addTemplate | 添加模板 |
modifyTemplate | 修改模板信息 |
templateList | 按照产品 ID 枚举模板 |
findTemplate | 按照模板编号查找模板信息 |
deleteTemplate | 删除模板 |
账号许可相关 | |
issueLicenseByProduct | 不依赖模板发布许可 |
issueLicense | 依赖模板发布许可 |
updateLicense | 更新(修改)已发许可 |
deleteLicense | 删除许可 |
licenseList | 搜索许可 |
softLockbindList | 获取软锁的绑定机器信息 |
softLockUnbind | 解绑软锁 |
licenseUseInfo | 获取许可使用信息 |
softLockLicenseInfo | 获取指定软许可的信息 |
softLockbindHistory | 获取指定软许可的绑定历史信息(包含绑定信息) |
softLockbindMachineLast | 获取具体机器的软锁许可的最新绑定(解绑)信息 |
softLockbindMachineHistory | 获取具体机器的软锁许可的绑定历史信息(包含解绑信息) |
getAccountLicenseUsage | 获取账号许可的使用情况 |
findBoundSoftLicenseByC2d | 使用 C2D 反查已绑定的软锁许可 |
硬件锁许可相关 | |
devicelicense/addlic | 签发添加许可升级包 |
devicelicense/updatelic | 签发更新许可升级包 |
devicelicense/dellic | 删除硬件许可升级包 |
devicelicense/ctrllic | 签发控制许可升级包 |
dlm/issueAddLicense | 发布添加硬件锁许可 |
dlm/issueUpdateLicense | 发布更新硬件锁许可 |
dlm/issueDeleteLicense | 发布删除硬件锁许可 |
dlm/issueClearAllLicenses | 发布清空锁内所有许可 |
dlm/getLicenseDetail | 获取硬件锁许可详情 |
硬件锁信息管理接口 | |
dm/modifyContact | 修改用户锁联系人信息 |
dm/autoUpgradeSwitcher | 开关用户锁在线自动升级 |
dm/getBriefInfo | 获取用户锁信息 |
dm/exportDongleProduceInfo | 导出用户锁生产数据 |
计费管理接口 | |
getAvailableLicensePackage | 获取可用的许可套餐 |
getAccountBalance | 获取账户余额信息 |
getBillInfo | 获取账单信息 |
标签管理相关 | |
addTag | 添加标签 |
updateTag | 修改标签 |
deleteTag | 删除标签 |
findTags | 按标签名称查找标签 |
授权码管理相关 | |
issueLicenseKey | 生成授权码 |
updateLicenseKey | 更新授权码 |
deleteLicenseKey | 删除授权码 |
findLicenseKeys | 搜索授权码 |
getLicenseKeyDetail | 获取授权码详情 |
getLicenseKeyBindList | 获取授权码的绑定列表 |
licenseKeyExchange | 兑换授权码 |
getLicenseKeyUsage | 获取授权码使用情况 |
licenseKeyUnbind | 授权码解绑 |
findBoundLicenseKeyByC2d | 使用 C2D 反查已绑定的授权码 |
三. 账号管理接口
1. 添加普通账号
- 接口地址:
https://openapi.senseyun.com/v2/sv/addUser
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
nickname | 是 | string | 客户姓名/昵称 | |
userAccount | 是 | string | 登录账号. accountType 的值决定此参数: accountType = 1 时, 必须为合法的邮箱地址;accountType = 2时, 必须为合法的手机号 | |
accountType | 否 | number | 1 | 1-邮箱, 2-手机号 |
passwd | 是 | string | 密码 | |
cellphone | 否 | string | 手机号码accountType = 2时, 若不为空必须与 userAccount 值一致 | |
否 | string | 邮箱地址accountType = 1时, 若不为空必须与 userAccount 值一致 | ||
sex | 否 | string | 性别, 可选值: 男/女 | |
tel | 否 | string | 电话 | |
address | 否 | string | 联系地址 | |
tagIds | 否 | array | 标签 ID 列表 | |
desc | 否 | string | 账号备注信息 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
alreadyRegisteredAtCloud | boolean | 账号是否在深盾云平台注册过 |
code | number | 状态码 |
desc | string | 结果描述 |
data | Data1 |
Data1
字段名称 | 类型 | 描述 |
---|---|---|
userId | string | 账号 id |
- 示例: 请求内容:
{
"nickname": "张三",
"userAccount": "test@test.com.cn",
"passwd": "123456",
"cellphone": "1351111111X",
"sex": "男",
"tel": "12332112",
"address": "北京市海淀区XXX",
"desc": "高校老师",
"tagIds": [ 123, 234 ]
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"userId": "f17769576f9545d583a10c44a5389f58"
}
}
2. 添加影子账号
- 接口地址:
https://openapi.senseyun.com/v2/sv/addShadowUser
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
nickname | 否 | string | 账号名称 | |
shadowAccount | 是 | string | 影子账号 | |
passwd | 是 | string | 账号密码 | |
cellphone | 否 | string | 手机号码 | |
否 | string | 电子邮箱 | ||
sex | 否 | string | 性别: 可选值: 男/女 | |
tel | 否 | string | 电话 | |
address | 否 | string | 联系地址 | |
tagIds | 否 | array | 标签 ID 列表 | |
desc | 否 | string | 账号备注 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data2 |
Data2
字段名称 | 类型 | 描述 |
---|---|---|
userId | string | 账号 id |
userAccount | string | 登录账号, 修改密码时传此值修改此账号的密码 |
- 示例: 请求内容:
{
"nickname": "张三",
"shadowAccount": "dasodjsakl",
"passwd": "123456",
"tagIds": [ 123, 234 ]
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"userId": "f17769576f9545d583a10c44a5389f58",
"userAccount": "gf7769576f9545d583a10c44a5389f58dasodjsakl"
}
}
3. 修改影子账号密码
- 接口地址:
https://openapi.senseyun.com/v2/sv/modifyUserPasswd
- 说明:
此 API 只能修改通过 addShadowUser 接口添加的账号的密码
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
userAccount | 是 | string | 登录账号, 请填写添加影子账号返回的 userAccount | |
passwd | 是 | string | 账号密码 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
- 示例: 请求内容:
{
"userAccount": "test@test.com.cn",
"passwd": "123456"
}
响应内容:
{
"code": 0,
"desc": "成功"
}
4. 修改账号备注信息
- 接口地址:
https://openapi.senseyun.com/v2/sv/modifyUser
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
userId | 是 | string | 账号 ID | |
nickname | 否 | string | 账号姓名/昵称 | |
cellphone | 否 | string | 对于普通账号, 将忽略此参数, 只能用户登录用户中心自行修改 | |
否 | string | 对于普通账号, 将忽略此参数, 只能用户登录用户中心自行修改 | ||
sex | 否 | string | 性别, 可选值: 男/女 | |
tel | 否 | string | 电话 | |
address | 否 | string | 联系地址 | |
tagIds | 否 | array | 标签 ID 列表 | |
desc | 否 | string | 账号备注信息 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
- 示例: 请求内容:
{
"userId": "96669f0de91746dbafe20e5291efb1f3",
"nickname": "demo1",
"cellphone": "1341111111",
"tagIds": [ 123, 234 ]
}
响应内容:
{
"code": 0,
"desc": "成功"
}
5. 删除账号
- 接口地址:
https://openapi.senseyun.com/v2/sv/deleteUser
- 说明:
对于普通账号, 只从开发者的账号列表删除, 用户中心仍保留; 对于影子账号, 则全部删除.
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
userId | 是 | string | 账号 ID |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
- 示例: 请求内容:
{
"userId": "96669f0de91746dbafe20e5291efb1f3"
}
响应内容:
{
"code": 0,
"desc": "成功"
}
6. 查找账号
- 接口地址:
https://openapi.senseyun.com/v2/sv/findUsers
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
userAccount | 否 | string | 账号, 支持模糊查找 | |
否 | string | 邮箱, 支持模糊查找 | ||
nickname | 否 | string | 客户姓名/昵称, 支持模糊查找 | |
cellphone | 否 | string | 手机号码, 支持模糊查找 | |
tagIds | 否 | array | 标签 ID 列表 | |
tagName | 否 | string | 标签名称 | |
currentPage | 否 | number | 1 | 当前页, 从 1 开始 |
pageSize | 否 | number | 10 | 每页数量 |
- 注意事项:
参数 userAccount
对于普通账号是指邮箱或手机号; 对于影子账号是指添加影子账号时返回的 userAccount
值
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data3 |
Data3
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
users | User[] | 账号信息列表 |
User
字段名称 | 类型 | 描述 |
---|---|---|
userId | string | 账号 ID |
nickname | string | 账号名称 |
userAccount | string | 账号 |
accountType | number | 账号类型: 1-邮箱 2-手机号 4-影子账号 |
sex | string | 性别(男/女) |
tel | string | 电话 |
cellphone | string | 手机号 |
string | 邮箱 | |
address | string | 联系地址 |
desc | string | 描述 |
tagMessage | TagMessage[] | 标签信息列表 |
TagMessage
字段名称 | 类型 | 描述 |
---|---|---|
id | number | 标签 ID |
name | string | 标签名称 |
createTime | number | UTC 时间戳(毫秒) |
- 示例: 请求内容:
{
"email": "demo1@test.com",
"nickname": "demo1",
"cellphone": "1341111111",
"tagIds": [ 123, 234 ],
"tagName": "企业用户",
"currentPage": 1,
"pageSize": 10
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"users": [
{
"userAccount": "demo1@test.com",
"accountType": 1,
"nickname": "demo1",
"sex": "男",
"tel": "0315-12345678",
"cellphone": "1341111111",
"address": "海淀区阜成路西钓鱼台",
"desc": "在校大学生",
"tagMessage": [
{
"id": 123,
"name": "企业用户",
"createTime": 1505273720000
},
{
"id": 234,
"name": "企业用户",
"createTime": 1505273720000
}
]
}
]
},
"totalPage": 1,
"totalCount": 1
}
四. 产品管理接口
1. 添加产品
- 接口地址:
https://openapi.senseyun.com/v2/sv/addProduct
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseId | 是 | number | 产品 ID, 取值范围: [1, 4294967295] | |
productName | 是 | string | 产品名称, 最长 64 字符 | |
displayName | 否 | string | 显示名称, 最长 64 字符 | |
licenseForm | 是 | array | 许可形式 仅支持云锁: [1] 仅支持软锁: [2] 仅支持硬件锁: [4] 支持任意许可: [1, 2, 4] | |
pub | 否 | string | 公开区的 hex 字符串 | |
rom | 否 | string | 只读区的 hex 字符串 | |
raw | 否 | string | 读写区的 hex 字符串 | |
modules | 否 | Module[] | 子模块列表 |
Module
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
moduleId | 是 | number | 模块编号 | |
moduleName | 否 | string | 模块名称 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data4 |
Data4
字段名称 | 类型 | 描述 |
---|---|---|
licenseId | number | 产品 ID |
- 示例: 请求内容:
{
"licenseId": 1,
"productName": "产品测试",
"displayName": "测试产品",
"licenseForm": [ 1, 2 ],
"pub": "AABB",
"rom": "CCDD",
"raw": "EEFF",
"modules": [
{
"moduleId": 1,
"moduleName": "1 号功能开关"
},
{
"moduleId": 2,
"moduleName": "2 号功能开关"
}
]
}
响应内容:
{
"code": 0,
"data": {
"licenseId": 1
},
"desc": "成功"
}
2. 修改产品
- 接口地址:
https://openapi.senseyun.com/v2/sv/modifyProduct
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseId | 是 | number | 产品 ID | |
productName | 否 | string | 产品名称, 最长 64 字符 | |
syncNameToTemplateAndLic | 否 | boolean | false | 修改后的产品名称是否同步到所有已创建销售模板、已发布的许可中 |
displayName | 否 | string | 显示名称, 最长 64 字符 | |
licenseForm | 否 | array | 许可形式 仅支持云锁: [1] 仅支持软锁: [2] 仅支持硬件锁: [4] 支持任意许可: [1, 2, 4] | |
pub | 否 | string | 公开区的 hex 字符串 | |
rom | 否 | string | 只读区的 hex 字符串 | |
raw | 否 | string | 读写区的 hex 字符串 | |
modules | 否 | Module[] | 子模块列表 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
- 示例: 请求内容:
{
"licenseId": 1,
"productName": "产品测试",
"syncNameToTemplateAndLic ": true,
"displayName": "测试产品",
"licenseForm": [
1,
2
],
"pub": "AABB",
"rom": "CCDD",
"raw": "EEFF",
"modules": [
{
"moduleId": 1,
"moduleName": "1 号功能开关"
},
{
"moduleId": 2,
"moduleName": "2 号功能开关"
}
]
}
响应内容:
{
"code": 0,
"desc": "成功"
}
3. 按照产品 ID 查找产品
- 接口地址:
https://openapi.senseyun.com/v2/sv/getProductInfo
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseId | 是 | number | 产品 ID |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Product |
Product
字段名称 | 类型 | 描述 |
---|---|---|
licenseId | number | 产品 ID |
productName | string | 产品名称 |
displayName | string | 显示名称 |
licenseForm | array | 许可形式 |
pub | string | 公开区的 hex 字符串 |
rom | string | 只读区的 hex 字符串 |
raw | string | 读写区的 hex 字符串 |
modules | Module[] |
- 示例: 请求内容:
{
"licenseId": 1
}
响应内容:
{
"code": 0,
"data": {
"licenseId": 1,
"productName": "产品测试",
"displayName": "测试产品",
"licenseForm": [ 1, 2 ],
"pub": "AABB",
"rom": "CCDD",
"raw": "EEFF",
"modules": [
{
"moduleId": 1,
"moduleName": "1 号功能开关"
},
{
"moduleId": 2,
"moduleName": "2 号功能开关"
}
],
"createTime": 1564022355000
},
"desc": "成功"
}
4. 按照产品名称查找产品
- 接口地址:
https://openapi.senseyun.com/v2/sv/productList
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
productName | 否 | string | 产品名称, 支持模糊查找 | |
currentPage | 否 | number | 1 | 当前页, 从 1 开始 |
pageSize | 否 | number | 10 | 每页数量 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data6 |
Data6
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
products | Product[] | 产品列表 |
- 示例: 请求内容:
{
"productName": "测试"
}
响应内容:
{
"code": 0,
"data": {
"totalPage": 1,
"totalCount": 1,
"products": [
{
"licenseId": 1,
"productName": "产品测试",
"displayName": "测试产品",
"licenseForm": [
1,
2
],
"pub": "AABB",
"rom": "CCDD",
"raw": "EEFF",
"modules": [
{
"moduleId": 1,
"moduleName": "1 号功能开关"
},
{
"moduleId": 2,
"moduleName": "2 号功能开关"
}
],
"createTime": 1564022355000
}
]
},
"desc": "成功"
}
5. 删除产品
- 接口地址:
https://openapi.senseyun.com/v2/sv/deleteProduct
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseId | 是 | number | 产品 ID |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
- 示例: 请求内容:
{
"licenseId": 1234567890
}
响应内容:
{
"desc": "OK",
"code": 0
}
五. 账号模板管理接口
1. 添加模板
- 接口地址:
https://openapi.senseyun.com/v2/sv/addTemplate
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
templateName | 是 | string | 模板名称 | |
licenseId | 是 | number | 产品(许可) ID, 取值范围: [1, 4294967295], 必须是平台上已有的产品 | |
licenseForm | 是 | number | 许可形式 1-云锁 2-软锁 | |
licenseMode | 是 | number | 扣费方式 0-账户余额 1-赠送许可 2-套餐许可 | |
pricingMode | 否 | string | licenseMode 为 0 或 2 时必选订阅模式 对于账户余额, 取值如下: daily - 按天 yearly - 按年 once - 一次性 对于赠送许可, 无需传入 对于套餐许可, 指定使用某个套餐时, 取值为对应套餐的序列号; 自动匹配套餐时, 取值 auto | |
isForever | 是 | boolean | 是否永久许可 | |
licStartTimeType | 否 | number | isForever = false 时必选时间限制类型 0-具体时间 1-许可发布时间作为开始时间 | |
startTime | 否 | number | 开始时间, UTC 时间戳(秒) | |
endTime | 否 | number | 结束时间, UTC 时间戳(秒) | |
spanTime | 否 | number | 时间跨度(天) | |
counter | 否 | number | licenseForm = 1 时生效许可使用次数, 取值范围: [1, 4294967295] | |
licDuration | 否 | number | licStartTimeType = 1 时必选限定时长(天) | |
offlineDays | 否 | number | licenseForm = 2 时必选离线时长(天), 取值范围: [1, 180] | |
licBindLimit | 否 | number | licenseForm = 2 时必选同时绑定设备数 | |
licBindMaxLimit | 否 | number | licenseForm = 2 时必选累积绑定设备数 | |
isOffline | 否 | boolean | false | licenseForm = 2 时生效是否支持离线 |
kickOut | 否 | boolean | true | licenseForm = 1 时生效是否允许踢出 |
version | 否 | number | 0 | 许可版本 |
pub | 否 | string | 公开区的 hex 字符串 | |
rom | 否 | string | 只读区的 hex 字符串 | |
raw | 否 | string | 读写区的 hex 字符串 | |
dataZonePadMode | 否 | number | 1 | 数据区编辑模式 1-二进制模式 2-Key/Value 模式 |
kvSeparator | 否 | string | : | dataZonePadMode = 2 时生效 Key/Value 分隔符, 长度为 1 |
kvConnector | 否 | string | ; | dataZonePadMode = 2 时生效 Key/Value 连接符, 长度为 1 |
rawResize | 否 | number | 重置读写区大小, 取值范围: [读写区数据长度, 65535] |
- 注意事项:
- 对于云锁普通许可(即
licenseForm
= 1,licenseMode
= 0),pricingMode
字段的取值不能为 once, 即不支持永久云锁许可 - 字段
kickOut
仅适用于云锁许可(即licenseForm
= 1). 当kickOut
设置为 true 时, 表示最后一次许可登录的机器会踢出上一次许可登录的机器(默认); 当kickOut
设置为 false 时, 表示许可登录后不会被后续机器的许可登录踢出, 直到主动退出后续机器才可以许可登录 - 字段
rawResize
表示设置读写区的有效长度, 当软件运行时可能会写入比预设的数据区内容更多的数据时, 则需要对读写区内容进行扩容占位, 该字段值应设置的尽可能符合实际所需, 以提高运行时读写效率, 默认占位字节为 0x00. 例如, 预设的读写区内容为 HelloWorld, 如果软件在运行时向读写区写入 01234567890 时将报错, 因为预设的读写区的有效长度为 1028(HelloWorld 字符串的长度为 10); 此时, 如果设置了rawResize
= 15, 则预设的读写区的有效长度便会被设置为 15(此时读写区实际内容为 HelloWorld 加 5 个 0x00 占位字节), 此时再写入 01234567890 时将是正常的 - 设置自动匹配套餐(
licenseMode
= 2, 且pricingMode
= auto)时, 按照许可条款自动匹配可用的套餐; 优先匹配快要过期或剩余许可数较少的套餐
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data7 |
Data7
字段名称 | 类型 | 描述 |
---|---|---|
templateId | number | 模板 ID |
- 示例: 请求内容:
{
"templateName": "测试",
"licenseId": 123456,
"licenseForm": 2,
"licenseMode": 0,
"pricingMode": "daily",
"isForever": false,
"licStartTimeType": 0,
"startTime": 1488188325,
"endTime": 1588198325,
"version": 1,
"pub": "AABBCCDD",
"rom": "EEFFAACC",
"raw": "AABB1234",
"modules": [
{
"moduleId": 1,
"moduleName": "测试 1"
},
{
"moduleId": 2,
"moduleName": "测试 2"
}
]
}
响应内容:
{
"desc": "OK",
"code": 0,
"data": {
"templateId": 12
}
}
2. 修改模板
- 接口地址:
https://openapi.senseyun.com/v2/sv/modifyTemplate
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
templateId | 是 | number | 模板编号 | |
templateName | 否 | string | 模板名称 | |
syncNameToLic | 否 | boolean | false | 修改模板名称是否同步至已发许可中 |
licenseForm | 否 | number | 许可形式 1-云锁 2-软锁 | |
licenseMode | 是 | number | 扣费方式 0-账户余额 1-赠送许可 2-套餐许可 | |
pricingMode | 否 | string | licenseMode 为 0 或 2 时必选订阅模式 对于账户余额, 取值如下: daily - 按天 yearly - 按年 once - 一次性 对于赠送许可, 无需传入 对于套餐许可, 指定使用某个套餐时, 取值为对应套餐的序列号; 自动匹配套餐时, 取值 auto | |
isForever | 是 | boolean | 是否永久许可 | |
licStartTimeType | 否 | number | isForever = false 时必选时间限制类型 0-具体时间 1-许可发布时间作为开始时间 | |
startTime | 否 | number | 开始时间, UTC 时间戳(秒) | |
endTime | 否 | number | 结束时间, UTC 时间戳(秒) | |
spanTime | 否 | number | 时间跨度(天) | |
counter | 否 | number | licenseForm = 1 时生效许可使用次数, 取值范围: [1, 4294967295] | |
licDuration | 否 | number | licStartTimeType = 1 时必选限定时长(天) | |
offlineDays | 否 | number | licenseForm = 2 时必选离线时长(天), 取值范围: [1, 180] | |
licBindLimit | 否 | number | licenseForm = 2 时必选同时绑定设备数 | |
licBindMaxLimit | 否 | number | licenseForm = 2 时必选累积绑定设备数 | |
isOffline | 否 | boolean | false | licenseForm = 2 时生效是否支持离线 |
kickOut | 否 | boolean | true | licenseForm = 1 时生效是否允许踢出 |
version | 否 | number | 0 | 许可版本 |
pub | 否 | string | 公开区的 hex 字符串 | |
rom | 否 | string | 只读区的 hex 字符串 | |
raw | 否 | string | 读写区的 hex 字符串 | |
dataZonePadMode | 否 | number | 1 | 数据区编辑模式 1-二进制模式 2-Key/Value 模式 |
kvSeparator | 否 | string | : | dataZonePadMode = 2 时生效 Key/Value 分隔符, 长度为 1 |
kvConnector | 否 | string | ; | dataZonePadMode = 2 时生效 Key/Value 连接符, 长度为 1 |
rawResize | 否 | number | 重置读写区大小, 取值范围: [读写区数据长度, 65535] |
- 注意事项:
- 对于云锁普通许可(即
licenseForm
= 1,licenseMode
= 0),pricingMode
字段的取值不能为 once, 即不支持永久云锁许可 - 字段
kickOut
仅适用于云锁许可(即licenseForm
= 1). 当kickOut
设置为 true 时, 表示最后一次许可登录的机器会踢出上一次许可登录的机器(默认); 当kickOut
设置为 false 时, 表示许可登录后不会被后续机器的许可登录踢出, 直到主动退出后续机器才可以许可登录 - 字段
rawResize
表示设置读写区的有效长度, 当软件运行时可能会写入比预设的数据区内容更多的数据时, 则需要对读写区内容进行扩容占位, 该字段值应设置的尽可能符合实际所需, 以提高运行时读写效率, 默认占位字节为 0x00. 例如, 预设的读写区内容为 HelloWorld, 如果软件在运行时向读写区写入 01234567890 时将报错, 因为预设的读写区的有效长度为 1028(HelloWorld 字符串的长度为 10); 此时, 如果设置了rawResize
= 15, 则预设的读写区的有效长度便会被设置为 15(此时读写区实际内容为 HelloWorld 加 5 个 0x00 占位字节), 此时再写入 01234567890 时将是正常的 - 设置自动匹配套餐(
licenseMode
= 2, 且pricingMode
= auto)时, 按照许可条款自动匹配可用的套餐; 优先匹配快要过期或剩余许可数较少的套餐
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
- 示例: 请求内容:
{
"templateId": 10,
"templateName": "测试 2",
"licenseForm": 2,
"licenseMode": 0,
"pricingMode": "daily",
"isForever": false,
"licStartTimeType": 0,
"startTime": 1488188325,
"endTime": 1588298325,
"version": 2,
"pub": "AABBCCDD4321",
"rom": "EEFFAACC1234",
"raw": "AABB123456",
"modules": [
{
"moduleId": 1,
"moduleName": "测试 1"
},
{
"moduleId": 2,
"moduleName": "测试 2"
}
]
}
响应内容:
{
"desc": "OK",
"code": 0,
}
3. 按照产品 ID 枚举模板
- 接口地址:
https://openapi.senseyun.com/v2/sv/templateList
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseId | 否 | number | 产品 ID | |
currentPage | 否 | number | 1 | 当前页, 从 1 开始 |
pageSize | 否 | number | 10 | 每页数量 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data8 |
Data8
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
templates | Template[] | 模板信息列表 |
Template
字段名称 | 类型 | 描述 |
---|---|---|
id | number | 模板 ID |
templateName | string | 模板名称 |
licenseId | number | 许可 ID |
productName | string | 产品名称 |
licenseForm | number | 许可形式 1-云锁 2-软锁 |
licenseMode | number | 扣费方式 0-账户余额 1-赠送许可 2-套餐许可 |
pricingMode | string | 订阅模式 daily - 按天收费 yearly - 按年收费 once - 一次性收费 auto - 自动匹配套餐 |
isForever | boolean | 是否永久许可 |
licStartTimeType | number | 时间限制类型 0-具体时间 1-许可发布时间作为开始时间 |
startTime | number | 开始时间, UTC 时间戳(秒) |
endTime | number | 结束时间, UTC 时间戳(秒) |
spanTime | numbner | 时间跨度(天) |
counter | number | 使用次数 |
licDuration | number | 限定时长 |
licBindLimit | number | 同时绑定设备数 |
licBindMaxLimit | number | 累积绑定设备数 |
offlineDays | number | 离线时长(天) |
pub | string | 公开区数据的 hex 字符串 |
rom | string | 只读区数据的 hex 字符串 |
raw | string | 读写区数据的 hex 字符串 |
dataZonePadMode | number | 数据区编辑模式 1-二进制模式 2-Key/Value 模式 |
kvSeparator | string | Key/Value 分隔符 |
kvConnector | string | Key/Value 连接符 |
rawResize | number | 读写区重置大小 |
modules | Module[] | 子模块列表 |
canModify | number | 发许可时, 模板的许可限制是否可临时修改 0-不可修改 1-可修改 |
createTime | number | 创建时间, UTC 时间戳(秒) |
kickOut | boolean | 是否允许踢出 |
- 示例: 请求内容:
{
"licenseID": 1234567890
}
响应内容:
{
"desc": "OK",
"code": 0,
"data": {
"templates": [
{
"id": "1",
"templateName": "测试",
"licenseId": 1234567890,
"productName": "测试",
"isForever": true,
"startTime": 0,
"endTime": 0,
"spanTime": 0,
"times": 0,
"licenseForm": "软锁",
"licenseMode": 0,
"pricingMode": "daily",
"offlineDays": 30,
"licBindLimit": 3,
"modules": [
{
"moduleId": 1,
"moduleName": "1"
},
{
"moduleId": 2,
"moduleName": "2"
}
],
"licDuration": 0,
"licStartTimeType": 0,
"licBindMaxLimit": 128,
"canModify": false,
"version": 1,
"pub": "AABB",
"rom": "CCDD",
"raw": "EEFF",
"dataZonePadMode": 1,
"createtime": 1490695767
}
],
"totalPage": 1,
"totalCount": 1
}
}
4. 按照模板编号查找模板信息
- 接口地址:
https://openapi.senseyun.com/v2/sv/findTemplate
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
templateId | 是 | number | 模板 ID |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Template | 模板信息 |
- 示例: 请求内容:
{
"licenseID": 1234567890
}
响应内容:
{
"desc": "OK",
"code": 0,
"data": {
"id": "1",
"templateName": "测试",
"licenseId": 1234567890,
"productName": "测试",
"licenseMode": 0,
"pricingMode": "daily",
"isForever": true,
"startTime": 0,
"endTime": 0,
"spanTime": 0,
"times": 0,
"licenseForm": "软锁",
"offlineDays": 30,
"licBindLimit": 3,
"modules": [
{
"moduleId": 1,
"moduleName": "1"
},
{
"moduleId": 2,
"moduleName": "2"
}
],
"licDuration": 0,
"licStartTimeType": 0,
"licBindMaxLimit": 128,
"canModify": false,
"version": 1,
"pub": "AABB",
"rom": "CCDD",
"raw": "EEFF",
"dataZonePadMode": 1,
"createtime": 1490695767
}
}
5. 删除模板
- 接口地址:
https://openapi.senseyun.com/v2/sv/deleteTemplate
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
templateId | 是 | number | 模板 ID |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
- 示例: 请求内容:
{
"licenseID": 1234567890
}
响应内容:
{
"desc": "OK",
"code": 0
}
六. 计费管理接口
1. 获取可用的许可套餐
- 接口地址:
https://openapi.senseyun.com/v2/sv/getAvailableLicensePackage
说明: 获取已经购买的并且当前可用的许可套餐信息列表
参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseForm | 是 | number | 许可形式: 1-云锁 2-软锁 | |
currentPage | 否 | number | 1 | 当前页 |
pageSize | 否 | number | 10 | 每页数量 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data9 |
Data9
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
rows | LicensePackage[] | 许可套餐列表 |
LicensePackage
字段名称 | 类型 | 描述 |
---|---|---|
name | string | 套餐名称 |
guid | string | 套餐序列号 |
platform | number | 系统平台 7: 传统(Windows/x86 Linux/MacOS) 24: 智能(Android/ARM Linux) 当许可套餐的许可形式为软锁时返回此字段 |
surplus | number | 套餐的剩余可用量, 有数量限制的许可套餐会返回此字段 |
deadline | string | 套餐的到期时间, 有时间限制的许可套餐会返回此字段 |
- 示例: 请求内容:
{
"licenseForm": 1,
"currentPage": 1,
"pageSize": 10
}
响应内容:
{
"code": 0,
"data": {
"totalPage": 1,
"rows": [
{
"surplus": 10,
"name": "云锁 30 天试用",
"guid": "a9606bc320974fa989571e65e230cb58",
"deadline": "2019-05-07 23:59:59"
}
],
"totalCount": 1
},
"desc": "成功"
}
2. 获取账户余额信息
- 接口地址:
https://openapi.senseyun.com/v2/sv/getAvailableLicensePackage
参数: 无
响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | AccountBalance |
AccountBalance
字段名称 | 类型 | 描述 |
---|---|---|
totalBalance | number | 账户可用余额总额 |
topupBalance | number | 可用充值余额 |
voucherBalance | number | 可用赠送余额 |
- 示例: 请求内容:
{ }
响应内容:
{
"code": 0,
"data": {
"totalBalance": 150,
"topupBalance": 100,
"voucherBalance": 50
},
"desc": "成功"
}
3. 获取账单信息
- 接口地址:
https://openapi.senseyun.com/v2/sv/getBillInfo
说明: 获取已经扣款的许可账单信息
参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseCategory | 否 | number | 许可类型: 1-账号许可 2-授权码许可 | |
userAccount | 否 | string | 许可类型为账号许可时, 填写用户账号(手机/邮箱/影子账号); 许可类型为授权码时, 填写授权码 | |
licenseId | 否 | number | 许可 ID | |
payTimeBegin | 否 | number | 扣款开始时间, UTC 时间戳(秒) | |
payTimeEnd | 否 | number | 扣款结束时间, UTC 时间戳(秒) | |
currentPage | 否 | number | 1 | 当前页数, 从 1 开始 |
pageSize | 否 | number | 10 | 每页数量, 取值范围: [1, 100] |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data10 |
Data10
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
pageSize | number | 总条数 |
rows | Bill[] | 账单列表 |
Bill
字段名称 | 类型 | 描述 |
---|---|---|
billNo | string | 账单编号 |
licenseId | number | 许可 ID |
licenseMode | number | 扣费方式 1-账户余额 2-赠送许可 |
licenseForm | number | 许可形式 1-云锁 2-软锁 |
userAccount | string | 用户账号或授权码 |
pricingMode | string | 订阅模式 daily - 按天收费 yearly - 按年收费 once - 一次性收费 |
reason | string | 扣费原因 distribute - 发布许可 update - 更新许可 |
licenseAmount | number | 许可金额 |
licenseBindAmount | number | 绑定设备金额 |
licenseBorrowAmount | number | 许可借阅金额 |
amount | number | 预估费用 |
dealAmount | number | 实扣金额 |
deductAt | string | 扣款时间(yyyy-MM-dd HH:mm:ss) |
status | string | 扣款状态 paid - 已扣款 |
platform | number | 系统平台 7: 传统(Windows/x86 Linux/MacOS) 24: 智能(Android/ARM Linux) |
createAt | string | 创建时间(yyyy-MM-dd HH:mm:ss) |
- 示例: 请求内容:
{
"licenseCategory": 2,
"currentPage": 1,
"pageSize": 10
}
响应内容:
{
"code": 0,
"data": {
"totalPage": 1,
"totalCount": 1,
"rows": [
{
"amount": 2433,
"billNo": "B041000000000000620210924112525120",
"createAt": "2021-09-24 11:25:25",
"dealAmount": 2433,
"deductAt": "2021-09-24 11:26:23",
"licenseAmount": 58,
"licenseBindAmount": 2375,
"licenseBorrowAmount": 0,
"licenseForm": 2,
"licenseId": 2021092401,
"licenseMode": 0,
"platform": 7,
"pricingMode": "once",
"reason": "distribute",
"status": "paid",
"userAccount": "B4TT-P4PF-7RW6-XVM5"
}
]
},
"desc": "成功"
}
七. 云软许可管理接口
1. 不依赖模板发布许可
- 接口地址:
https://openapi.senseyun.com/v2/sv/issueLicenseByProduct
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseId | 是 | number | 产品(许可) ID, 取值范围: [1, 4294967295], 必须在平台上存在 | |
isForever | 是 | boolean | 是否永久许可 | |
licenseForm | 是 | number | 许可形式 1-云锁 2-软锁 | |
userAccount | 是 | string | 用户账号(绑定的手机/邮箱皆可) | |
version | 否 | number | 0 | 许可版本 |
startTime | 否 | number | 开始时间, UTC 时间戳(秒) | |
endTime | 否 | number | 结束时间, UTC 时间戳(秒) | |
span | 否 | number | 时间跨度(天) | |
licenseMode | 是 | number | 扣费方式 0-账户余额 1-赠送许可 2-套餐许可 | |
pricingMode | 否 | string | licenseMode 为 0 或 2 时必选订阅模式 对于账户余额, 取值如下: daily - 按天 yearly - 按年 once - 一次性 对于赠送许可, 无需传入 对于套餐许可, 指定使用某个套餐时, 取值为对应套餐的序列号; 自动匹配套餐时, 取值为 auto | |
counter | 否 | number | licenseForm = 1 时生效许可使用次数 | |
offlineDays | 否 | number | licenseForm = 2 时必选离线时长(天), 取值范围: [1, 180] | |
licBindLimit | 否 | number | licenseForm = 2 时必选同时绑定设备数 | |
licBindMaxLimit | 否 | number | licenseForm = 2 时必选累积绑定设备数 | |
isOffline | 否 | boolean | false | licenseForm = 2 时生效是否支持离线 |
kickOut | 否 | boolean | true | licenseForm = 1 时生效是否允许踢出 |
module | 否 | Module[] | 子模块列表 | |
pub | 否 | string | 公开区的 hex 字符串 | |
rom | 否 | string | 只读区的 hex 字符串 | |
raw | 否 | string | 读写区的 hex 字符串 | |
dataZonePadMode | 否 | number | 1 | 数据区编辑模式 1-二进制模式 2-Key/Value 模式 |
kvSeparator | 否 | string | : | dataZonePadMode = 2 时生效 Key/Value 分隔符, 长度为 1 |
kvConnector | 否 | string | ; | dataZonePadMode = 2 时生效 Key/Value 连接符, 长度为 1 |
rawResize | 否 | number | 重置读写区大小, 取值范围: [读写区数据长度, 65535] | |
remark | 否 | string | 备注 | |
contractNo | 否 | string | 合同编号 | |
tagIds | 否 | array | 标签 ID 列表 |
- 注意事项:
- 输入参数
userAccount
对于普通用户是指添加用户时的邮箱或手机号, 对于影子账号是指添加影子账号是返回的userAccount
值; - 字段
kickOut
仅适用于云锁许可(即licenseForm
= 1). 当kickOut
设置为 true 时, 表示最后一次许可登录的机器会踢出上一次许可登录的机器(默认); 当kickOut
设置为 false 时, 表示许可登录后不会被后续机器的许可登录踢出, 直到主动退出后续机器才可以许可登录 - 字段
rawResize
表示设置读写区的有效长度, 当软件运行时可能会写入比预设的数据区内容更多的数据时, 则需要对读写区内容进行扩容占位, 该字段值应设置的尽可能符合实际所需, 以提高运行时读写效率, 默认占位字节为 0x00. 例如, 预设的读写区内容为 HelloWorld, 如果软件在运行时向读写区写入 01234567890 时将报错, 因为预设的读写区的有效长度为 1028(HelloWorld 字符串的长度为 10); 此时, 如果设置了rawResize
= 15, 则预设的读写区的有效长度便会被设置为 15(此时读写区实际内容为 HelloWorld 加 5 个 0x00 占位字节), 此时再写入 01234567890 时将是正常的 - 设置自动匹配套餐(
licenseMode
= 2, 且pricingMode
= auto)时, 按照许可条款自动匹配可用的套餐; 优先匹配快要过期或剩余许可数较少的套餐
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data11 |
Data11
字段名称 | 类型 | 描述 |
---|---|---|
cost | number | 许可预估费用 |
- 示例: 请求内容:
{
"licenseId": 10,
"isForever": false,
"licenseForm": 2,
"licenseMode": 0,
"pricingMode": "daily",
"userAccount": "abc@163.com",
"span": 20,
"offlineDays": 10,
"licBindLimit": 12,
"licBindMaxLimit": 120,
"module": [
1,
3,
4
],
"rom": "4256ef",
"raw": "542136ff",
"pub": "25364787df"
}
响应内容:
{
"desc": "成功",
"code": 0,
"data": {
"cost": 5.00
}
}
2. 依赖模板发布许可
- 接口地址:
https://openapi.senseyun.com/v2/sv/issueLicense
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
templateId | 是 | number | 模板 ID | |
userAccount | 是 | string | 用户账号 |
- 注意事项:
- 输入参数
userAccount
对于普通用户是指添加用户时的邮箱或手机号, 对于影子账号是指添加影子账号是返回的userAccount
值
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data11 |
- 示例: 请求内容:
{
"templateId": 10,
"userAccount": "abc@163.com"
}
响应内容:
{
"desc": "成功",
"code": 0,
"data": {
"cost": 3.00
}
}
3. 更新(修改)已发许可
- 接口地址:
https://openapi.senseyun.com/v2/sv/updateLicense
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseId | 是 | number | 产品(许可) ID, 取值范围: [1, 4294967295], 必须在平台上存在 | |
userAccount | 是 | string | 用户账号(绑定的手机/邮箱皆可) | |
licenseForm | 是 | number | 许可形式 1-云锁 2-软锁 | |
pricingMode | 否 | string | licenseMode 为 0 或 2 时必选订阅模式 对于账户余额, 取值如下: daily - 按天 yearly - 按年 once - 一次性 对于赠送许可, 无需传入 对于套餐许可, 指定使用某个套餐时, 取值为对应套餐的序列号 | |
version | 否 | object | 0 | 许可版本, 不传入则不修改; 有两个属性: op, value, op 目前只能为 set, value 为许可版本号, 取值范围[0, 4294967295] |
endTime | 否 | object | 许可结束时间. 有两个属性: op, value, op 可选值为 set/inc/dec/disable, set 为设置许可结束时间为 value 值, inc 为在已有结束时间基础上增加 value 值, desc 为在已有结束时间上减少 value 值, disable 为禁用此项; value 为秒数 | |
span | 否 | object | 时间跨度(天). 有两个属性: op, value, op 可选值为 set/inc/dec, set 为设置时间跨度为 value 值, inc 为在已有时间跨度上增加 value 值, dec 为在已有时间跨度上减少 value 值, value 为修改许可的时间跨度值, 取值范围: [1, 18250] | |
counter | 否 | object | licenseForm = 1 时生效许可使用次数, 有两个属性: op, value, op 目前只能为 set, value 为使用次数值 | |
offlineDays | 否 | object | licenseForm = 2 时必选离线时长(天), 有两个属性: op, value, op 目前只能为 set, value 为离线时长天数 | |
licBindLimit | 否 | object | licenseForm = 2 时必选同时绑定设备数, 有两个属性: op, value, op 目前只能为 set, value 为设备数 | |
licBindMaxLimit | 否 | object | licenseForm = 2 时必选累积绑定设备数, 有两个属性: op, value, op 目前只能为 set, value 为设备数 | |
isOffline | 否 | boolean | false | licenseForm = 2 时生效是否支持离线 |
kickOut | 否 | boolean | true | licenseForm = 1 时生效是否允许踢出 |
module | 否 | object | 子模块列表, 有两个属性: op, value, op 可选值为 set/inc/dec/disable, set 为设置模块, inc 为增加模块, dec 为去掉模块, disable 为清空模块; value 为 array, 取值范围: [1, 64] | |
pub | 否 | object | 公开区, 只有一个属性: data, 为该数据区的 hex 字符串 | |
rom | 否 | object | 只读区, 只有一个属性: data, 为该数据区的 hex 字符串 | |
raw | 否 | object | 读写区, 只有一个属性: data, 为该数据区的 hex 字符串 | |
dataZonePadMode | 否 | number | 1 | 数据区编辑模式 1-二进制模式 2-Key/Value 模式 |
kvSeparator | 否 | string | : | dataZonePadMode = 2 时生效 Key/Value 分隔符, 长度为 1 |
kvConnector | 否 | string | ; | dataZonePadMode = 2 时生效 Key/Value 连接符, 长度为 1 |
rawResize | 否 | number | 重置读写区大小, 取值范围: [读写区数据长度, 65535] | |
remark | 否 | string | 备注 | |
contractNo | 否 | string | 合同编号 | |
tagIds | 否 | array | 标签 ID 列表. 不传入则不作修改; 传入空列表则清空标签 |
- 注意事项:
- 输入参数
userAccount
对于普通用户是指添加用户时的邮箱或者手机; 对于影子账号是指添加影子账号时返回的userAccount
值 - 在许可有效期内可以免费更新 12 次, 超过 12 次后需要购买许可更新次数包, 每更新一次扣除一次
- 字段
pricingMode
表示订阅模式, 目前只能对软锁许可(即licenseForm
为 2), 且扣费方式为账户余额(即licenseMode
为 0)的许可修改, 只允许从按天或按年修改为一次性. 按此修改时, 更新所需费用会减去已支付的部分费用 - 字段
kickOut
仅适用于云锁许可(即licenseForm
= 1). 当kickOut
设置为 true 时, 表示最后一次许可登录的机器会踢出上一次许可登录的机器(默认); 当kickOut
设置为 false 时, 表示许可登录后不会被后续机器的许可登录踢出, 直到主动退出后续机器才可以许可登录 - 字段
rawResize
表示设置读写区的有效长度, 当软件运行时可能会写入比预设的数据区内容更多的数据时, 则需要对读写区内容进行扩容占位, 该字段值应设置的尽可能符合实际所需, 以提高运行时读写效率, 默认占位字节为 0x00. 例如, 预设的读写区内容为 HelloWorld, 如果软件在运行时向读写区写入 01234567890 时将报错, 因为预设的读写区的有效长度为 1028(HelloWorld 字符串的长度为 10); 此时, 如果设置了rawResize
= 15, 则预设的读写区的有效长度便会被设置为 15(此时读写区实际内容为 HelloWorld 加 5 个 0x00 占位字节), 此时再写入 01234567890 时将是正常的
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data12 |
Data12
字段名称 | 类型 | 描述 |
---|---|---|
licenseId | number | 许可 ID |
userAccount | string | 用户账号 |
licenseForm | number | 许可形式 1-云锁 2-软锁 |
licenseMode | number | 扣费方式 0-账户余额 1-赠送许可 2-套餐许可 |
pricingMode | string | 订阅模式 对于账户余额, 取值如下: daily - 按天 yearly - 按年 once - 一次性 对于赠送许可, 该字段无实际意义 对于套餐许可, 取值为对应套餐的序列号 |
isForever | boolean | 是否永久许可 |
version | number | 许可版本 |
startTime | string | 许可开始时间(yyyy-MM-dd HH:mm:ss) |
endTime | string | 许可结束时间(yyyy-MM-dd HH:mm:ss) |
span | number | 时间跨度(天) |
offlineDays | number | 离线时长(天) |
licBindLimit | number | 同时绑定设备数 |
licBindMaxLimit | number | 累积绑定设备数 |
rom | string | 只读区 hex 字符串 |
raw | string | 读写区 hex 字符串 |
pub | string | 公开区 hex 字符串 |
remark | string | 备注 |
contractNo | string | 合同编号 |
tags | array | 标签列表 |
cost | number | 本次更新所需费用 |
- 示例: 请求内容:
{
"licenseId": "1024",
"userAccount": "user@account.com",
"licenseForm": 2,
"version": {
"op": "set",
"value": 1
},
"endTime": {
"op": "dec",
"value": 200
},
"span": {
"op": "set",
"value": 123456789
},
"offlineDays": {
"op": "set",
"value": 10
},
"licBindLimit": {
"op": "set",
"value": 2
},
"licBindMaxLimit": {
"op": "set",
"value": 3
},
"module": {
"op": "set",
"value": [ 1, 2, 3, 64 ]
},
"rom": {
"data": "1234"
},
"raw": {
"data": "1234"
},
"pub": {
"data": "123456"
},
"remark": "备注信息",
"contractNo": "合同编号 1023",
"tagIds": [ 1, 2 ]
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"licenseId": "1024",
"userAccount": "user@account.com",
"isForever": false,
"licenseForm": 2,
"licenseMode": 0,
"pricingMode": "yearly",
"version": 1,
"startTime": "yyyy-MM-dd HH:mm:ss",
"endTime": "yyyy-MM-dd HH:mm:ss",
"licDuration": 5,
"span": 3,
"offlineDays": 5,
"licBindLimit": 5,
"licBindMaxLimit": 5,
"module": [ 49, 1, 3, 5 ],
"rom": "xxxxx",
"raw": "xxxxx",
"pub": "xxxxx",
"remark": "备注信息",
"contractNo": "合同编号 1023",
"tags": [
{
"id": 1,
"name": "标签 1"
},
{
"id": 2,
"name": "标签 2"
}
],
"cost": 2
}
}
4. 删除许可
- 接口地址:
https://openapi.senseyun.com/v2/sv/deleteLicense
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseId | 是 | number | 许可 ID | |
userAccount | 是 | string | 用户账号 | |
licenseForm | 是 | numbner | 许可形式: 1-云锁 2-软锁 |
- 注意事项:
- 输入参数
userAccount
对于普通用户是指添加用户时的邮箱或者手机; 对于影子账号是指添加影子账号时返回的userAccount
值
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
- 示例: 请求内容:
{
"licenseId": 1,
"userAccount": "abc@163.com",
"licenseForm": 1
}
响应内容:
{
"desc": "成功",
"code": 0
}
5. 搜索许可(许可签发时的状态, 并非当前使用中的状态)
- 接口地址:
https://openapi.senseyun.com/v2/sv/licenseList
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
userAccount | 否 | string | 用户账号, 支持模糊查找 | |
userId | 否 | string | 用户 ID | |
licenseIds | array | 否 | 许可 ID 列表 | |
licenseForms | array | 否 | 许可形式列表 | |
currentPage | number | 否 | 1 | 当前页, 从 1 开始 |
pageSize | number | 否 | 10 | 每页数量 |
- 注意事项:
- 输入参数
userAccount
对于普通用户是指添加用户时的邮箱或者手机; 对于影子账号是指添加影子账号时返回的userAccount
值
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data13 |
Data13
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
pageSize | number | 总条数 |
licenses | License[] | 许可列表 |
License
字段名称 | 类型 | 描述 |
---|---|---|
id | number | 许可唯一编号 |
licenseId | number | 许可 ID |
productName | string | 产品名称 |
tempId | number | 模板 ID |
templateName | string | 模板名称 |
userId | string | 用户 ID |
string | 用户邮箱 | |
userName | string | 用户名称 |
licenseForm | number | 许可形式 |
licenseMode | number | 扣费方式 |
pricingMode | string | 订阅模式 |
licenseFormDesc | string | 许可形式的描述, 云锁/软锁 |
isForever | boolean | 是否永久 |
isForeverDesc | string | 对是否永久的描述 |
hasStartTime | boolean | 是否有开始时间 |
startTime | number | 开始时间, UTC 时间戳(秒) |
hasEndTime | boolean | 是否有结束时间 |
endTime | number | 结束时间, UTC 时间戳(秒) |
hasSpanTime | boolan | 是否有时间跨度 |
spanTime | number | 时间跨度(天) |
hasCounter | boolean | 是否有使用次数 |
counter | number | 使用次数 |
licBindLimit | number | 同时绑定设备数 |
licBindMaxLimit | number | 累积绑定设备数 |
hasLicDuration | boolean | 是否有限定时长 |
licDuration | number | 限定时长(天) |
licStartTimeType | number | 时间限制类型 |
modules | array | 子模块列表 |
status | number | 许可状态 1-正常 5-已锁定 6-审批中 7-已拒绝 |
pubLicenseGuid | string | 许可 guid |
createTime | number | 创建时间, UTC 时间戳(秒) |
kickOut | boolean | 是否允许踢出 |
rom | string | 只读区 hex 字符串 |
raw | string | 读写区 hex 字符串 |
pub | string | 公开区 hex 字符串 |
kvSeparator | string | Key/Value 分隔符 |
kvConnector | string | Key/Value 连接符 |
rawResize | number | 重置读写区大小 |
remark | string | 备注信息 |
contractNo | string | 合同编号 |
tags | array | 标签信息 |
- 示例: 请求内容:
{
"userAccount": "demo1@test.com",
"userId": "",
"licenseIds": [
"123456",
"12345"
],
"licenseForms": [ 1, 2, 3 ],
"currentPage": 1,
"pageSize": 10
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"licenses": [
{
"id": 567,
"licenseId": 88888,
"productName": "测试产品",
"tempId": 123,
"templateName": "测试模板",
"userId": "543606e09d8c48c48ebf34d008379e60",
"email": "demo1@test.com",
"userName": "测试账号",
"licenseForm": 1,
"licenseFormDesc": "云锁",
"isForever": 0,
"isForeverDesc": "非永久",
"hasStartTime": true,
"startTime": 1488188325,
"hasEndTime": true,
"endTime": 1489188325,
"hasSpanTime": false,
"spanTime": 0,
"hasTimes": false,
"licenseMode": 0,
"pricingMode": "yearly",
"times": 0,
"licBindMaxLimit": 0,
"licBindMaxLimitDesc": "无限制",
"hasLicDuration": false,
"licDuration": 0,
"licStartTimeType": 0,
"modules": [
{
"moduleId": 1,
"moduleName": "测试 1"
},
{
"moduleId": 2,
"moduleName": "测试 2"
}
],
"status": 1,
"pubLicenseGuid": "6318d834602a472db4b8333acea94573",
"createTime": 1490695767,
"remark": "标签信息",
"contractNo": "合同编号 1023",
"tags": [
{
"id": 1,
"name": "标签 1"
},
{
"id": 2,
"name": "标签 2"
}
]
}
],
"totalPage": 1,
"totalCount": 1
}
}
6. 获取指定的软锁许可的信息
- 接口地址:
https://openapi.senseyun.com/v2/sv/softLockLicenseInfo
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseGuid | 是 | string | 许可 guid |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | License |
- 示例: 请求内容:
{
" licenseGuid": "6318d834602a472db4b8333acea94573"
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"id": 567,
"licenseId": 88888,
"productName": "测试产品",
"tempId": 123,
"templateName": "测试模板",
"userId": "543606e09d8c48c48ebf34d008379e60",
"email": "demo1@test.com",
"userName": "测试账号",
"licenseForm": 1,
"licenseFormDesc": "云锁",
"isForever": 0,
"isForeverDesc": "非永久",
"hasStartTime": true,
"startTime": 1488188325,
"hasEndTime": true,
"endTime": 1489188325,
"hasSpanTime": false,
"pricingMode": "yearly",
"licenseMode": 0,
"spanTime": 0,
"hasTimes": false,
"times": 0,
"licBindMaxLimit": 0,
"licBindMaxLimitDesc": "无限制",
"hasLicDuration": false,
"licDuration": 0,
"licStartTimeType": 0,
"modules": [
{
"moduleId": 1,
"moduleName": "测试 1"
},
{
"moduleId": 2,
"moduleName": "测试 2"
}
],
"status": 1,
"dataZonePadMode": 1,
"pubLicenseGuid": "6318d834602a472db4b8333acea94573",
"createTime": 1490695767
}
}
7. 获取软锁许可的绑定机器信息
- 接口地址:
https://openapi.senseyun.com/v2/sv/softLockbindList
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseGuid | 是 | string | 许可 guid | |
currentPage | 否 | number | 1 | 当前页数, 从 1 开始 |
pageSize | 否 | number | 10 | 每页数量 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data14 |
Data14
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
bindList | SoftLockBind[] | 绑定列表 |
SoftLockBind
字段名称 | 类型 | 描述 |
---|---|---|
id | number | 绑定记录编号 |
endUserGuid | string | 用户 ID |
offlineExpireTime | number | 许可离线有效期截至时间, UTC 时间戳(秒) |
licenseGuid | string | 许可 guid |
hardwareName | string | 绑定的设备名称 |
hardwareMacList | string | 绑定设备的 mac 地址列表, 逗号分隔 |
createAt | number | 绑定时间, UTC 时间戳(秒) |
bindStatus | number | 绑定状态: 1-已绑定 2-已主动解绑 3-服务端标记为强制解绑 4-已强制解绑 5-许可被新许可替换 6-已被新的绑定记录覆盖 |
hardwareUserName | string | 绑定设备(计算机)系统用户名 |
lastRefreshName | number | 上一次激活时间, UTC 时间戳(秒) |
machineId | string | 机器 ID |
devId | string | 开发者 ID |
hardwareInternetIp | string | 绑定设备的公网 IP |
licNumberId | number | 许可 ID |
hardwareIpList | string | 绑定设备的 IP 地址列表, 逗号分隔 |
updateAt | number | 绑定记录更新时间, UTC 时间戳(秒) |
- 示例: 请求内容:
{
"licenseGuid": "6318d834602a472db4b8333acea94573",
"currentPage": 1,
"pageSize": 10
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"bindList": [
{
"id": "5d91e1256ee847678269ce5c446b4e36",
"endUserGuid": "ba28b2ef15604f0988c182c335d5ae30",
"offlineExpireTime": 1496152668,
"offlineDays": 77,
"licenseGuid": "dc13cd8886104599b997992b0e3220c7",
"hardwareName": "LIYJ-PC",
"hardwareMacList": "6C-71-D9-DE-15-E9",
"createAt": 156424452000,
"updateAt": 15525463550,
"bindStatus": 1,
"hardwareUserName": "abc@163.com",
"lastRefreshTime": 1489499868,
"hardwareId": "",
"machineId": "asadfeaf1452145",
"devId": "0700000000000098",
"hardwareInternetIp": "114.253.35.223",
"licNumberId": 777,
"hardwareIpList": "192.168.1.107"
}
],
"totalPage": 1,
"totalCount": 1
}
}
8. 获取指定的软锁许可的累积绑定设备信息
- 接口地址:
https://openapi.senseyun.com/v2/sv/softLockBoundInfo
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseGuid | 是 | string | 许可 guid | |
currentPage | 否 | number | 1 | 当前页数, 从 1 开始 |
pageSize | 否 | number | 10 | 每页数量 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data15 |
Data15
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
rows | SoftLockBound[] | 绑定列表 |
SoftLockBound
字段名称 | 类型 | 描述 |
---|---|---|
bindId | string | 绑定记录 ID |
machineId | string | 机器 ID |
pcName | string | 绑定机器名称 |
mac | string | 绑定机器的 mac 地址列表, 逗号分隔 |
localIp | string | 绑定机器的局域网 IP |
bindStatus | number | 绑定状态 1-已绑定 2-已手动解绑(在线) 3-强制解绑中(WEB 发起) 4-已自动解绑 5-已绑定(待更新许可) 7-已手动解绑(离线) 8-强制解绑中(API 发起) 10-自动解绑中(许可已删除) 11-自动解绑中(重新签发许可) |
bindTime | string | 许可绑定时间 |
statusChangeTime | string | 上一次状态变更时间 |
offlineExpireTime | string | 许可离线有效期截止时间 |
lastRefreshTime | string | 上一次激活时间 |
- 示例: 请求内容:
{
"licenseGuid": "6318d834602a472db4b8333acea94573",
"currentPage": 1,
"pageSize": 10
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"bindList": [
{
"bindId": "7071d816f5cc4035a155c74267c4ed3f",
"bindStatus": 1,
"bindTime": "2023-01-28 17:03:02",
"lastRefreshTime": "2023-01-28 17:03:02",
"localIp": "10.10.1.134",
"mac": "D0-8E-79-0F-96-ED",
"machineId": "52e22d84ab152c387b9e8d96b6111351eb4bd014e92580e1f53bae70c99f53ba",
"offlineExpireTime": "2023-02-08 17:03:02",
"pcName": "PC",
"statusChangeTime": "2023-01-28 17:03:02"
}
],
"totalPage": 1,
"totalCount": 1
}
}
9. 获取指定的软锁许可的绑定历史信息(包含解绑信息)
- 接口地址:
https://openapi.senseyun.com/v2/sv/softLockbindHistory
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseGuid | 是 | string | 许可 guid | |
currentPage | 否 | number | 1 | 当前页数, 从 1 开始 |
pageSize | 否 | number | 10 | 每页数量 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data16 |
Data15
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
rows | SoftLockBindHistory[] | 绑定列表 |
SoftLockBindHistory
字段名称 | 类型 | 描述 |
---|---|---|
id | string | 绑定记录 ID |
endUserGuid | string | 用户 ID |
offlineExpireTime | number | 许可离线有效期截止时间, UTC 时间戳(秒) |
offlineDays | number | 许可离线时长(天) |
licenseGuid | string | 许可 guid |
hardwareName | string | 绑定的机器名称 |
hardwareMacList | string | 绑定机器的 mac 地址列表, 逗号分隔 |
createAt | number | 绑定时间, UTC 时间戳(秒) |
bindStatus | number | 绑定状态 1-已绑定 2-已手动解绑(在线) 3-强制解绑中(WEB 发起) 4-已自动解绑 5-已绑定(待更新许可) 7-已手动解绑(离线) 8-强制解绑中(API 发起) 10-自动解绑中(许可已删除) 11-自动解绑中(重新签发许可) |
hardwareUserName | string | 绑定计算机的系统用户名 |
lastRefreshTime | number | 上次激活时间, UTC 时间戳(秒) |
machineId | string | 机器 ID |
devId | string | 开发者 ID, hex 形式 |
hardwareInternetIp | string | 绑定机器的公网 IP |
licNumberId | number | 许可 ID |
hardwareIpList | string | 绑定机器的局域网 IP 列表, 逗号分隔 |
updateAt | number | 绑定状态更新时间, UTC 时间戳(秒) |
- 示例: 请求内容:
{
"licenseGuid": "6318d834602a472db4b8333acea94573",
"currentPage": 1,
"pageSize": 10
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"bindList": [
{
"id": "5d91e1256ee847678269ce5c446b4e36",
"endUserGuid": "ba28b2ef15604f0988c182c335d5ae30",
"offlineExpireTime": 1496152668,
"offlineDays": 77,
"licenseGuid": "dc13cd8886104599b997992b0e3220c7",
"hardwareName": "LIYJ-PC",
"hardwareMacList": "6C-71-D9-DE-15-E9",
"historyCreateAt": "2017-01-14 17:44:49",
"bindStatus": 1,
"hardwareUserName": "abc@163.com",
"lastRefreshTime": 1489499868,
"machineId": "41253135462145sdsafd",
"createAt": 15625562212552,
"updateAt": 1521252222,
"devId": "0700000000000098",
"hardwareInternetIp": "114.253.35.223",
"licNumberId": 777,
"hardwareIpList": "192.168.1.107"
}
],
"totalPage": 1,
"totalCount": 1
}
}
10. 获取具体机器的软锁许可的最新绑定(解绑)信息
- 接口地址:
https://openapi.senseyun.com/v2/sv/softLockbindMachineList
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseGuid | 是 | string | 许可 guid | |
machineId | 是 | string | 机器 ID |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | SoftLockBindHistory |
- 示例: 请求内容:
{
"licenseGuid": "6318d834602a472db4b8333acea94573",
"machineId": "6219d834602a472db4b8333acea94573"
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"id": "5d91e1256ee847678269ce5c446b4e36",
"endUserGuid": "ba28b2ef15604f0988c182c335d5ae30",
"offlineExpireTime": 1496152668,
"offlineDays": 77,
"licenseGuid": "dc13cd8886104599b997992b0e3220c7",
"hardwareName": "LIYJ-PC",
"hardwareMacList": "6C-71-D9-DE-15-E9",
"createAt": 15212454224412,
"bindStatus": 1,
"hardwareUserName": "abc@163.com",
"lastRefreshTime": 1489499868,
"machineId": "asdfae14255202",
"devId": "0700000000000098",
"hardwareInternetIp": "114.253.35.223",
"licNumberId": 777,
"hardwareIpList": "192.168.1.107",
"updateAt": 1520150454452
}
}
11. 获取具体机器的软锁许可的绑定历史信息(包含解绑信息)
- 接口地址:
https://openapi.senseyun.com/v2/sv/softLockbindMachineHistory
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseGuid | 是 | string | 许可 guid | |
machineId | 是 | string | 机器 ID |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data16 |
Data16
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
bindList | SoftLockBindHistory[] | 绑定列表 |
- 示例: 请求内容:
{
"licenseGuid": "6318d834602a472db4b8333acea94573",
"machineId": "6219d834602a472db4b8333acea94573"
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"bindList": [
{
"id": "5d91e1256ee847678269ce5c446b4e36",
"endUserGuid": "ba28b2ef15604f0988c182c335d5ae30",
"offlineExpireTime": 1496152668,
"offlineDays": 77,
"licenseGuid": "dc13cd8886104599b997992b0e3220c7",
"hardwareName": "LIYJ-PC",
"hardwareMacList": "6C-71-D9-DE-15-E9",
"historyCreateAt": "2017-01-14 17:44:49",
"bindStatus": 1,
"hardwareUserName": "abc@163.com",
"lastRefreshTime": 1489499868,
"machineId": "asdfeeeejkj555",
"devId": "0700000000000098",
"ceateAt": 152552255,
"updateAt": 1533536266336,
"hardwareInternetIp": "114.253.35.223",
"licNumberId": 777,
"hardwareIpList": "192.168.1.107"
}
],
"totalPage": 1,
"totalCount": 1
}
}
12. 解绑软锁许可
- 接口地址:
https://openapi.senseyun.com/v2/sv/softLockUnbind
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
bindId | 是 | string | 绑定记录 ID |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
- 示例: 请求内容:
{
"bindId": "5d91e1256ee847678269ce5c446b4e36"
}
响应内容:
{
"code": 0,
"desc": "成功"
}
13. 获取指定许可的当前使用状态
- 接口地址:
https://openapi.senseyun.com/v2/sv/licenseUseInfo
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseId | 是 | number | 许可 ID | |
licenseForm | 是 | number | 许可形式: 1-云锁, 2-软锁 | |
userAccount | 是 | string | 用户账号 |
- 注意事项:
- 输入参数
userAccount
对于普通用户是指添加用户时的邮箱或手机号, 对于影子账号是指添加影子账号时返回的userAccount
字段值;
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | LicenseUseInfo |
LicenseUseInfo
字段名称 | 类型 | 描述 |
---|---|---|
isUsed | boolean | 是否已使用 |
isExpired | boolean | 是否已过期 |
expiredTime | number | 许可过期时间, UTC 时间戳(秒) |
startTime | number | 许可开始时间, UTC 时间戳(秒) |
endTime | number | 许可结束时间, UTC 时间戳(秒) |
spanTime | number | 时间跨度(天) |
firstUseTime | number | 仅云锁支持 可首次使用时间, UTC 时间戳(秒) |
usedCount | number | 仅云锁支持 已使用次数, 仅当设置了许可使用次数时才返回 |
remainderCount | number | 仅云锁支持 剩余使用次数, -1 代表无设置 |
licBindLimit | number | 仅软锁支持 同时绑定设备数 |
licBindMaxLimit | number | 仅软锁支持 累积绑定设备数 |
licBindCount | number | 仅软锁支持 已绑定设备数 |
firstBindTime | number | 仅软锁支持 首次绑定时间, UTC 时间戳(秒) |
- 示例: 请求内容:
{
"licenseId": "325",
"licenseForm": 2,
"userAccount": "addf904@qq.com"
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"isExpired": false,
"expiredTime": 1563614455000,
"startTime": 1562478545500,
"endTime": 1592478545300,
"spanTime": 30,
"isUsed": true,
"firstBindTime": 1563614155000,
"licBindMaxLimit": 100,
"licBindLimit": 20,
"licBindCount": 5
}
}
14. 获取账号许可使用情况
- 接口地址:
https://openapi.senseyun.com/v2/sv/getAccountLicenseUsage
说明: 获取指定用户账号下的所有许可 ID 的实际使用情况.
参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
userAccount | 是 | string | 用户账号 | |
currentPage | 否 | number | 1 | 当前页, 从 1 开始 |
pageSize | 否 | number | 10 | 每页数量, 取值范围: [1, 100] |
- 注意事项:
- 输入参数
userAccount
对于普通用户是指添加用户时的邮箱或手机号, 对于影子账号是指添加影子账号时返回的userAccount
字段值;
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | Data17 |
Data17
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
licenses | AccountLicenseUsage[] |
AccountLicenseUsage
字段名称 | 类型 | 描述 |
---|---|---|
licenseId | number | 许可 ID |
productName | string | 产品名称 |
licenseForm | number | 许可形式, 1-云锁, 2-软锁 |
isUsed | boolean | 是否已使用 |
isForever | boolean | 是否永久许可 |
isExpired | boolean | 是否已过期 |
expiredTime | number | 许可过期时间, UTC 时间戳(秒) |
startTime | number | 许可开始时间, UTC 时间戳(秒) |
endTime | number | 许可结束时间, UTC 时间戳(秒) |
spanTime | number | 时间跨度(天) |
counter | number | 使用次数 |
firstUseTime | number | 仅云锁支持 许可首次使用时间, UTC 时间戳(秒) |
remainderCount | number | 仅云锁支持 剩余使用次数 |
licBindLimit | number | 仅软锁支持 同时绑定设备数 |
licBindMaxLimit | number | 仅软锁支持 累积绑定设备数 |
licBindCount | number | 仅软锁支持 已绑定设备数 |
firstBindTime | number | 仅软锁支持 首次绑定时间, UTC 时间戳(秒) |
- 示例: 请求内容:
{
"userAccount": "zhangsan@163.com",
"currentPage": 1,
"pageSize": 10
}
响应内容:
{
"code": 0,
"data": {
"licenses": [
{
"licBindLimit": 5,
"licBindMaxLimit": 5,
"licBindCount": 1,
"licBindMaxCount": 1,
"bindingCount": 1,
"maxBound": 5,
"maxBinding": 5,
"licenseForm": 2,
"spanTime": 180,
"expiredTime": 1555141552,
"isUsed": true,
"productName": "计算器",
"isForever": false,
"boundCount": 1,
"firstBindTime": 1539589552,
"isExpired": false,
"licenseId": 888
},
{
"licBindLimit": 5,
"licBindMaxLimit": 5,
"licBindCount": 0,
"licBindMaxCount": 1,
"bindingCount": 0,
"maxBound": 5,
"maxBinding": 5,
"licenseForm": 2,
"spanTime": 5,
"expiredTime": 1540727868,
"isUsed": true,
"productName": "绘图",
"isForever": false,
"boundCount": 1,
"firstBindTime": 1540295868,
"endTime": 1572537599,
"isExpired": true,
"licenseId": 999
},
{
"licenseForm": 1,
"spanTime": 100,
"isUsed": false,
"productName": "计算器",
"isForever": false,
"isExpired": false,
"licenseId": 888
}
],
"totalPage": 1,
"totalCount": 3
},
"desc": "成功"
}
15. 使用 C2D 反查许可
- 接口地址:
https://openapi.senseyun.com/v2/sv/findBoundSoftLicenseByC2d
说明: 获取指定用户账号下的所有许可 ID 的实际使用情况.
参数: 请将 C2D 内容作为请求的 body 直接传入
注意事项:
- 由 Virbox 用户工具导出的 C2D 文件具有时效性, 默认时效是 24 小时, 超过便失效, 因 此在调用该接口时请确保得到的 C2D 文件是最新导出的文件, 否则接口会返回相应的错误
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | AccountSoftLicenseC2dLookupResult[] |
AccountSoftLicenseC2dLookupResult
字段名称 | 类型 | 描述 |
---|---|---|
account | string | 用户账号 |
desc | string | 备注信息 |
templateName | string | 模板名称 |
productName | string | 产品名称 |
licenseId | number | 许可 ID |
isForever | boolean | 是否永久 |
startTime | string | 许可开始时间(yyyy-MM-dd HH:mm:ss) |
endTime | string | 许可结束时间(yyyy-MM-dd HH:mm:ss) |
createTime | string | 许可签发时间(yyyy-MM-dd HH:mm:ss) |
- 示例: 请求内容:
{
"version": 3,
"c2dType": 1,
"pcName": "DESKTOP-S9216",
"os": "MicrosoftWindows10(build9200)x64",
"ip": "1.2.3.4",
"mac": "AA-AA-AA-AA-AA-AA",
"machineId": "72365cc425626ccd8b8f3bd6a23ad78db3f55cbfb2d7787fe28c4497c5b6155c",
"reqData": "AgAAALuyTWEkbiT1Ccy6GpGLyUJXXVuIFz3baZW6t1nSx9/tUSCPzIv4rcKbzeYnbgaOJI2mGycwLACETor1k3zH33yaKEPXwcszdPqQuSu9mND/8gjC/GEgrMtksVKG7RGIlKh8x1c61TLhXHICzHTR5basZFD7tJDhLJFKCrOmFudb32enBpp8H9QNkjFSo0EZDWV5IoElDkwxcOBFY+OygtQt6MyqxGZ9ND5Q4MdqC5/xPOL7jswV02IRCCE7Vb3M+WpqePIEAO4X0MHCNhZvpInG5hN3z98lDBg08u/iSbyQdwIFKHEVP1be74+P58UiuVwMdIgHl59P5E5b/KZnZVTTRgf5+5n7eHrl9uZezM+kXmD0jLIv4gC+42dvLJV7mwdjZe8hS99IgNPyoswedJ/6vKHdklQuoLgQed3RIVFAqnrw3PtrfqmsfjRhaFGpqPlMfAcUG2dmkN0njNaXxmI=",
"slv2": {
"version": 1,
"protocol": 2147483649,
"ssVer": "2.4.0.54681",
"from": "72365cc425626ccd8b8f3bd6a23ad78db3f55cbfb2d7787fe28c4497c5b6155c",
"hwfp": "AwAAAJhJSFXIQBBxdJPyzPbj/1qFNntGrQW98NP00pY2BqmYSrRiuCIkEImlAt4mxFrV/Qjg/aKdbZS4PKwzhDOPMWFy2LbQCcyT1vYsq9/E6oP8k6EEtzJDifuAv+1OrxDEAbo/tgdXvRj3ajWP3BcixLvz4tiYclkOh7kn1LFD7ZyhFkIFeu8R6Df2+QsmLzkPYwTkfkg3cYXPl29jzL3NnphTJer2toFg0LqUceOG8eCD9XtJ+LDvraL0mAlxfG6snBTOyh2lGk/aWVdTtKedmcPOuIxD9c6O0F9LriXHlVQogGaqLcmoQN23IfAlsCmrcL/BB+0SGQWEFpvL85zAWXVuWH6fV8mmAVKVe9l9QxABdMdIY2n6jp6UztKMu1pph5MoJVbpjiTyTjc4fL61fjo+UQx37FN5VRLiPw7Mp1LikqISQkcRvIlyUMI/D9qommShZIg3pqAB2YuNYY7Hw+EkX50KOHFmHAK8t0ecilrs5LFATm5itpgsAbKtTRSnRQ==",
"info": "AQAAAL70frHR3tO60mkgA9WYjwXjEGiphHSWwWe8gYYTdLBpil9X4gwgfja9fDamS//ouMVoUMalNAdeclXYrnvqgl6KxE5S00mPPuhVtPpwIq5gkGOGeR54kXEEYa82ebhrYs3fG12BeOPHFmwQYGOUrm/mD42blcrMFqce8hqZedxZokDg81bjqCkqCTdkHMpluylDtReVAT6FDTzrKSKU9qxu3BD1BTFdRXZO6m8Mkby65tIgmKFjbsHe/WqWTJwyQhkWUzC1/NGfgzOKqSnIYih0X3A4czvgEi63PoHyS+UUXVH8snBwceijY5jfihYJQogDWRjvtfWaLLW8i0RtWUM6js5oIlUyOU2IgAgNG/eqTFXIv2qAU0ZS4cXlmP9CR6uiXlPhL6dxMQboGzhatWZnVzzM0wQV1tsYzLt9zQ6Wn4gVAmzRxcw4IUfkX4oCEzCsFCr3cYdIZz2vcQAIYVUfIEGArkM2TNj0gv11xe+MzF4QnMu7scdX4s/OWlTJyAXTcjoL1WvBrUQaa9BSOBFXXc+MqqZN9Re7MhclrzZJlOQp3NdklbH7P+O31k8jf84m1UoU99QFn9FLmaCPxXsbQSZHRsDZdyoxoVUVPcB3CpV7i9mtW2cEGkdgXU7ecg=="
}
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": [
{
"account": "autotest@qq.com",
"desc": "许可测试",
"templateName": "OpenApi 2.0 – 许可测试",
"productName": "测试产品",
"licenseId": 125478,
"isForever": false,
"startTime": "2022-09-28 00:00:52",
"endTime": "2022-10-05 00:00:52",
"createTime": "2022-09-28 00:00:53"
}
]
}
16. 锁定许可
- 接口地址:
https://openapi.senseyun.com/v2/sv/lockLicense
说明: 锁定指定的许可. 锁定成功后, 云锁许可将不能继续使用, 软锁许可在最多一个离线时长后将不能继续使用
参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
userAccount | 是 | string | 用户账号 | |
licenseForm | 是 | number | 许可形式: 1-云锁 2-软锁 | |
licenseId | 是 | number | 许可 ID |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
- 示例: 请求内容:
{
"userAccount": " cloudetest@cloud.com",
"licenseForm": 1,
"licenseId": 125478
}
响应内容:
{
"code": 0,
"desc": "成功"
}
17. 解锁许可
- 接口地址:
https://openapi.senseyun.com/v2/sv/unlockLicense
说明: 解锁指定的许可
参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
userAccount | 是 | string | 用户账号 | |
licenseForm | 是 | number | 许可形式: 1-云锁 2-软锁 | |
licenseId | 是 | number | 许可 ID |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
- 示例: 请求内容:
{
"userAccount": " cloudetest@cloud.com",
"licenseForm": 1,
"licenseId": 125478
}
响应内容:
{
"code": 0,
"desc": "成功"
}
八. 云签硬件锁升级包接口
1. 签发添加许可升级包
- 接口地址:
https://openapi.senseyun.com/v2/sv/devicelicense/addlic
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
pin | 是 | string | 填写您在平台设置的 PIN 码. 如果您还处于试用阶段, 请使用默认的试用 PIN 码: aoW8aUNgPNFK8r32UwLnAp3P2zvU232i | |
deviceId | 是 | string | 芯片序列号 | |
shellNumber | 是 | string | 外壳号 | |
deviceCert | 是 | string | 设备证书的 Base64 字符串 | |
licenseId | 是 | number | 许可 ID. 必须是平台上已有的产品. | |
force | 是 | boolean | 是否强制升级 升级策略: 强制升级时, 若锁内无此许可, 则添加; 若有此许可, 则强制覆盖; 不强制升级时, 若锁内无此许可, 则添加; 若有此许可, 则报错 | |
isForever | 是 | boolean | 是否永久 | |
version | 否 | number | 0 | 许可版本. 取值范围: [0, 4294967295] |
startTime | 否 | number | 许可起始时间, UTC 时间戳(秒) | |
endTime | 否 | number | 许可结束时间, UTC 时间戳(秒) | |
counter | 否 | number | 许可使用次数 | |
span | 否 | number | 许可时间跨度, 从未来的某个时间开始试用的秒数. | |
concurrent | 否 | number | 最大用户数. 取值范围: [0, 65535]; 如果不设置或设为 0, 表示不限制用户数 | |
concurrentType | 否 | string | 并发限制类型. 取值可选: process/winUserSession/disable process 以 Windows 进程限制, winUserSession 以 Windows 会话限制, disable 表示关闭并发限制. | |
module | 否 | array | 子模块列表 | |
rom | 否 | object | 许可只读区. 有 3 个属性: data, offset, resize. data 为数据区 hex 字符串; offset 为偏移量; resize 表示重置数据区大小, 取值范围: [数据区长度, 65535]. 当 resize 为 0 时, data 和 offset 将被忽略 | |
raw | 否 | object | 许可读写区. 有 3 个属性: data, offset, resize. data 为数据区 hex 字符串; offset 为偏移量; resize 表示重置数据区大小, 取值范围: [数据区长度, 65535]. 当 resize 为 0 时, data 和 offset 将被忽略 | |
pub | 否 | object | 许可公开区. 有 3 个属性: data, offset, resize. data 为数据区 hex 字符串; offset 为偏移量; resize 表示重置数据区大小, 取值范围: [数据区长度, 65535]. 当 resize 为 0 时, data 和 offset 将被忽略 | |
licDesc | 否 | string | 许可描述信息, 最长 32 个字符 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | object | 硬件锁许可数据包 |
- 示例: 请求内容:
{
"pin": "1234567890qazwsx",
"deviceId": "9733c80100070205106100030022000a",
"force": true,
"shellNumber": "200200000089",
"licenseId": "273",
"deviceCert": "xxxxxxxxx",
"isForever": false,
"concurrent": 3,
"concurrentType": "winUserSession",
"version": 1,
"module": [ 1, 2, 3 ],
"startTime": 123,
"endTime": 123456789,
"counter": 3,
"span": 2,
"rom": {
"data": "1234",
"offset": 0,
"resize": 2
},
"raw": {
"offset": 0,
"resize": 0
},
"pub": {
"data": "234567",
"resize": 3
},
"licDesc": "addlic"
}
响应内容:
{
"desc": "成功",
"code": 0,
"data": {
......
}
}
2. 签发更新许可升级包
- 接口地址:
https://openapi.senseyun.com/v2/sv/devicelicense/updatelic
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
pin | 是 | string | 填写您在平台设置的 PIN 码. 如果您还处于试用阶段, 请使用默认的试用 PIN 码: aoW8aUNgPNFK8r32UwLnAp3P2zvU232i | |
deviceId | 是 | string | 芯片序列号 | |
shellNumber | 是 | string | 外壳号 | |
deviceCert | 是 | string | 设备证书的 Base64 字符串 | |
licenseId | 是 | number | 许可 ID. 必须是平台上已有的产品. | |
isForever | 是 | boolean | 是否永久 | |
version | 否 | object | 许可版本. 有两个属性: op, value. op 可选值为 set/inc/dec, set 为设置许可版本为 value 值, inc 为在已有许可版本上增加 value 值, dec 为在已有许可版本上减少 value 值. value 取值范围: [0, 4294967295] | |
startTime | 否 | object | 许可起始时间, 有两个属性: op, value. op 可选值为 set/inc/dec/disable, set 为设置许可开始时间为 value 值, inc 为在已有许可开始时间上增加 value 值, dec 为在许可开始时间上减少 value 值, disable 为不限制许可开始时间; value 为 UTC 时间戳秒数 | |
endTime | 否 | object | 许可结束时间, 有两个属性: op, value. op 可选值为 set/inc/dec/disable, set 为设置许可结束时间为 value 值, inc 为在已有许可结束时间上增加 value 值, dec 为在许可结束时间上减少 value 值, disable 为不限制许可结束时间; value 为 UTC 时间戳秒数 | |
counter | 否 | object | 许可使用次数, 有两个属性: op, value. op 可选值为 set/inc/dec/disable, set 为设置许可使用次数为 value 值, inc 为在已有许可使用次数上增加 value 值, dec 为在已有许可使用次数上减少 value 值, disable 为不限制许可使用次数. value 取值范围: [0, 4294967295] | |
span | 否 | object | 许可时间跨度, 有两个属性: op, value. op 可选值为 set/inc/dec/disable, set 为设置许可时间跨度为 value 值, inc 为在已有许可时间跨度上增加 value 值, dec 为在已有许可时间跨度上减少 value 值, disable 为不限制许可时间跨度. value 单位为秒 | |
concurrent | 否 | number | 最大用户数. 取值范围: [0, 65535]; 如果不设置或设为 0, 表示不限制用户数 | |
concurrentType | 否 | string | 并发限制类型. 取值可选: process/winUserSession/disable process 以 Windows 进程限制, winUserSession 以 Windows 会话限制, disable 表示关闭并发限制. | |
module | 否 | array | 子模块列表 | |
rom | 否 | object | 许可只读区. 有 3 个属性: data, offset, resize. data 为数据区 hex 字符串; offset 为偏移量; resize 表示重置数据区大小, 取值范围: [数据区长度, 65535]. 当 resize 为 0 时, data 和 offset 将被忽略 | |
raw | 否 | object | 许可读写区. 有 3 个属性: data, offset, resize. data 为数据区 hex 字符串; offset 为偏移量; resize 表示重置数据区大小, 取值范围: [数据区长度, 65535]. 当 resize 为 0 时, data 和 offset 将被忽略 | |
pub | 否 | object | 许可公开区. 有 3 个属性: data, offset, resize. data 为数据区 hex 字符串; offset 为偏移量; resize 表示重置数据区大小, 取值范围: [数据区长度, 65535]. 当 resize 为 0 时, data 和 offset 将被忽略 | |
licDesc | 否 | string | 许可描述信息, 最长 32 个字符 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | object | 硬件锁许可数据包 |
- 示例: 请求内容:
{
"pin": "1234567890qazwsx",
"deviceId": "9733c80100070205106100030022000a",
"shellNumber": "200200000089",
"licenseId": "273",
"deviceCert": "xxxxxx",
"isForever": false,
"concurrent": 3,
"concurrentType": "winUserSession",
"version": {
"op": "set",
"value": 10
},
"module": [
1,
2,
3
],
"startTime": {
"op": "set",
"value": 123
},
"endTime": {
"op": "inc",
"value": 123
},
"counter": {
"op": "inc",
"value": 5
},
"span": {
"op": "disable"
},
"rom": {
"data": "1234",
"offset": 0,
"resize": 2
},
"raw": {
"offset": 0,
"resize": 0
},
"pub": {
"data": "234567",
"resize": 3
},
"licDesc": "updatelic"
}
响应内容:
{
"desc": "成功",
"code": 0,
"data": {
......
}
}
3. 签发删除许可升级包
- 接口地址:
https://openapi.senseyun.com/v2/sv/devicelicense/dellic
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
pin | 是 | string | 填写您在平台设置的 PIN 码. 如果您还处于试用阶段, 请使用默认的试用 PIN 码: aoW8aUNgPNFK8r32UwLnAp3P2zvU232i | |
deviceId | 是 | string | 芯片序列号 | |
shellNumber | 是 | string | 外壳号 | |
deviceCert | 是 | string | 设备证书的 Base64 字符串 | |
licenseId | 是 | number | 许可 ID. 必须是平台上已有的产品. | |
force | 是 | boolean | 是否强制升级 升级策略: 强制升级时, 若锁内有此许可, 删除; 若锁内无此许可, 返回成功 不强制升级时, 若锁内有此许可, 删除; 若无此许可, 则报错 | |
licDesc | 否 | string | 许可描述信息, 最长 32 个字符 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | object | 硬件锁许可数据包 |
- 示例: 请求内容:
{
"pin": "1234567890qazwsx",
"deviceId": "9733c80100070205106100030022000a",
"licenseId": "273",
"shellNumber": "200200000089",
"licDesc": "del",
"deviceCert": "xxxxxx",
"force": true
}
响应内容:
{
"desc": "成功",
"code": 0,
"data": {
......
}
}
4. 签发控制许可升级包
- 接口地址:
https://openapi.senseyun.com/v2/sv/devicelicense/ctrllic
- 参数:
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
pin | 是 | string | 填写您在平台设置的 PIN 码. 如果您还处于试用阶段, 请使用默认的试用 PIN 码: aoW8aUNgPNFK8r32UwLnAp3P2zvU232i | |
deviceId | 是 | string | 芯片序列号 | |
shellNumber | 是 | string | 外壳号 | |
deviceCert | 是 | string | 设备证书的 Base64 字符串 | |
ctrlType | 是 | number | 控制包类型, 见下文 | |
startTime | 否 | number | 锁内许可开始时间, UTC 时间戳(秒), 仅用于 "限时使用所有许可" 类型 | |
endTime | 否 | number | 锁内许可开始时间, UTC 时间戳(秒), 仅用于 "限时使用所有许可" 类型 | |
licDesc | 否 | string | 许可描述信息, 最长 32 个字符 |
ctrlType
值 | 类型 | 描述 |
---|---|---|
1 | 锁定所有许可 | 锁定硬件用户锁内所有许可, 升级后, 硬件用户锁内所有许可将处于锁定不可用状态 |
2 | 解锁所有许可 | 解锁硬件用户锁内所有许可, 升级后, 硬件用户锁内所有许可将恢复到锁定前状态 |
3 | 限时使用所有许可 | 将硬件用户锁设置为限时使用锁, 升级后, 硬件用户锁内所有许可只有在设置时间段内有效, 过期将不能再继续使用锁内所有许可 |
4 | 解除限时 | 解除硬件用户锁的限时性, 升级后, 硬件用户锁内所有许可状态将恢复到限时之前 |
5 | 删除所有许可 | 删除硬件用户锁内所有许可, 升级后, 硬件用户锁内所有许可将被删除 |
- 响应:
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码 |
desc | string | 结果描述 |
data | object | 硬件锁许可数据包 |
- 示例: 请求内容:
{
"pin": "1234567890qazwsx",
"shellNumber": "200200000089",
"licDesc": "lockalllic",
"deviceId": "9733c80100070205106100030022000a",
"deviceCert": "xxxx",
"ctrlType": 3,
"startTime": 123,
"endTime": 1234
}
响应内容:
{
"desc": "成功",
"code": 0,
"data": {
......
}
}
九. 授权码管理接口
1. 生成授权码
接口地址
https://openapi.senseyun.com/v2/sv/issueLicenseKey
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
platform | 否 | number | 7 | 系统平台. 7-传统(Windows/x86 Linux/MacOS) 24-智能(Android/Arm Linux) |
licenseMode | 否 | number | 0 | 扣费方式. 0- 账户余额 1-赠送许可 2-套餐许可. 当许可类型不是 PPM (即 licCategory ≠ 3)时, 必须设置此参数 |
pricingMode | 否 | string | 对于账户余额, 取值如下: "daily"-按天, "yearly"-按年, "once"-一次性; 对于赠送许可或 PPM, 无需设置; 对于套餐许可, 指定使用某个套餐时, 设置为对应套餐的序列号, 自动匹配套餐时, 设置为 "auto" | |
licBindLimit | 否 | number | 同时绑定设备数. 取值范围: [1, 65535]. 许可类型为单机许可时, 必须设置此参数; 否则, 将忽略此参数 | |
licBindMaxLimit | 否 | number | 累积绑定设备数. 取值范围: [0, 65535] 设置为 0 时表示不限制; 默认值等于同时绑定设备数. 许可类型为集团许可或 PPM 时, 将忽略此参数. | |
templateName | 否 | string | 模板名称, 仅用于平台展示. 长度限制: [1, 64] | |
userName | 否 | string | 备注名称 | |
phone | 否 | string | 手机号 | |
否 | string | 电子邮箱 | ||
remark | 否 | string | 备注 | |
contractNo | 否 | string | 合同号 | |
number | 否 | number | 1 | 批量生成授权码数量, 取值范围: [1, 100] |
licCategory | 否 | number | 1 | 许可类型: 1-单机许可, 2-集团许可, 3-PPM 如果取值为 2 或者 concurrent 参数 > 0, 都表示集团许可 |
offlineDays | 否 | number | 0 | 强制认证周期, 单位: 天 取值范围: [0, 180] 设置为 0 表示不开启强制认证功能 |
c2dOverdue | 否 | number | 1 | C2D 文件有效期, 单位: 天 取值范围: [1, 90] |
d2cOverdue | 否 | number | 1 | D2C 文件有效期, 单位: 天 取值范围: [1, 90] 当许可类型为 PPM 时, 将忽略此参数 |
tagIds | 否 | array | 标签 ID 列表 | |
borrowing | 否 | IssueLicenseKeyBorrowingProperties | 在线借阅相关参数 | |
advAttrs | 是 | IssueLicenseKeyAdvAttr[] | 许可条款列表 |
IssueLicenseKeyBorrowingProperties
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
enable | 否 | boolean | false | 是否启用在线借阅相关功能 |
borrowingNum | 否 | number | 最大借阅许可数 | |
forciblyReturnNum | 否 | number | 强制回收许可数, 不传表示不启用强制回收功能 | |
borrowingManagerNum | 否 | number | 最大借阅管理员数 | |
allowBindingLicenseKey | 否 | boolean | true | 是否允许绑定授权码 |
IssueLicenseKeyAdvAttr
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseId | 是 | number | 许可 ID, 取值范围: [1, 4294967295], 且必须在开发者中心的产品管理中存在 | |
licenseVer | 否 | number | 0 | 许可版本, 取值范围: [0, 4294967295] |
isForver | 是 | boolean | 是否永久许可 | |
startTime | 否 | number | 起始时间, UTC 时间戳(秒) | |
endTime | 否 | number | 结束时间, UTC 时间戳(秒) | |
spanTime | 否 | number | 时间跨度, 单位: 天 取值范围: [1, 18250] | |
concurrent | 否 | number | 0 | 并发用户数, 取值范围: [0, 65535] 此值 > 0 代表集团许可 |
concurrentType | 否 | string | 并发类型: 会话: "win_user_session", 进程: "process", 集团许可必须设置此参数 | |
module | 否 | array | 子模块列表, 模块值可选范围: [1, 64] | |
lanBorrowing | 否 | IssueLicenseKeyLanBorrowingProperties | 集团借阅相关属性 | |
rom | 否 | string | 许可只读区, hex 字符串, 数据原始长度 < 65536 | |
raw | 否 | string | 许可读写区, hex 字符串, 数据原始长度 < 65536 | |
pub | 否 | string | 许可公开区, hex 字符串, 数据原始长度 < 65536 | |
dataZonePadMode | 否 | number | 1 | 数据区编辑模式. 1-文件模式, 2-Key/Value 模式 |
kvSeparator | 否 | string | : | Key/Value 分隔符, 数据区编辑模式为 Key/Value 时启用, 长度为 1 |
kvConnector | 否 | string | ; | Key/Value 连接符, 数据区编辑模式为 Key/Value 时启用, 长度为 1 |
rawResize | 否 | number | 重置读写区大小. 取值范围: [读写区数据大小, 65535] |
IssueLicenseKeyLanBorrowingProperties
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
enable | 否 | boolean | false | 是否启用集团借阅相关功能 |
borrowingNum | 否 | number | 最大借出点数 | |
duration | 否 | number | 最长借阅时间(小时), 不传表示不限制借阅时间 |
- 说明
- 字段
licenseId
许可 ID 必须是在平台产品管理中添加的许可 ID; - 当
licenseMode
设置为 1 时(即赠送许可), 字段pricingMode
可以不提供; - 当
isForever
设置为 false 时(即非永久许可), 那么以下字段至少需要设置一个:endTime
、span
; - 如果设置了
startTime
和endTime
, 那么要求startTime
必须小于等于endTime
; - 高级属性中的
module
字段, 需要确保其中每个模块 ID 都在对应产品中进行了配置, 否则在平台(WEB)上查看授权码许可的模块时会标识出"该模块已在产品中删除"字样, 但不会影响许可的模块使用; - 当使用套餐方式发布授权码许可时, 如果套餐是按量的许可套餐, 那么将会从套餐中扣除 N 个许可量, 其中 N 等于授权码中许可 ID 的个数;
- 设置自动匹配套餐(
licenseMode
为 2, 且pricingMode
为 auto)时, 按照许可条款自动匹配可用的套餐;优先匹配快要过期或剩余许可数较少的套餐. - 当前系统平台
platform
字段, 进行了两类系统隔离, 即传统系统平台与智能系统平台的授权码是不能交叉使用的, 只能用于对应的系统平台; - 当
concurrent
字段设置为大于 0 时(即集团许可), 必须设置并发方式concurrentType
字段, 不同并发方式的区别:会话:即以软件运行机器的个数进行数量限制, 进程:即以软件启动的个数进行数量限制, 数量限制为concurrent
字段的值; - 并发数字段
concurrent
和 同时绑定设备数字段licBindLimit
同时设置时可以达到负载均衡的效果; - 字段
c2dOverdue
表示用户端生成的 C2D(硬件指纹)文件的有效期为 N 天, 即自用户端生后, 该 C2D 文件在 N 天以内有效, N 天以后再使用该 C2D 文件从云平台兑换授权码时会提示过期; - 字段
d2cOverdue
表示经由平台端兑换得到的 D2C(授权码升级包)文件的有效期为N 天, 即自平台端生成后, 该 D2C 文件在 N 天以内有效, N 天以后再使用该 D2C 文件导入到用户端时会提示过期; - 字段
rawResize
表示设置读写区的有效长度, 当软件运行时可能会写入比预设的数据区内容更多的数据时, 则需要对读写区内容进行扩容占位, 该字段值应设置的尽可能符合实际所需, 以提高运行时读写效率, 默认占位字节为 0x00. 例如, 预设的读写区内容为HelloWorld, 如果软件在运行时向读写区写入 01234567890 时将报错, 因为预设的读写区的有效长度为 10(HelloWorld 字符串的长度为 10);此时, 如果设置了rawResize
= 15, 则预设的读写区的有效长度便会被设置为 15(此时读写区实际内容为 HelloWorld 加 5 个0x00 占位字节), 此时再写入 01234567890 时将是正常的.
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
data | Data18 | 一些许可信息, 成功时返回 |
Data18
字段名称 | 类型 | 描述 |
---|---|---|
cost | number | 许可预估费用 |
licenseKeys | array | 成功生成的授权码列表 |
success | number | 成功生成的授权码数量 |
- 示例
请求内容:
{
"licenseForm": 2,
"platform": 7,
"licenseMode": 0,
"pricingMode": "daily",
"userName": "展会赠送",
"licBindLimit": 12,
"number": 2,
"c2dOverdue": 1,
"d2cOverdue": 1,
"tagIds": [ 1, 2 ],
"advAttrs": [
{
"licenseId": 20181105,
"licenseVer": 1,
"isForever": false,
"startTime": 1541663610,
"endTime": 1544255610,
"spanTime": 60,
"concurrent": 5,
"concurrentType": "process",
"module": [ 1, 3, 5 ],
"rom": "12",
"raw": "1234",
"pub": "123456"
},
{
"licenseId": 20181106,
"licenseVer": 2,
"isForever": false,
"startTime": 1541663610,
"endTime": 1544255610,
"spanTime": 50,
"concurrent": 5,
"concurrentType": "process",
"module": [ 2, 4, 6 ],
"rom": "34",
"raw": "3456",
"pub": "345678"
}
]
}
响应内容:
{
"code": 0,
"data": {
"cost": 40,
"licenseKeys": [
"Y053-7E1K-SNL3-KYAY",
"KT6E-2J26-RT6X-AUB8"
],
"success": 2
},
"desc": "成功"
}
2. 更新授权码
接口地址
https://openapi.senseyun.com/v2/sv/updateLicenseKey
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseKey | 是 | string | 授权码 | |
userName | 否 | string | 备注名称, 不传入则不作修改 | |
phone | 否 | string | 手机号, 不传入则不作修改 | |
否 | string | 邮箱地址, 不传入则不作修改 | ||
remark | 否 | string | 备注, 不传入则不作修改 | |
contractNo | 否 | string | 合同号, 不传入则不作修改 | |
pricingMode | 否 | string | 订阅模式 对于账户余额, 取值如下: daily - 按天 yearly - 按年 once - 一次性 对于赠送许可或 PPM, 无需传入 对于套餐许可, 取值为对应套餐的序列号 | |
licBindLimit | 否 | object | 同时绑定设备数, 不传则不作修改 有两个属性: op, value, op 可选值为 set/inc/dec, set 为设置同时绑定设备数为 value 值, inc 为在已有绑定数上增加 value 值, dec 为在已有绑定数上减少 value 值, value 为机器数, 取值范围: [1, 65535] 当许可类型为集团或 PPM 时, 将忽略此参数 | |
licBindMaxLimit | 否 | object | 累积绑定设备数, 不传则不作修改 有两个属性: op, value, op 可选值为 set/inc/dec, set 为设置累积绑定设备数为 value 值, inc 为在已有绑定数上增加 value 值, dec 为在已有绑定数上减少 value 值, value 为机器数, 取值范围: [0, 65535], 0 表示不限制; 当许可类型为集团或 PPM 时, 将忽略此参数 | |
offlineDays | 否 | number | 强制认证周期, 单位: 天 取值范围: [0, 180] 设置为 0 表示不开启强制认证功能 | |
c2dOverdue | 否 | number | C2D 文件有效期, 单位: 天 取值范围: [1, 90] | |
d2cOverdue | 否 | number | D2C 文件有效期, 单位: 天 取值范围: [1, 90] 当许可类型为 PPM 时, 将忽略此参数 | |
tagIds | 否 | array | 标签 ID 列表, 不传则不作修改, 传空列表则清空标签 | |
borrowing | 否 | UpdateLicenseKeyBorrowingProperties | 在线借阅相关参数 | |
advAttrs | 否 | UpdateLicenseKeyAdvAttr[] | 许可条款列表 |
UpdateLicenseKeyBorrowingProperties
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
enable | 否 | boolean | 是否启用在线借阅相关功能. 不传则保持当前状态 | |
borrowingNum | 否 | number | 最大借阅许可数. 不传则不修改 | |
forciblyReturnNum | 否 | object | 强制回收许可数. 不传则不修改 有两个属性: op, value, op 可选值为 set/disable, set 为设置强制回收许可数为 value 值, disable 为禁用强制回收功能 | |
borrowingManagerNum | 否 | number | 最大借阅管理员数量. 不传则不修改 | |
allowBindingLicenseKey | 否 | boolean | 是否允许绑定授权码. 不传则不修改 |
UpdateLicenseKeyAdvAttr
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseId | 是 | number | 许可 ID | |
licenseVer | 否 | object | 许可版本, 不传则不作修改 有两个属性: op, value, op 可选值为 set/inc/dec, set 为设置许可版本为 value 值, inc 为在已有许可版本上增加 value 值, dec 为在已有许可版本上减少 value 值, value 为许可版本号 | |
isForever | 否 | boolean | 是否永久许可. 不传则不作修改; 如果将永久许可改为非永久许可, 需要同时传入 endTime 或 spanTime 参数 | |
endTime | 否 | object | 许可结束时间, 不传则不作修改 有两个属性: op, value, op 可选值为 set/inc/dec, set 为设置结束时间为 value 值, inc 为在已有结束时间上增加 value 值, dec 为在已有结束时间上减少 value 值, value 为 UTC 时间戳(秒) | |
spanTime | 否 | object | 许可时间跨度, 不传则不作修改 有两个属性: op, value, op 可选值为 set/inc/dec, set 为设置时间跨度为 value 值, inc 为在已有时间跨度上增加 value 值, dec 为在已有时间跨度上减少 value 值, value 为时间跨度天数, 取值范围: [1, 18250] | |
concurrent | 否 | number | 并发用户数, 取值范围: [0, 65535] 为 0 代表单机许可, 大于 0 代表集团许可 | |
concurrentType | 否 | string | 并发类型: 会话: "win_user_session", 进程: "process", 集团许可必须设置此参数 | |
module | 否 | array | 子模块列表, 值可选范围: [1, 64], 传入空列表, 表示清空模块选择 | |
lanBorrowing | 否 | UpdateLicenseKeyLanBorrowingProperties | 集团借阅相关参数 | |
rom | 否 | object | 许可只读区, 不传则不作修改 有两个属性: op, data, op 可选值为 set/clear; set 表示设置数据区, clear 表示清空数据区. data 为数据区的 hex 字符串 | |
raw | 否 | object | 许可读写区, 不传则不作修改 有三个属性: op, data, resize, op 可选值为 set/clear; set 表示设置数据区, clear 表示清空数据区. data 为数据区的 hex 字符串; resize 表示重置读写区大小 | |
pub | 否 | object | 许可公开区, 不传则不作修改 有两个属性: op, data, op 可选值为 set/clear; set 表示设置数据区, clear 表示清空数据区. data 为数据区的 hex 字符串 | |
dataZonePadMode | 否 | number | 数据区编辑模式. 1-文件模式, 2-Key/Value 模式 | |
kvSeparator | 否 | string | Key/Value 分隔符, 数据区编辑模式为 Key/Value 时启用, 长度为 1 | |
kvConnector | 否 | string | Key/Value 连接符, 数据区编辑模式为 Key/Value 时启用, 长度为 1 |
UpdateLicenseKeyLanBorrowingProperties
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
enable | 否 | boolean | 是否启用集团借阅. 不传则保持当前状态 | |
borrowingNum | 否 | number | 最大借阅点数, 不传则不修改 | |
duration | 否 | object | 最长借阅时间(小时), 不传则不修改 有两个属性: op, value, op 可选值为 set/disable, set 为设置最长借阅时间为 value 值, disable 为不限制最长借阅时间 |
- 注意事项:
- 字段
pricingMode
表示订阅模式, 目前只能在扣费方式为账户余额(即licenseMode
为 0)时修改, 只允许从按天或按年修改为一次性. 按此修改时, 更新所需费用会减去已支付的部分费用. - 对于字段
endTime
和spanTime
, 如果原许可未设置, 则会忽略这两项更新; - 对于设置了 op 值, 而未设置 value 值或者 value 值被设置为空的则该项设置将被忽略;
- 高级属性数据区 op 值设置为 clear 时, data 值将被忽略; 当 op 值设置为 set 而 data 值未设置或者被设置为空时, 则该数据区设置将被忽略;
- 高级属性
module
字段设置为空数组 [] 时表示清空对于许可的 64 模块选择; 此外, 请确保每个模块 ID 都在对应产品中进行了配置, 否则在平台(WEB)上查看授权码许可的模块时会标识出"该模块已在产品中删除"字样, 但不会影响许可的模块使用; - 在许可有效期内可以免费更新 12 次, 超过 12 次后需要购买许可更新次数包, 每更新一次扣除一次, 智能许可没有这样的限制;
- 该接口不允许更新并发用户数限制字段
concurrent
的取值是由 0 变更为非 0 或者由非 0 变更为 0;当并发数限制字段concurrent
的取值大于 0 时, 仅能进行数值增减操作, 以及更新并发类型字段concurrentType
的取值(会话/进程); - 字段
c2dOverdue
表示用户端生成的 C2D (硬件指纹)文件的有效期为 N 天, 即自用户端生成后, 该 C2D 文件在 N 天以内有效, N 天以后再使用该 C2D 文件从云平台兑换授权码时会提示过期; - 字段
d2cOverdue
表示经由平台端兑换得到的 D2C(授权码升级包)文件的有效期为 N 天, 即自平台端生成后, 该 D2C 文件在 N 天以内有效, N 天以后再使用该 D2C 文件导入到用户端时会提示过期;
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
data | UpdateLicenseKeyBriefInfo | 一些许可信息, 成功时返回 |
UpdateLicenseKeyBriefInfo
字段名称 | 类型 | 描述 |
---|---|---|
licenseKey | string | 授权码 |
userName | string | 备注名称 |
phone | string | 手机号 |
string | 邮箱 | |
remark | string | 备注 |
contractNo | string | 合同编号 |
licenseForm | number | 许可形式, 授权码只能是软锁, 即值为 2 |
platform | number | 系统平台 7: 传统(Windows/x86 Linux/MacOS) 24: 智能(Android/ARM Linux) |
licenseMode | number | 扣费方式 0-账户余额 1-赠送许可 2-套餐许可 |
pricingMode | string | 订阅模式 对于账户余额, 取值如下 daily - 按天 yearly - 按年 once - 一次性 对于赠送许可, 此字段无实际意义 对于套餐许可, 取值为对应套餐的序列号 |
licBindLimit | number | 同时绑定设备数 |
licBindMaxLimit | number | 累积绑定设备数 |
borrowingEnabled | boolean | 是否启用在线借阅相关功能 |
borrowingNum | number | 最大借出许可数 |
forciblyReturnNum | number | 强制回收许可数, 若未启用强制回收, 无此属性 |
borrowingManagerNum | number | 最大借阅管理员数 |
allowBindingLicenseKey | boolean | 是否允许绑定授权码 |
cost | number | 本次更新所需费用 |
c2dOverdue | number | C2D 有效期 |
d2cOverdue | number | D2C 有效期 |
advAttrs | LicenseKeyAdvAttrResp[] | 许可条款 |
LicenseKeyAdvAttrResp
字段名称 | 类型 | 描述 |
---|---|---|
licenseId | number | 许可 ID |
productName | string | 产品名称 |
licenseVer | number | 许可版本 |
isForever | boolean | 是否永久许可 |
hasStartTime | boolean | 是否有开始时间 |
startTime | string | 许可开始时间(yyyy-MM-dd HH:mm:ss) |
hasEndTime | boolean | 是否有结束时间 |
endTime | string | 许可结束时间(yyyy-MM-dd HH:mm:ss) |
hasSpanTime | boolean | 是否有时间跨度 |
spanTime | number | 时间跨度(天) |
concurrent | number | 并发用户数限制, 为 0 表示单机许可 |
concurrentType | string | 并发类型 会话: win_user_session 进程: process |
lanBorrowingEnabled | boolean | 是否启用集团借阅 |
lanBorrowingNum | number | 集团借阅: 最大借出点数 |
lanBorrowingDuration | number | 集团借阅: 最大借阅时长(小时) 若不限制借阅时长, 无此属性 |
module | array | 子模块列表 |
rom | string | 许可只读区, hex 字符串 |
raw | string | 许可读写区, hex 字符串 |
pub | string | 许可公开区, hex 字符串 |
- 示例
请求内容:
{
"licenseKey": "Y053-7E1K-SNL3-KYAY",
"userName": "张三",
"email": "zhangsan@163.com",
"phone": "18812345678",
"licBindLimit": {
"op": "inc",
"value": 1
},
"licBindMaxLimit": {
"op": "inc",
"value": 1
},
"advAttrs": [
{
"licenseId": 1000,
"endTime": {
"op": "set",
"value": 1576307930
},
"rom": {
"op": "set",
"data": "1234567890"
},
"raw": {
"op": "clear"
}
},
{
"licenseId": 2000,
"licenseVer": {
"op": "inc",
"value": 1
},
"module": [ 1, 2, 3, 4, 5 ]
}
]
}
响应内容:
{
"code": 0,
"data": {
"userName": "张三",
"isForever": false,
"licenseKey": "Y053-7E1K-SNL3-KYAY",
"pricingMode": "yearly",
"phone": "18812345678",
"email": "zhangsan@163.com",
"c2dOverdue": 1,
"d2cOverdue": 1,
"licBindLimit": 2,
"licBindMaxLimit": 2,
"cost": 30,
"licenseMode": 0,
"licenseForm": 2,
"platform": 7,
"advAttrs": [
{
"licenseId": 1000,
"licenseVer": 13,
"hasStartTime": true,
"startTime": "2018-12-04 00:00:00",
"hasEndTime": true,
"endTime": "2019-12-14 15:18:50",
"hasSpanTime": true,
"spanTime": 30,
"concurrent": 5,
"concurrentType": "process",
"rom": "1234567890",
"module": [],
"pub": "567890",
"productName": "计算器"
},
{
"licenseId": 2000,
"licenseVer": 14,
"hasStartTime": true,
"startTime": "2018-12-04 00:00:00",
"hasEndTime": true,
"endTime": "2018-12-08 15:53:30",
"hasSpanTime": true,
"spanTime": 30,
"concurrent": 5,
"concurrentType": "process",
"rom": "524F4D212121",
"module": [ 1, 2, 3, 4, 5 ],
"raw": "524157212121",
"pub": "505542212121",
"productName": "绘图"
}
]
},
"desc": "成功"
}
3. 删除授权码
接口地址
https://openapi.senseyun.com/v2/sv/deleteLicenseKey
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseKey | 是 | string | 授权码 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
- 示例
请求内容:
{
"licenseKey": "KT6E-2J26-RT6X-AUB8"
}
响应内容:
{
"desc": "OK",
"code": 0
}
4. 搜索授权码
接口地址
https://openapi.senseyun.com/v2/sv/findLicenseKeys
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
keyword | 否 | string | 备注名称/手机号/邮箱, 支持模糊查找 | |
startCreateTime | 否 | number | 最小授权码创建时间, UTC 时间戳(秒) | |
endCreateTime | 否 | number | 最大授权码创建时间, UTC 时间戳(秒) | |
startActiveTime | 否 | number | 最小授权码绑定时间, UTC 时间戳(秒) | |
endActiveTime | 否 | number | 最大授权码绑定时间, UTC 时间戳(秒) | |
currentPage | 否 | number | 1 | 当前页数, 从 1 开始 |
pageSize | 否 | number | 10 | 每页数量 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
data | Data19 |
Data19
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
rows | LicenseKeyBriefInfo[] |
LicenseKeyBriefInfo
字段名称 | 类型 | 描述 |
---|---|---|
licenseKey | string | 授权码 |
userName | string | 备注名称 |
phone | string | 手机号 |
string | 邮箱 | |
remark | string | 备注 |
contractNo | string | 合同编号 |
licenseForm | number | 许可形式, 授权码只能是软锁, 即值为 2 |
status | number | 授权码状态 1-正常 2-正常(已更新) 5-已锁定 15-审批中 16-已拒绝 |
platform | number | 系统平台 7: 传统(Windows/x86 Linux/MacOS) 24: 智能(Android/ARM Linux) |
licenseMode | number | 扣费方式 0-账户余额 1-赠送许可 2-套餐许可 |
pricingMode | string | 订阅模式 对于账户余额, 取值如下 daily - 按天 yearly - 按年 once - 一次性 对于赠送许可, 此字段无实际意义 对于套餐许可, 取值为对应套餐的序列号 |
licBindLimit | number | 同时绑定设备数 |
licBindMaxLimit | number | 累积绑定设备数 |
borrowingEnabled | boolean | 是否启用在线借阅相关功能 |
borrowingNum | number | 最大借出许可数 |
forciblyReturnNum | number | 强制回收许可数, 若未启用强制回收, 无此属性 |
borrowingManagerNum | number | 最大借阅管理员数 |
allowBindingLicenseKey | boolean | 是否允许绑定授权码 |
createTime | string | 创建时间(yyyy-MM-dd HH:mm:ss) |
exchangeTime | string | 绑定时间(yyyy-MM-dd HH:mm:ss) |
offlineDays | number | 强制认证周期(天) |
c2dOverdue | number | C2D 有效期 |
d2cOverdue | number | D2C 有效期 |
password | string | 授权码密码 |
licCategory | number | 许可类型 1-单机许可 2-集团许可 3- PPM |
advAttrs | LicenseKeyAdvAttrBriefInfo[] | 许可条款 |
LicenseKeyAdvAttrBriefInfo
字段名称 | 类型 | 描述 |
---|---|---|
licenseId | number | 许可 ID |
productName | string | 产品名称 |
licenseVer | number | 许可版本 |
hasStartTime | boolean | 是否有开始时间 |
startTime | string | 许可开始时间(yyyy-MM-dd HH:mm:ss) |
hasEndTime | boolean | 是否有结束时间 |
endTime | string | 许可结束时间(yyyy-MM-dd HH:mm:ss) |
hasSpanTime | boolean | 是否有时间跨度 |
spanTime | number | 时间跨度(天) |
concurrent | number | 并发用户数限制, 为 0 表示单机许可 |
concurrentType | string | 并发类型 会话: win_user_session 进程: process |
lanBorrowingEnabled | boolean | 是否启用集团借阅 |
lanBorrowingNum | number | 集团借阅: 最大借出点数 |
lanBorrowingDuration | number | 集团借阅: 最大借阅时长(小时) 若不限制借阅时长, 无此属性 |
- 示例
请求内容:
{
"keyword": "张三",
"currentPage": 1,
"pageSize": 10
}
响应内容:
{
"code": 0,
"data": {
"totalPage": 1,
"totalCount": 2,
"rows": [
{
"createTime": "2018-12-17 10:30:39",
"email": "zhangsan@163.com",
"licBindLimit": 1,
"licBindMaxLimit": 1,
"licenseForm": 2,
"licenseKey": "KW7X-7MLC-RFS7-WCXP",
"licenseMode": 0,
"phone": "18812345678",
"platform": 7,
"pricingMode": "yearly",
"advAttrs": [
{
"licenseId": 1000,
"productName": "计算器",
"isForever": false,
"hasStartTime": true,
"startTime": "2018-12-17 10:30:34",
"hasEndTime": true,
"endTime": "2019-12-17 10:30:34",
"hasSpanTime": false
},
{
"licenseId": 2000,
"productName": "绘图",
"isForever": false,
"hasStartTime": true,
"startTime": "2018-12-17 10:30:34",
"hasEndTime": true,
"endTime": "2019-12-17 10:30:34",
"hasSpanTime": false
}
],
"userName": "张三",
"c2dOverdue": 1,
"d2cOverdue": 1
},
{
"createTime": "2018-12-17 10:26:23",
"email": "zhangsan@163.com",
"licBindLimit": 1,
"licBindMaxLimit": 1,
"licenseForm": 2,
"licenseKey": "2761-RS38-FAPJ-T1WZ",
"licenseMode": 0,
"phone": "18812345678",
"platform": 7,
"pricingMode": "yearly",
"advAttrs": [
{
"licenseId": 3000,
"productName": "记事本",
"isForever": false,
"hasStartTime": false,
"hasEndTime": true,
"endTime": "2019-12-17 10:26:18",
"hasSpanTime": true,
"spanTime": 30,
"concurrent": 5,
"concurrentType": "process"
}
],
"userName": "张三",
"c2dOverdue": 1,
"d2cOverdue": 1
}
]
},
"desc": "成功"
}
5. 获取授权码详情
接口地址
https://openapi.senseyun.com/v2/sv/getLicenseKeyDetail
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseKey | 是 | string | 授权码 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
data | LicenseKeyInfo |
LicenseKeyInfo
字段名称 | 类型 | 描述 |
---|---|---|
licenseKey | string | 授权码 |
userName | string | 备注名称 |
phone | string | 手机号 |
string | 邮箱 | |
remark | string | 备注 |
contractNo | string | 合同编号 |
licenseForm | number | 许可形式, 授权码只能是软锁, 即值为 2 |
status | number | 授权码状态 1-正常 2-正常(已更新) 5-已锁定 15-审批中 16-已拒绝 |
platform | number | 系统平台 7: 传统(Windows/x86 Linux/MacOS) 24: 智能(Android/ARM Linux) |
licenseMode | number | 扣费方式 0-账户余额 1-赠送许可 2-套餐许可 |
pricingMode | string | 订阅模式 对于账户余额, 取值如下 daily - 按天 yearly - 按年 once - 一次性 对于赠送许可, 此字段无实际意义 对于套餐许可, 取值为对应套餐的序列号 |
licBindLimit | number | 同时绑定设备数 |
licBindMaxLimit | number | 累积绑定设备数 |
borrowingEnabled | boolean | 是否启用在线借阅相关功能 |
borrowingNum | number | 最大借出许可数 |
forciblyReturnNum | number | 强制回收许可数, 若未启用强制回收, 无此属性 |
borrowingManagerNum | number | 最大借阅管理员数 |
allowBindingLicenseKey | boolean | 是否允许绑定授权码 |
createTime | string | 创建时间(yyyy-MM-dd HH:mm:ss) |
exchangeTime | string | 绑定时间(yyyy-MM-dd HH:mm:ss) |
offlineDays | number | 强制认证周期(天) |
c2dOverdue | number | C2D 有效期 |
d2cOverdue | number | D2C 有效期 |
password | string | 授权码密码 |
licCategory | number | 许可类型 1-单机许可 2-集团许可 3- PPM |
advAttrs | LicenseKeyAdvAttrResp[] | 许可条款 |
- 示例
请求内容:
{
"licenseKey": "Y053-7E1K-SNL3-KYAY"
}
响应内容:
{
"code": 0,
"data": {
"licBindLimit": 2,
"licBindMaxLimit": 2,
"licenseMode": 0,
"licenseForm": 2,
"advAttrs": [
{
"licenseId": 1000,
"licenseVer": 13,
"productName": "计算器",
"isForever": false,
"hasStartTime": true,
"startTime": "2018-12-04 00:00:00",
"hasEndTime": true,
"endTime": "2019-12-14 15:18:50",
"hasSpanTime": true,
"spanTime": 30,
"concurrent": 5,
"concurrentType": "process",
"rom": "1234567890",
"module": [],
"pub": "567890"
},
{
"licenseId": 2000,
"licenseVer": 14,
"productName": "绘图",
"isForever": false,
"hasStartTime": true,
"startTime": "2018-12-04 00:00:00",
"hasEndTime": true,
"endTime": "2019-12-14 15:18:50",
"hasSpanTime": true,
"spanTime": 30,
"concurrent": 5,
"concurrentType": "process",
"rom": "524F4D212121",
"module": [ 1, 2, 3, 4, 5 ],
"raw": "524157212121",
"pub": "505542212121"
}
],
"userName": "张三",
"licenseKey": "Y053-7E1K-SNL3-KYAY",
"pricingMode": "yearly",
"phone": "18812345678",
"platform": 7,
"email": "zhangsan@163.com",
"c2dOverdue": 1,
"d2cOverdue": 1,
"createTime": "2018-12-03 12:24:36",
"exchangeTime": "2018-12-04 09:31:08",
"tags": [
{
"id": 1,
"name": "标签 1"
},
{
"id": 2,
"name": "标签 2"
}
]
},
"desc": "成功"
}
6. 获取授权码的绑定列表
接口地址
https://openapi.senseyun.com/v2/sv/getLicenseKeyBindList
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseKey | 是 | string | 授权码 | |
currentPage | 否 | number | 1 | 当前页数, 从 1 开始 |
pageSize | 否 | number | 10 | 每页数量 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
data | Data20 |
Data20
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
rows | LicenseKeyBindBriefInfo[] | 绑定设备信息列表 |
LicenseKeyBindBriefInfo
字段名称 | 类型 | 描述 |
---|---|---|
softNo | string | 软锁号 |
machineId | string | 机器 ID |
terminalName | string | 终端名称 |
firstBindTime | string | 首次绑定时间(yyyy-MM-dd HH:mm:ss) |
lastBindTime | string | 最近绑定时间(yyyy-MM-dd HH:mm:ss) |
lastOpIp | string | 最近绑定操作的公网 IP |
opFrom | number | 操作来源: 1-SS 在线 2-SS 离线 3-用户许可中心 4-OpenAPI |
- 示例
请求内容:
{
"licenseKey": "Y053-7E1K-SNL3-KYAY",
"currentPage": 1,
"pageSize": 10
}
响应内容:
{
"code": 0,
"data": {
"totalPage": 1,
"totalCount": 1,
"rows": [
{
"createTime": "2018-11-08 17:52:24",
"licenseKeyGuid": "9c993b3880f64ec588a818510ea723c3",
"machineId": "e14a4fd64833b3497f64c0c960f6cf7ab7bb101bade5c5344b370ef097cc987c",
"softNo": "SC0003000000001",
"terminalId": "e14a4fd64833b3497f64c0c960f6cf7ab7bb101bade5c5344b370ef097cc987c",
"terminalName": "LIHP",
"updateTime": "2018-11-08 17:52:24"
}
]
},
"desc": "成功"
}
7. 兑换授权码
接口地址
https://openapi.senseyun.com/v2/sv/licenseKeyExchange
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseKey | 是 | string | 授权码 | |
c2d | 是 | string | 由 Virbox 用户工具导出的 C2D 内容, 注意 C2D 文件本身是可读文本, 直接读取无需任何转换 |
- 注意事项:
- 由 Virbox 用户工具导出的 c2d 文件具有时效性, 默认时效是 24 小时, 超过便失效, 因此在调用该接口时请确保得到的 c2d 文件是最新导出的文件, 否则接口会返回相应的错误
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
data | string | 兑换到的授权码许可升级包 |
- 注意事项:
- 由该接口兑换得到的授权码许可升级包具有时效性, 默认时效是 24 小时, 超过便失效, 因此请在时效内将得到的授权码许可升级包通过 Virbox 用户工具导入, 否则导入时返回相应的错误
- 示例
请求内容:
{
"licenseKey": "AWBZ-GHYL-JWGH-2FHN",
"c2d": "{\"version\":3,\"c2dType\":1,\"pcName\":\"DESKTOP-TIJTJOI\",\"os\":\"Windows64bit\",\"ip\":\"192.168.101.1\",\"mac\":\"00-50-56-C0-00-08\",\"machineId\":\"289b8e528ef436d431183e1a5e2d9ca606597b4dbdf3f626352b965a886e0416\",\"reqData\":\"AgAAABp9o8d36E7EIN1WMapH0WfS9jSpekOL2nf3PBLZDQHI5TKo1J9BnH4YmUYuyp328dxd8hHfW0OeCtdxDTYHbeuoKFvUV65ekeCTT8WgDVEmAPAwT6PkLVgwxxD+GQqtvTtxRdF5tDiJMCI17QD4a2Vfnte4esIet0EyyFHgHweUOV7SsemSGQ/VaxQKJt144ajrBdhsUGqbOCGtaHbf3jhqlfjZmwoJNbxtnPrwjvt23TCrKax2GK0Jxh2MY1xrPgIWStfNN22EV3wrnTbrnYR3H23klB3ivJUEOHgEElfnDG0YJu2OtmW5SmHUrQ1wrfW+Dtgg5ESocwRQRKM2TBErX0ewA5UALCnLL8TLtlajpoS8xyvXdH01lncHSAhXqLF5IZKwaXpS/MNLKRGN45nSN6oTisAN7pHb4b+lT6yRsH1L2S7bzfvuh9mZBp5nuFLTPy2nlMgrhPzpkp/F1vY=\",\"slv2\":{\"version\":1,\"protocol\":2147483649,\"ssVer\":\"2.2.0.38326\",\"from\":\"289b8e528ef436d431183e1a5e2d9ca606597b4dbdf3f626352b965a886e0416\",\"hwfp\":\"AQAAAL+eDr2CoU8XmfKmrn7Z4KSGjMvOxBtyxPyH46U+faQkvg0DD41BUdiqS3k/V7b/hGc/eJ0pn+24aB9eEGn1aMw6r3dSH4Jprn6cZFRkJnXIPFJqp+SOwAvjq916pZed8m1MIjS+97vqvlpHJn5JRb9dSGo7WRbLaBVGZYzcjfWTYTs1KbrlyS/nvUl042gEhZKg1d8VzEJkMrJeTLImj9vHQGWIRUMddH/uwafS+yw7Ykq9vICPKnaNnr+7VOqIEkYiaFo0sQGBUZQgT+pRiH/eTUMrvf+3EQzpg6osSu6jm41J1UNeJHfxNw8qdgxPNrFk9DBLHo2xcxxYp0cwAYqsmZBI7eO0Kre8k3fPdCmqAjDXJsJzCSnr2S/hlwlLlkwJ6aS72tIZTkxOa9E+M0wC87+c7EvvarJhwfuPgtz/xolAkPMFJ9pYBB44VyDoM7MdowIImHuk4i7CrujSZS4CK3ww2J0JiGvLgj/CW+AEyJ0790NPm8Tl2fgbIFvizg==\",\"info\":\"AQAAAKO4VFY/7V191hpqik+o4kgeAeO9KKr46iViY2xPpHaM++IDejZnNtv9QzP85cAiy8ZqpHilklGA6mZaoo+GOgvOM2tL3K7YsFhlvXqRFcaUq1Uk+ehcYBk8qpVDD0rg6Nh4MIF2zFTcQX3QI/B2j9b98fAkbMRlDuZ7ZeuMafm+STAUt2MM31zxf60ZC3ZBf2pTjJQF2/As6LuymPenQ4yGJ2vug4VLValLk+biSl5Cw3LulCivHmgXIa3ru+V1TeWkBRi7rjn8PwENw03TEx40roluVp9QhcbWcY+tQVi0xYac1PexQRDJ1noKIfvntoO9S0X247ySk8gAQsUKWB1IHbukd57GNMVdyXRj6BrXr1RyNInuqvUqdPkMbQ1zvCHxRGZHPcbvhErknFWbANKSxQUGCtKuwyuao0z0nlOhc56TTbQQYzS4DbDm3ZyYctHDLAvqGK/q6IF3AzQ4bQNAZvKtl0XURQd9E+Pyn6zjYKT9yyGwtG6+PfeD1o9P93lLdFC5HnsUe9b9yYrNA6O1wOtYPsCHLzE6sUz5zM2L\"}}"
}
响应内容:
{
"code": 0,
"data": "....(D2C 升级包)",
"desc": "成功"
}
8. 获取授权码使用情况
接口地址
https://openapi.senseyun.com/v2/sv/getLicenseKeyUsage
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseKey | 是 | string | 授权码 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
data | LicenseKeyUsage |
LicenseKeyUsage
字段名称 | 类型 | 描述 |
---|---|---|
isUsed | boolean | 是否已使用 |
isExpired | boolean | 是否已过期 |
expiredTime | number | 许可过期时间, UTC 时间戳(秒) |
startTime | number | 许可开始时间, UTC 时间戳(秒) |
endTime | number | 许可结束时间, UTC 时间戳(秒) |
spanTime | number | 时间跨度(天) |
licBindLimit | number | 同时绑定设备数 |
licBindCount | number | 已绑定设备数 |
licBindMaxLimit | number | 累积绑定设备数 |
licBindMaxCount | number | 已累积设备数 |
firstBindTime | number | 首次绑定时间, UTC 时间戳(秒) |
- 示例
请求内容:
{
"licenseKey": "AWBZ-GHYL-JWGH-2FHN"
}
响应内容:
{
"code": 0,
"data": {
"bindingCount": 1,
"maxBound": 1,
"maxBinding": 1,
"expiredTime": 1567526399,
"isUsed": true,
"isForever": false,
"boundCount": 1,
"firstBindTime": 1566976362,
"startTime": 1566921600,
"endTime": 1567526399,
"isExpired": true
},
"desc": "成功"
}
9. 授权码解绑
接口地址
https://openapi.senseyun.com/v2/sv/licenseKeyUnbind
说明 通过解绑 C2D 文件完成对应授权码的设备解绑, 成功解绑后将归还一个同时绑定设备数
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseKey | 是 | string | 授权码 | |
c2d | 是 | string | 由 Virbox 用户工具-授权码在线激活, 通过 "离线解绑" 导出的 C2D 文件内容, 注意 C2D 文件内容本身是可读文本, 直接读取无需做任何转换 |
- 注意事项:
- 由 Virbox 用户工具导出的 c2d 文件具有时效性, 默认时效是 24 小时, 超过便失效, 因此在调用该接口时请确保得到的 c2d 文件是最新导出的文件, 否则接口会返回相应的错误
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
- 示例
请求内容:
{
"licenseKey": "AWBZ-GHYL-JWGH-2FHN",
"c2d": "{\"version\":3,\"c2dType\":1,\"pcName\":\"DESKTOP-TIJTJOI\",\"os\":\"Windows1064bit\",\"ip\":\"192.168.101.1\",\"mac\":\"00-50-56-C0-00-08\",\"machineId\":\"289b8e528ef436d431183e1a5e2d9ca606597b4dbdf3f626352b965a886e0416\",\"reqData\":\"AgAAABp9o8d36E7EIN1WMapH0WfS9jSpekOL2nf3PBLZDQHI5TKo1J9BnH4YmUYuyp328dxd8hHfW0OeCtdxDTYHbeuoKFvUV65ekeCTT8WgDVEmAPAwT6PkLVgwxxD+GQqtvTtxRdF5tDiJMCI17QD4a2Vfnte4esIet0EyyFHgHweUOV7SsemSGQ/VaxQKJt144ajrBdhsUGqbOCGtaHbf3jhqlfjZmwoJNbxtnPrwjvt23TCrKax2GK0Jxh2MY1xrPgIWStfNN22EV3wrnTbrnYR3H23klB3ivJUEOHgEElfnDG0YJu2OtmW5SmHUrQ1wrfW+Dtgg5ESocwRQRKM2TBErX0ewA5UALCnLL8TLtlajpoS8xyvXdH01lncHSAhXqLF5IZKwaXpS/MNLKRGN45nSN6oTisAN7pHb4b+lT6yRsH1L2S7bzfvuh9mZBp5nuFLTPy2nlMgrhPzpkp/F1vY=\",\"slv2\":{\"version\":1,\"protocol\":2147483649,\"ssVer\":\"2.2.0.38326\",\"from\":\"289b8e528ef436d431183e1a5e2d9ca606597b4dbdf3f626352b965a886e0416\",\"hwfp\":\"AQAAAL+eDr2CoU8XmfKmrn7Z4KSGjMvOxBtyxPyH46U+faQkvg0DD41BUdiqS3k/V7b/hGc/eJ0pn+24aB9eEGn1aMw6r3dSH4Jprn6cZFRkJnXIPFJqp+SOwAvjq916pZed8m1MIjS+97vqvlpHJn5JRb9dSGo7WRbLaBVGZYzcjfWTYTs1KbrlyS/nvUl042gEhZKg1d8VzEJkMrJeTLImj9vHQGWIRUMddH/uwafS+yw7Ykq9vICPKnaNnr+7VOqIEkYiaFo0sQGBUZQgT+pRiH/eTUMrvf+3EQzpg6osSu6jm41J1UNeJHfxNw8qdgxPNrFk9DBLHo2xcxxYp0cwAYqsmZBI7eO0Kre8k3fPdCmqAjDXJsJzCSnr2S/hlwlLlkwJ6aS72tIZTkxOa9E+M0wC87+c7EvvarJhwfuPgtz/xolAkPMFJ9pYBB44VyDoM7MdowIImHuk4i7CrujSZS4CK3ww2J0JiGvLgj/CW+AEyJ0790NPm8Tl2fgbIFvizg==\",\"info\":\"AQAAAKO4VFY/7V191hpqik+o4kgeAeO9KKr46iViY2xPpHaM++IDejZnNtv9QzP85cAiy8ZqpHilklGA6mZaoo+GOgvOM2tL3K7YsFhlvXqRFcaUq1Uk+ehcYBk8qpVDD0rg6Nh4MIF2zFTcQX3QI/B2j9b98fAkbMRlDuZ7ZeuMafm+STAUt2MM31zxf60ZC3ZBf2pTjJQF2/As6LuymPenQ4yGJ2vug4VLValLk+biSl5Cw3LulCivHmgXIa3ru+V1TeWkBRi7rjn8PwENw03TEx40roluVp9QhcbWcY+tQVi0xYac1PexQRDJ1noKIfvntoO9S0X247ySk8gAQsUKWB1IHbukd57GNMVdyXRj6BrXr1RyNInuqvUqdPkMbQ1zvCHxRGZHPcbvhErknFWbANKSxQUGCtKuwyuao0z0nlOhc56TTbQQYzS4DbDm3ZyYctHDLAvqGK/q6IF3AzQ4bQNAZvKtl0XURQd9E+Pyn6zjYKT9yyGwtG6+PfeD1o9P93lLdFC5HnsUe9b9yYrNA6O1wOtYPsCHLzE6sUz5zM2L\"}}"
}
响应内容:
{
"code": 0,
"desc": "成功"
}
10. 使用 C2D 反查许可
接口地址
https://openapi.senseyun.com/v2/sv/findBoundLicenseKeyByC2d
说明 通过 C2D 查询该 C2D 对应的机器绑定的授权码
参数 请将 C2D 文件的内容作为 HTTP 请求 body 直接传入
注意事项:
- 由 Virbox 用户工具导出的 c2d 文件具有时效性, 默认时效是 24 小时, 超过便失效, 因此在调用该接口时请确保得到的 c2d 文件是最新导出的文件, 否则接口会返回相应的错误
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
data | Data21 |
Data21
字段名称 | 类型 | 描述 |
---|---|---|
licenseKeys | array | 该 C2D 对应的机器绑定的所有授权码 |
- 示例
请求内容:
{
"version": 3,
"c2dType": 1,
"pcName": "DESKTOP-S9216",
"os": "MicrosoftWindows10(build9200)x64",
"ip": "1.2.3.4",
"mac": "AA-AA-AA-AA-AA-AA",
"machineId": "72365cc425626ccd8b8f3bd6a23ad78db3f55cbfb2d7787fe28c4497c5b6155c",
"reqData": "AgAAALuyTWEkbiT1Ccy6GpGLyUJXXVuIFz3baZW6t1nSx9/tUSCPzIv4rcKbzeYnbgaOJI2mGycwLACETor1k3zH33yaKEPXwcszdPqQuSu9mND/8gjC/GEgrMtksVKG7RGIlKh8x1c61TLhXHICzHTR5basZFD7tJDhLJFKCrOmFudb32enBpp8H9QNkjFSo0EZDWV5IoElDkwxcOBFY+OygtQt6MyqxGZ9ND5Q4MdqC5/xPOL7jswV02IRCCE7Vb3M+WpqePIEAO4X0MHCNhZvpInG5hN3z98lDBg08u/iSbyQdwIFKHEVP1be74+P58UiuVwMdIgHl59P5E5b/KZnZVTTRgf5+5n7eHrl9uZezM+kXmD0jLIv4gC+42dvLJV7mwdjZe8hS99IgNPyoswedJ/6vKHdklQuoLgQed3RIVFAqnrw3PtrfqmsfjRhaFGpqPlMfAcUG2dmkN0njNaXxmI=",
"slv2": {
"version": 1,
"protocol": 2147483649,
"ssVer": "2.4.0.54681",
"from": "72365cc425626ccd8b8f3bd6a23ad78db3f55cbfb2d7787fe28c4497c5b6155c",
"hwfp": "AwAAAJhJSFXIQBBxdJPyzPbj/1qFNntGrQW98NP00pY2BqmYSrRiuCIkEImlAt4mxFrV/Qjg/aKdbZS4PKwzhDOPMWFy2LbQCcyT1vYsq9/E6oP8k6EEtzJDifuAv+1OrxDEAbo/tgdXvRj3ajWP3BcixLvz4tiYclkOh7kn1LFD7ZyhFkIFeu8R6Df2+QsmLzkPYwTkfkg3cYXPl29jzL3NnphTJer2toFg0LqUceOG8eCD9XtJ+LDvraL0mAlxfG6snBTOyh2lGk/aWVdTtKedmcPOuIxD9c6O0F9LriXHlVQogGaqLcmoQN23IfAlsCmrcL/BB+0SGQWEFpvL85zAWXVuWH6fV8mmAVKVe9l9QxABdMdIY2n6jp6UztKMu1pph5MoJVbpjiTyTjc4fL61fjo+UQx37FN5VRLiPw7Mp1LikqISQkcRvIlyUMI/D9qommShZIg3pqAB2YuNYY7Hw+EkX50KOHFmHAK8t0ecilrs5LFATm5itpgsAbKtTRSnRQ==",
"info": "AQAAAL70frHR3tO60mkgA9WYjwXjEGiphHSWwWe8gYYTdLBpil9X4gwgfja9fDamS//ouMVoUMalNAdeclXYrnvqgl6KxE5S00mPPuhVtPpwIq5gkGOGeR54kXEEYa82ebhrYs3fG12BeOPHFmwQYGOUrm/mD42blcrMFqce8hqZedxZokDg81bjqCkqCTdkHMpluylDtReVAT6FDTzrKSKU9qxu3BD1BTFdRXZO6m8Mkby65tIgmKFjbsHe/WqWTJwyQhkWUzC1/NGfgzOKqSnIYih0X3A4czvgEi63PoHyS+UUXVH8snBwceijY5jfihYJQogDWRjvtfWaLLW8i0RtWUM6js5oIlUyOU2IgAgNG/eqTFXIv2qAU0ZS4cXlmP9CR6uiXlPhL6dxMQboGzhatWZnVzzM0wQV1tsYzLt9zQ6Wn4gVAmzRxcw4IUfkX4oCEzCsFCr3cYdIZz2vcQAIYVUfIEGArkM2TNj0gv11xe+MzF4QnMu7scdX4s/OWlTJyAXTcjoL1WvBrUQaa9BSOBFXXc+MqqZN9Re7MhclrzZJlOQp3NdklbH7P+O31k8jf84m1UoU99QFn9FLmaCPxXsbQSZHRsDZdyoxoVUVPcB3CpV7i9mtW2cEGkdgXU7ecg=="
}
}
响应内容:
{
"code": 0,
"desc": "成功",
"data": {
"licenseKeys": [
"Q7D4-5CY5-J6Y0-F2DJ"
]
}
}
11. 锁定授权码
接口地址
https://openapi.senseyun.com/v2/sv/lockLicenseKey
说明 锁定指定的授权码, 锁定后的授权码将不能再进行绑定或在线更新等操作
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseKey | 是 | string | 授权码 |
- 注意事项:
- 授权码属于离线许可, 如果在绑定时, 授权码没有设置强制认证, 这个许可在锁定后仍然可以正常使用
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
- 示例
请求内容:
{
"licenseKey": "AWBZ-GHYL-JWGH-2FHN"
}
响应内容:
{
"code": 0,
"desc": "成功"
}
12. 解锁授权码
接口地址
https://openapi.senseyun.com/v2/sv/unlockLicenseKey
说明 解锁指定的授权码
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
licenseKey | 是 | string | 授权码 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
- 示例
请求内容:
{
"licenseKey": "AWBZ-GHYL-JWGH-2FHN"
}
响应内容:
{
"code": 0,
"desc": "成功"
}
十. 硬件锁许可管理接口
1. 发布添加硬件锁许可
接口地址
https://openapi.senseyun.com/v2/sv/dlm/issueAddLicense
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
pin | 是 | string | 填写在云平台设置的云控制锁 PIN 码 | |
shellNumber | 是 | string | 外壳号 | |
licenseId | 是 | number | 许可 ID, 必须是平台上已有的产品 | |
force | 是 | boolean | 是否强制升级 为 true 时, 若锁内无此许可, 则添加; 若有此许可, 则先删除后添加 为 false 时, 若锁内无此许可, 则添加; 若有此许可, 则报错 | |
isForever | 是 | boolean | 是否永久许可 | |
templateName | 否 | string | 模板名称, 仅用于平台展示, 与硬件锁模板无关, 最长 64 个字符 | |
version | 否 | number | 0 | 许可版本, 取值范围: [0, 4294967295] |
startTime | 否 | number | 许可开始时间, UTC 时间戳(秒) | |
endTime | 否 | number | 许可结束时间, UTC 时间戳(秒) | |
counter | 否 | number | 许可使用次数 | |
span | 否 | number | 时间跨度(天), 取值范围: [1, 18250] | |
concurrent | 否 | number | 0 | 最大并发用户数, 取值范围: [0, 65535] |
concurrentType | 否 | string | process | 并发类型, 取值可选: process/winUserSession 其中, process 以 Windows 进程限制, winUserSession 以 Windows 会话限制 |
module | 否 | array | 子模块列表, 模块取值范围: [1, 64] | |
rom | 否 | object | 许可只读区, 只有一个属性: data, 为数据区内容 hex 字符串 | |
raw | 否 | object | 许可读写区, 有两个属性: data, resize, data 为数据区内容 hex 字符串, resize 为重置读写区大小, 取值范围: [读写区数据长度, 65535] | |
pub | 否 | object | 许可公开区, 只有一个属性: data, 为数据区内容 hex 字符串 | |
dataZonePadMode | 否 | number | 1 | 数据区编辑模式 1-二进制模式 2-Key/Value 模式 |
kvSeparator | 否 | string | : | dataZonePadMode = 2时生效 Key/Value 分隔符, 长度为 1 |
kvConnector | 否 | string | ; | dataZonePadMode = 2时生效 Key/Value 连接符, 长度为 1 |
remark | 否 | string | 备注 | |
contractNo | 否 | string | 合同编号 | |
tagIds | 否 | array | 标签 ID 列表 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
- 示例
请求内容:
{
"pin": "1234567890qwerty",
"shellNumber": "201600001322",
"licenseId": 10100,
"force": true,
"isForever": false,
"version": 1,
"startTime": 1710989502,
"endTime": 1711075902,
"concurrent": 0,
"concurrentType": "process",
"module": [ 1, 2, 3, 4, 5 ],
"rom": {
"data": "12"
},
"raw": {
"data": "34"
},
"pub": {
"data": "56"
}
}
响应内容:
{
"code": 0,
"desc": "成功"
}
2. 发布更新硬件锁许可
接口地址
https://openapi.senseyun.com/v2/sv/dlm/issueUpdateLicense
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
pin | 是 | string | 填写在云平台设置的云控制锁 PIN 码 | |
shellNumber | 是 | string | 外壳号 | |
licenseId | 是 | number | 许可 ID, 必须是平台上已有的产品 | |
isForever | 是 | boolean | 是否永久许可 | |
version | 否 | number | 0 | 许可版本, 取值范围: [0, 4294967295] |
startTime | 否 | object | 许可开始时间, 有两个属性: op, value, op 可选值 set/inc/disable, set 为设置开始时间为 value 值, inc 为在已有开始时间基础上增加 value 值, disable 为禁用此项即不限制开始时间; value 为 UTC 时间戳(秒) | |
endTime | 否 | object | 许可结束时间, 有两个属性: op, value, op 可选值 set/inc/disable, set 为设置结束时间为 value 值, inc 为在已有结束时间基础上增加 value 值, disable 为禁用此项即不限制结束时间; value 为 UTC 时间戳(秒) | |
counter | 否 | object | 许可使用次数, 有两个属性: op, value, op 可选值 set/inc/disable, set 为设置使用次数为 value 值, inc 为在已有使用次数基础上增加 value 值, disable 为禁用此项即不限制使用次数, value 为 number | |
span | 否 | object | 许可时间跨度, 有两个属性: op, value, op 可选值 set/inc/disable, set 为设置时间跨度为 value 值, inc 为在已有时间跨度基础上增加 value 值, disable 为禁用此项即不设置时间跨度, value 为天数, 取值范围: [1, 18250] | |
concurrent | 否 | number | 最大并发用户数, 取值范围: [0, 65535] | |
concurrentType | 否 | string | process | 并发类型, 取值可选: process/winUserSession 其中, process 以 Windows 进程限制, winUserSession 以 Windows 会话限制 |
module | 否 | array | 子模块列表, 模块取值范围: [1, 64] | |
rom | 否 | object | 许可只读区, 只有一个属性: data, 为数据区内容 hex 字符串 | |
raw | 否 | object | 许可读写区, 有两个属性: data, resize, data 为数据区内容 hex 字符串, resize 为重置读写区大小, 取值范围: [读写区数据长度, 65535] | |
pub | 否 | object | 许可公开区, 只有一个属性: data, 为数据区内容 hex 字符串 | |
dataZonePadMode | 否 | number | 1 | 数据区编辑模式 1-二进制模式 2-Key/Value 模式 |
kvSeparator | 否 | string | : | dataZonePadMode = 2时生效 Key/Value 分隔符, 长度为 1 |
kvConnector | 否 | string | ; | dataZonePadMode = 2时生效 Key/Value 连接符, 长度为 1 |
remark | 否 | string | 备注 | |
contractNo | 否 | string | 合同编号 | |
tagIds | 否 | array | 标签 ID 列表 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
- 示例
请求内容:
{
"pin": "1234567890qazwsx",
"shellNumber": "200200000089",
"licenseId": "273",
"isForever": false,
"concurrent": 3,
"concurrentType": "winUserSession",
"module": [ 1, 2, 3 ],
"startTime": {
"op": "set",
"value": 123
},
"endTime": {
"op": "inc",
"value": 123
},
"counter": {
"op": "inc",
"value": 5
},
"span": {
"op": "disable"
},
"rom": {
"data": "1234",
"offset": 0,
"resize": 2
},
"raw": {
"offset": 0,
"resize": 0
},
"pub": {
"data": "234567",
"resize": 3
}
}
响应内容:
{
"code": 0,
"desc": "成功"
}
3. 发布删除硬件锁许可
接口地址
https://openapi.senseyun.com/v2/sv/dlm/issueDeleteLicense
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
pin | 是 | string | 填写在云平台设置的云控制锁 PIN 码 | |
shellNumber | 是 | string | 外壳号 | |
licenseId | 是 | number | 许可 ID, 必须是平台上已有的产品 |
- 注意事项:
- 删除硬件锁许可默认强制删除, 即如果许可不存在也会升级成功
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
- 示例
请求内容:
{
"pin": "1234567890qazwsx",
"licenseId": "273",
"shellNumber": "200200000089"
}
响应内容:
{
"code": 0,
"desc": "成功"
}
4. 发布清空锁内所有许可
接口地址
https://openapi.senseyun.com/v2/sv/dlm/issueClearAllLicenses
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
pin | 是 | string | 填写在云平台设置的云控制锁 PIN 码 | |
shellNumber | 是 | string | 外壳号 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
- 示例
请求内容:
{
"pin": "1234567890qazwsx",
"shellNumber": "200200000089"
}
响应内容:
{
"code": 0,
"desc": "成功"
}
5. 获取硬件锁许可详情
接口地址
https://openapi.senseyun.com/v2/sv/dlm/getLicenseDetail
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
shellNumber | 是 | string | 外壳号 | |
currentPage | 否 | number | 1 | 当前页数, 从 1 开始 |
pageSize | 否 | number | 10 | 每页数量 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
data | Data22[] |
Data22
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
rows | DongleLicenseDetail[] | 锁内所有许可信息 |
DongleLicenseDetail
字段名称 | 类型 | 描述 |
---|---|---|
licGuid | string | 许可 guid |
licenseId | number | 许可 ID |
productName | string | 产品名称 |
shellNumber | string | 外壳号 |
deviceId | string | 芯片序列号 |
status | number | 许可状态 0-正常 1-被删除 |
isForever | boolean | 是否永久许可 |
startTimeOpType | number | 开始时间操作类型, 具体含义见下文 |
startTime | number | 许可开始时间, 秒 |
endTimeOpType | number | 结束时间操作类型, 具体含义见下文 |
endTime | string | 许可结束时间, 秒 |
spanTimeOpType | number | 时间跨度操作类型, 具体含义见下文 |
spanTime | number | 时间跨度(天) |
counterOpType | number | 使用次数操作类型, 具体含义见下文 |
counter | number | 许可使用次数 |
concurrent | number | 并发用户数限制 |
concurrentOpType | number | 并发用户数操作类型, 具体含义见下文 |
concurrentType | string | 并发类型 会话: winUserSession 进程: process |
modules | array | 子模块列表 |
upgradeStatus | number | 升级状态 0, 1-未升级 2-升级成功 3-升级失败 4-跳过升级 |
failedMsg | string | 若升级失败, 错误描述 |
licenseVer | number | 许可版本 |
rom | string | 许可只读区, hex 字符串 |
raw | string | 许可读写区, hex 字符串 |
pub | string | 许可公开区, hex 字符串 |
dataZonePadMode | number | 数据区编辑模式. 1-文件模式, 2-Key/Value 模式 |
kvSeparator | string | Key/Value 分隔符, 数据区编辑模式为 Key/Value 时启用, 长度为 1 |
kvConnector | string | Key/Value 连接符, 数据区编辑模式为 Key/Value 时启用, 长度为 1 |
rawResize | number | 重置读写区大小 |
createTime | number | 创建时间, UTC 时间戳(秒) |
updateTime | number | 更新时间, UTC 时间戳(秒) |
remark | string | 备注 |
contractNo | string | 合同编号 |
tags | array | 标签信息列表 |
opType
值 | 描述 |
---|---|
0 | 未设置 |
1 | 设置 |
2 | 追加 |
4 | 不限制 |
- 示例
请求内容:
{
"shellNumber": "201600001322",
"currentPage": 1,
"pageSize": 10
}
响应内容:
{
"code": 0,
"data": {
"rows": [
{
"concurrent": 100,
"concurrentOpType": 1,
"concurrentType": "process",
"createTime": 1567061925,
"deviceId": "9733C801000702072C6400120003002D",
"endTime": 1568131199,
"endTimeOpType": 1,
"failedMsg": "成功",
"isForever": false,
"licGuid": "87a6562d34ca4f849c729c098692d2f4",
"licVersion": 0,
"licenseId": 20000,
"modules": [],
"productName": "计算器",
"shellNumber": "201600001322",
"startTime": 1567008000,
"startTimeOpType": 1,
"status": 0,
"updateTime": 1567063631,
"upgradeStatus": 2,
"remark": "备注信息",
"contractNo": "合同编号 1023"
},
{
"concurrent": 0,
"concurrentType": "process",
"createTime": 1564649180,
"deviceId": "9733C801000702072C6400120003002D",
"failedMsg": "成功",
"isForever": false,
"licGuid": "73b67fe6a327412c9684d2fe5e4b7742",
"licVersion": 0,
"licenseId": 10000,
"modules": [],
"productName": "记事本",
"shellNumber": "201600001322",
"status": 1,
"updateTime": 1565075005,
"upgradeStatus": 2,
"tags": [
{
"id": 1,
"name": "标签 1"
},
{
"id": 2,
"name": "标签 2"
}
]
}
],
"totalCount": 2,
"totalPage": 1
},
"desc": "成功"
}
十一. 硬件锁信息管理接口
1. 修改用户锁联系人信息
接口地址
https://openapi.senseyun.com/v2/sv/dm/modifyContact
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
shellNumber | 是 | string | 外壳号 | |
userName | 否 | string | 用户名称, 最长 64 个字符 | |
tel | 否 | string | 电话, 最长 32 个字符 | |
否 | string | 邮箱, 必须为合法的邮箱地址, 最长 64 个字符 | ||
cellphone | 否 | string | 手机号, 必须为合法的手机号码 | |
address | 否 | string | 联系地址, 最长 128 个字符 | |
tagIds | 否 | array | 标签 ID 列表 | |
desc | 否 | string | 用户锁描述信息, 最长 300 个字符 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
- 示例
请求内容:
{
"shellNumber": "201600001322",
"userName": "John Doe",
"cellphone": "18600706089",
"email": "15623566@qq.com",
"tel": "010-56730936",
"address": "北京市海淀区西北旺东路 10 号院东区 5 号楼 5 层 510"
}
响应内容:
{
"code": 0,
"desc": "成功"
}
2. 开关用户锁在线自动升级
接口地址
https://openapi.senseyun.com/v2/sv/dm/autoUpgradeSwitcher
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
shellNumber | 是 | string | 外壳号 | |
autoUpgrade | 是 | boolean | 是否自动升级 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
- 示例
请求内容:
{
"shellNumber": "201600001322",
"autoUpgrade": true
}
响应内容:
{
"code": 0,
"desc": "成功"
}
3. 获取用户锁信息
接口地址
https://openapi.senseyun.com/v2/sv/dm/getBriefInfo
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
shellNumber | 否 | string | 外壳号, 支持模糊查找 | |
否 | string | 邮箱, 支持模糊查找 | ||
cellphone | 否 | string | 手机号, 支持模糊查找 | |
userName | 否 | string | 备注名称, 支持模糊查找 | |
tagIds | 否 | array | 标签 ID 列表 | |
currentPage | 否 | number | 1 | 当前页, 从 1 开始 |
pageSize | 否 | number | 10 | 每页数量 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
data | Data23 |
Data23
字段名称 | 类型 | 描述 |
---|---|---|
totalPage | number | 总页数 |
totalCount | number | 总条数 |
rows | DongleBriefInfo[] | 用户锁记录列表 |
DongleBriefInfo
字段名称 | 类型 | 描述 |
---|---|---|
deviceId | string | 芯片序列号 |
shellNumber | string | 外壳号 |
userName | string | 用户名称 |
cellphone | string | 手机号 |
string | 邮箱 | |
tel | string | 电话 |
address | string | 联系地址 |
desc | string | 备注信息 |
produceTime | number | 生产时间, UTC 时间戳(秒) |
updateTime | number | 更新时间, UTC 时间戳(秒) |
autoUpgrade | boolean | 是否在线自动升级 |
tagMessage | array | 标签信息列表 |
- 示例
请求内容:
{
"shellNumber": "201600001322",
"currentPage": 1,
"pageSize": 10
}
响应内容:
{
"code": 0,
"data": {
"rows": [
{
"address": "北京市海淀区西北旺东路 10 号院东区 5 号楼 5 层 510",
"autoUpgrade": false,
"cellPhone": "18600706089",
"desc": "",
"deviceId": "9733C801000702072C6400120003002D",
"email": "15623566@qq.com",
"produceTime": 1521648000,
"shellNumber": "201600001322",
"tagMessage": [
{
"createTime": 1488263583000,
"id": 48,
"name": "黄金客户"
}
],
"tel": "010-56730936",
"updateTime": 1568044800,
"userName": "Jonn Doe"
}
],
"totalCount": 1,
"totalPage": 1
},
"desc": "成功"
}
十二. 标签管理接口
1. 添加标签
接口地址
https://openapi.senseyun.com/v2/sv/addTag
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
name | 是 | string | 标签名称 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
data | TagId |
TagId
字段名称 | 类型 | 描述 |
---|---|---|
id | number | 标签 ID |
- 示例
请求内容:
{
"name": "独立开发者"
}
响应内容:
{
"desc": "OK",
"code": 0,
"data": {
"id": 12
}
}
2. 修改标签
接口地址
https://openapi.senseyun.com/v2/sv/updateTag
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
id | 是 | number | 标签 ID | |
name | 是 | string | 标签名称 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
- 示例
请求内容:
{
"id": 234,
"name": "独立开发者"
}
响应内容:
{
"desc": "OK",
"code": 0,
}
3. 删除标签
接口地址
https://openapi.senseyun.com/v2/sv/deleteTag
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
id | 是 | number | 标签 ID |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
- 示例
请求内容:
{
"id": 234
}
响应内容:
{
"desc": "OK",
"code": 0,
}
4. 按标签名称查找标签
接口地址
https://openapi.senseyun.com/v2/sv/findTags
参数
参数名称 | 必选 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
name | 否 | string | 标签名称 |
- 响应
字段名称 | 类型 | 描述 |
---|---|---|
code | number | 状态码. 0-成功, 其它值表示失败 |
desc | string | 错误描述. |
data | Tag[] | 标签列表 |
Tag
字段名称 | 类型 | 描述 |
---|---|---|
id | number | 标签 ID |
name | string | 标签名称 |
createTime | number | 创建时间, UTC 时间戳(秒) |
- 示例
请求内容:
{
"name": "独立开发者"
}
响应内容:
{
"desc": "OK",
"code": 0,
"data": [
{
"createTime": 1505273720000,
"id": 576,
"name": "独立开发者"
}
]
}
十三. 附录
- 接口授权类错误码
错误码 | 分类 | 描述 |
---|---|---|
0 | 接口授权类 | 调用成功 |
10001 | 接口授权类 | Auth fail, 授权失败. 1. 由于SenseAppID/Secret 错误; 2. SenseTimestamp 与服务器时间相差过大; 3. 重复使用 SenseNonce 值 |
10002 | 接口授权类 | 不支持的 Content-Type |
10003 | 接口授权类 | Traffic over limit. 接口调用频次超出限制. 若您需要调用的频次极高, 请联系深盾技术支持. |
10004 | 接口授权类 | 鉴权阶段的未知错误 |
- 产品及模板相关错误码
错误码 | 分类 | 描述 |
---|---|---|
2 | 产品类 | Demo 开发商只能建一个产品 |
18 | 产品类 | 产品 id 已经创建过了 |
29 | 产品类/模板类 | 文件大小超过 64K |
300 | 产品类 | 删除产品前先删除该产品下的所有模板 |
301 | 产品类/模板类 | 产品不存在 |
400 | 模板类 | 模板不存在 |
- 用户相关错误码
错误码 | 描述 |
---|---|
1 | Param error, 参数错误. 1、参数填写格式不正确; 2、参数漏填; 3、参数非 json 格式. |
4 | Unknown error,由于系统内部原因导致的错误.可能由于系统异常, 调用远端服务异常等原因导致出错报出该错误. |
12 | User Not Exist, 用户不存在.开发者网站根据指定账号查询用户为空, 该账号用户不存在. |
15 | 获取开发商信息出错.云平台通过 senseAppID、Secret 获取对应开发商信息失败导致. |
101 | 删除影子账号失败. 由于用户中心删除该账号用户失败导致删除影子账号失败. |
102 | 修改影子账号密码失败. 由于系统内部未知错误导致修改密码失败. |
103 | Account Type Error,账号类型须为影子账号. 修改用户密码时传入用户账号为普通用户账号, 应传入影子账号, 该方法只能修改影子账号密码. |
200 | User Exist,用户已存在. 用户中心已经存在该用户, 重新换取账号添加用户 |
- 许可相关错误码
错误码 | 描述 |
---|---|
0 | 调用成功. |
1 | Param error, 参数错误. 1、参数填写格式不正确; 2、参数漏填; 3、参数非 json 格式. |
4 | Unknown error,由于系统内部原因导致的错误.可能由于系统异常, 调用远端服务异常等原因导致出错报出该错误. |
6 | Online Lic Error, 在线签发许可错误. 调用 developer 服务发布许可时出错报出该错误. |
8 | Demo License Limit, 超过 demo 开发商授权上限. demo 开发商发布授权时最多可发布100 条许可, 超过 100 条就会报出该错误. |
12 | User Not Exist, 用户不存在. 开发者网站根据指定账号查询用户为空, 该账号用户不存在. |
15 | 获取开发商信息出错. 云平台通过 SenseAppID、Secret 获取对应开发商信息失败导致. |
23 | 该模板的授权方式产品不支持. 模板的授权方式超出产品的授权方式范围, 在产品的授权方式范围内修改模板的授权方式后重发许可即可. |
28 | License Not Exist, 许可不存在. 删除许可时, 查找该许可不存在时报错. |
40 | Template Deleted, 模板不存在或已删除. 发布许可所依赖模板已经被删除, 不能再根据该模板发布许可, 重新选择或新建模板发布许可. |
49 | 模板许可形式与填写的许可形式冲突. 调用接口时传入许可形式的参数与传入模板相应的许可形式相冲突, 修改填写的许可形式参数. |
507 | 模版不允许在发布许可时临时修改限制, 即添加模板的参数 canModify=false 时, 此错误码只会出现在 "依赖模板发布许可" 接口返回值中 |
517 | 许可已过期. 更新许可时, 许可已过期则不可更新该许可 |