生成 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();
}