获取 token
接口功能
该接口用于应用根据 appid 和 secret 获取 accessToken。
注意
获取到的 accessToken 有效期是 7 天,请在即将过期或者接口报错 11504 时重新获取,请勿频繁调用,频繁调用将会被拉入限制黑名单。
每次获取新的token,历史token则会失效。
- 应用 token:拥有该应用的所有资源的权限,应用 token 有效期比较长。
- 自定义 token:用于申请获应用的部分资源的权限,每个自定义 token 互相独立,有效期比较短暂。
请求地址
https://open.qly.cmviot.cn/v3/open/api/token请求方式
POST,无需鉴权(header 参数无需 token)
请求参数
| 参数名称 | 参数类型 | 是否必需 | 参数含义 | 说明 |
|---|---|---|---|---|
| operatorType | int | Y | 获取 token 类型 | 1:应用 token(拥有该应用全部权限),2:自定义 token(拥有该应用部分权限)。 |
| sig | String | Y | 签名(32 位小写字符串) | MD5(appId+secret) |
| action | String | N | 行为 | read:只读,write:可读可写,获取应用 token 时不传。 |
| targetType | String | N | 资源类型 | 2:设备,获取应用 token 时不传。 |
| target | String | N | 目标资源 | 多个设备 id 以逗号拼接,获取应用 token 时不传。 |
签名方法
try{
String appid = "dfgd5115";
String secret = "dgfds41d5sf1g5sdfgd";
String sig = Hex.encodeHexString(MessageDigest.getInstance("MD5").digest(StringUtils.getBytesUtf8(appid+secret)));
}catch (Exception e){}请求示例
申请应用token:(确保无空格)
{"operatorType":1,"sig":"d41d8cd98f00b204e9800998ecf8427e"}
申请设备xxxxS_abcde的只读权限的自定义token:
{
"operatorType":2,
"action":"read",
"targetType":2,
"target":"xxxxS_abcde",
"sig":"d41d8cd98f00b204e9800998deca120"
}响应参数
| 参数名称 | 参数类型 | 参数含义 | 说明 |
|---|---|---|---|
| resultCode | String | 响应码 | 返回错误码。0:success |
| resultMsg | String | 响应描述 | 简单错误信息说明 |
| data | Object | 响应数据 | 返回结果内容(JSON 格式 → String),详情参照 data 数据模型 |
data 数据模型
| 名称 | 类型 | 说明 | 备注 |
|---|---|---|---|
| expires_in | int | token 失效时间,单位:秒 | |
| token | String | token | |
| tokenNum | String | token 号 |
响应示例
{
"resultCode": "000000",
"resultMsg": "成功",
"data": {
"expires_in": 604800,
"token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIzNDIzOTU3Mzk4NTcyMyIsImFwcGlkIjoiMzQyMzk1NzM5ODU3MjMiLCJvcGVyYXRvclR5cGUiOjEsImV4cCI6MTU2MDMyMjk0MCwiYXBwUmVnaW9uIjoxLCJpYXQiOjE1NTk3MTgxNDAsIm9wZXJhdG9yIjoiMzQyMzk1NzM5ODU3MjMiLCJqdGkiOiIxNTU5NzE4MTQwNzk2In0.G4JRsjlAZQefgfwX8W953VH6pJusXpjkwQHXMDX2PU4"
"tokenNum":"1165410984518"
}
}示例代码
java
package com.example.demo;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.binary.StringUtils;
import org.apache.commons.codec.digest.DigestUtils;
import org.json.JSONObject;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class TokenFetcher {
private static final String APP_ID = "";
private static final String SECRET = "";
private static final String URL = "https://open.qly.cmviot.cn/v3/open/api/token";
private static final String PRIVATE_KEY = "";
public static void main(String[] args) {
try {
String timestamp = String.valueOf(System.currentTimeMillis());
String sig = Hex.encodeHexString(MessageDigest.getInstance("MD5").digest(StringUtils.getBytesUtf8(APP_ID+SECRET)));
JSONObject requestBody = new JSONObject();
requestBody.put("operatorType", 1);
requestBody.put("sig", sig);
String requestBodyStr = requestBody.toString();
// 2. 计算请求体MD5
String md5 = DigestUtils.md5Hex(String.valueOf(requestBody));
// 3. 构建签名字符串
Map signParams = new LinkedHashMap();
signParams.put("appid", APP_ID);
signParams.put("md5", md5);
signParams.put("timestamp", timestamp);
signParams.put("version", "1.0.0");
String jsonString = JSONUtil.toJsonStr(signParams);
// 4. RSA签名
byte[] keyBytes = Base64.getDecoder().decode(PRIVATE_KEY);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initSign(priKey);
signature.update(jsonString.getBytes("UTF-8"));
String signatureString = Base64.getEncoder().encodeToString(signature.sign());
// 5. 发送请求
String response = HttpRequest.post(URL)
.header("content-type", "application/json")
.header("appid", APP_ID)
.header("md5", md5)
.header("timestamp", timestamp)
.header("version", "1.0.0")
.header("signature", signatureString)
.body(requestBodyStr)
.execute().body();
System.out.println("Response: " + response);
} catch (Exception e) {
e.printStackTrace();
}
}
}