Temu OpenAPI签名算法描述
-
为了防止API调用过程中被恶意篡改,调用任何一个API都需要携带请求签名,开放平台服务端会根据请求参数,对签名进行验证,并对签名不合法的请求将会被拒绝
-
目前支持的签名算法为:MD5 (sign_method=md5),签名过程如下:
-
- 本次请求中所有请求参数(包含公共参数与业务参数)进行首字母以ASCII方式升序排列ascii asc ,对于相同字母则使用下个字母做二次排序,字母序为从左到右,以此类推
- 排序后的结果按照参数名value 的次序进行字符串拼接,拼接处不包含任何字符
- 拼接完成的字符串做进一步拼接成1个字符串(包含所有kv字符串的长串),并在该长串的头部及尾部分别拼接app_secret ,完成签名字符串的组装
- 最后对签名字符串,使用MD5 算法加密后,得到的MD5 加密密文后转为大写,即为sign 值
算法实现
调用generateSign
方法即可返回符合要求的sign值。有优化建议的可以在评论区一起讨论。
/**
* 生成签名的方法
*
* @param paramMap 请求参数的键值对
* @param appSecret 应用的密钥
* @return 生成的签名字符串
*/
public static String generateSign(Map<String, Object> paramMap, String appSecret) {
// Step 1: 按照键的ASCII码顺序对参数进行排序
List<String> keys = new ArrayList<>(paramMap.keySet());
Collections.sort(keys);
// Step 2: 按照"key + value"的顺序将所有参数拼接成一个字符串
StringBuilder stringBuilder = new StringBuilder();
for (String key : keys) {
Object value = paramMap.get(key);
if (value != null) {
String jsonValue = null;
if (value instanceof String) {
jsonValue = (String) value;
} else {
jsonValue = JSONObject.toJSONString(value);
}
stringBuilder.append(key).append(jsonValue);
}
}
// Step 3: 在拼接好的字符串前后分别添加appSecret
String signString = appSecret + stringBuilder.toString() + appSecret;
// Step 4: 使用MD5算法对字符串进行加密,并将结果转换为大写
return md5(signString).toUpperCase();
}
/**
* 对字符串进行MD5加密
*
* @param input 输入的字符串
* @return MD5加密后的字符串
*/
private static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(input.getBytes("UTF-8"));
StringBuilder hexString = new StringBuilder();
for (byte b : digest) {
String hex = Integer.toHexString(0xFF & b);
if (hex.length() == 1) {
hexString.append('0'); // 补零确保两位十六进制
}
hexString.append(hex);
}
return hexString.toString();
} catch (Exception e) {
throw new RuntimeException("生成MD5哈希失败", e);
}
}