Skip to main content

生成 signature

计算签名关键的参数如下:

变量名含义类型备注
appKey应用唯一标识String开发者平台创建应用获取
accessKey应用授权唯一标识String开发者平台创建应用授权获取
accessSecret应用授权密钥String开发者平台创建应用授权获取
timestamp签名到期时间戳String毫秒级时间戳,开发者根据自己的业务系统自定义
platform签名客户端String可选: SERVER、ANDROID、PC、GLASS

Java获取签名值signature的示例代码如下:

/**
* 签名算法
*
* @param appKey 应用Key
* @param accessKey 会议系统发放的授权标识
* @param accessSecret 会议系统发放的授权密钥
* @param timestamp 有效期时间戳
* @param platform 请求客户端
* @return
*/
public static String generateSignature(String appKey,
String accessKey,
String accessSecret,
String timestamp,
String platform) {
Map<String, String> signMap = new HashMap<>();
// accessKey, timestamp, platform 也需要参与签名
signMap.put("appKey", appKey);
signMap.put("accessKey", accessKey);
signMap.put("timestamp", timestamp);
signMap.put("platform", platform);
// 生成签名字符数据
String data = sortKeysAndConcatenateValues(signMap);
// 密钥转为byte数组
byte[] bytes = accessSecret.getBytes(StandardCharsets.UTF_8);
// 签名密钥
SecretKeySpec signingKey = new SecretKeySpec(bytes, "HmacSHA256");
// 开始计算签名
Mac mac = null;
try {
mac = Mac.getInstance("HmacSHA256");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
try {
mac.init(signingKey);
} catch (InvalidKeyException e) {
e.printStackTrace();
}
byte[] rawHmac = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
String signature = Base64.getEncoder().encodeToString(rawHmac);
return signature;
}

/**
* key按照首字母, 依据ASCII码排序, 拼接value值
*
* @param signMap 全部参与签名的键值对
* @return
*/
private static String sortKeysAndConcatenateValues(Map<String, String> signMap) {
// 使用TreeMap对键进行排序
Map<String, String> sortedMap = new TreeMap<>(signMap);
StringBuilder result = new StringBuilder("");
// 遍历排序后的Map,拼接值
for (Map.Entry<String, String> entry : sortedMap.entrySet()) {
result.append(entry.getValue());
}
return result.toString().toUpperCase();
}