📘 通用API开放文档
📌 版本:v1.0📅 发布日期:2024-06-19🔐 国密SM3/SM4
🔌 一、接口基础规则
📦 二、基础报文定义
🔹 请求公共参数
🔸 响应公共结构
✍️ 三、签名流程(SM3)
🔄 签名生成5步骤:1️⃣ 参数名按字母顺序排序(不区分大小写)2️⃣ 拼接参数值(无间隔)3️⃣ 移除参数间空格4️⃣ 末尾追加appSecret5️⃣ 使用SM3算法计算哈希 → 获得sign
示例: 原始参数:projectId=00000678, requestId=ea0a3cef..., timestamp=1641523970076 排序后拼接:00000678ea0a3cef18c45e769f7136de7977db3f0000067823701641523970076 加上appSecret:... + 4F16D727D3DE6340 SM3签名结果:88af246cde85c3092913145c650d6100ea6b9aa8133592d411ec7a86badc8cb8
🔒 四、加密与解密说明(SM4)
🔐 国密SM4 (PKCS7Padding填充)请求时需将所有业务参数转为JSON字符串 → 使用appSecret作为密钥SM4加密 → 得到encryptScript字段提交。响应同理,需对encryptScript解密获得真实数据。
// 请求外层结构示例 { "appId": "your_app_id", "encryptVersion": "1", "encryptScript": "332da172ce43871f43105908124ba4e8...", "token": "xxx" }
📡 五、核心API接口
🔐 1. API开发者认证
地址:XXX/api/XXX/XXX/developerLoginMethod:POST说明:获取调用凭证 token,有效期7天。
{ "requestId": "ea0a3cef18c45e769f7136de7977db3f", "sign": "70a21f42b4986da7f719fd1e697de97f", "version": "1", "timestamp": "1657878287222" }
{ "data": { "token": "T2JXAg7ChFyqlYjm0/Hi/MnyzAQ8FLWB9pylnR3D0KM=" }, "msgCode": 0, "requestId": "ea0a3cef18c45e769f7136de7977db3f", "timestamp": "1657878287987" }
📱 2. 获取设备信息
地址:/XXX/XXXX/XXX/getDeviceInfoMethod:POST说明:根据设备编码获取电梯/群控器列表。
// 请求示例 { "requestId": "ea0a3cef18c45e769f7136de7977db3f", "deviceUnique": "0000040210031", "version": "1", "timestamp": "1657878798514" } // 响应示例 { "data": [ { "controllerDeviceName": "CLUSTER-32", "controllerDeviceUnique": "0000040250032", "deviceName": "测试1", "deviceUnique": "0000040210031" } ], "msgCode": 0, "requestId": "ea0a3cef18c45e769f7136de7977db3f", "timestamp": "1657878799405" }
⚠️ 六、错误码说明
📌 七、注意事项
📌 业务须知• HTTP 401 表示token过期,需重新调用开发者认证接口。• 设备编码第9位含义:1= 云电梯,5= 群控器。• token有效期7天,过期后请求会返回HTTP 401。• 请求接口时,请务必在Header或表单中遵守加密规则。
💻 开发建议• 签名时如果没有现成排序函数,可以手动按参数名固定顺序(a-z)拼接。• 仅开发者认证接口需要传递appId,其他接口使用token认证。• 推荐使用SM4解密库(PKCS7Padding),注意key为appSecret的UTF-8字节。
🧩 八、代码片段(Java参考)
// SM3 签名 (使用Hutool) public static String getSDKV3Sign(Map<String, Object> params, String appsecret) { // 1. 参数按key排序 List<String> keys = new ArrayList<>(params.keySet()); Collections.sort(keys, String.CASE_INSENSITIVE_ORDER); StringBuilder sb = new StringBuilder(); for (String key : keys) { sb.append(params.get(key) == null ? "" : params.get(key)); } sb.append(appsecret); return SmUtil.sm3(sb.toString()); } // SM4 加密 (PKCS7Padding) public static String encryptHex(String data, String secretKey) { SymmetricCrypto sm4 = new SM4(Mode.ECB, "PKCS7Padding", secretKey.getBytes(StandardCharsets.UTF_8)); return sm4.encryptHex(data); } // SM4 解密 public static String decryptStr(String encryptHex, String secretKey) { SymmetricCrypto sm4 = new SM4(Mode.ECB, "PKCS7Padding", secretKey.getBytes(StandardCharsets.UTF_8)); return sm4.decryptStr(encryptHex); }
📄 本文档基于开放平台通用API规范整理,完整版包含Postman示例及详细加密库。💡 如遇接入问题,请联系技术支持团队获取最新SDK。