Skip to content

获取 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)

请求参数

参数名称参数类型是否必需参数含义说明
operatorTypeintY获取 token 类型1:应用 token(拥有该应用全部权限),2:自定义 token(拥有该应用部分权限)。
sigStringY签名(32 位小写字符串)MD5(appId+secret)
actionStringN行为read:只读,write:可读可写,获取应用 token 时不传。
targetTypeStringN资源类型2:设备,获取应用 token 时不传。
targetStringN目标资源多个设备 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"
}

响应参数

参数名称参数类型参数含义说明
resultCodeString响应码返回错误码。0:success
resultMsgString响应描述简单错误信息说明
dataObject响应数据返回结果内容(JSON 格式 → String),详情参照 data 数据模型

data 数据模型

名称类型说明备注
expires_ininttoken 失效时间,单位:秒 
tokenStringtoken 
tokenNumStringtoken 号 

响应示例

{
    "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();
        }
    }
}