为了防止API调用过程中数据被恶意篡改,调用任何一个API都需要按照规则进行签名,开放平台服务端会根据同一规则对签名进行验证,签名不合法的请求将会被拒绝。
appSecret=test001 系统参数: appId=100010 timeStamp=1651215937000 业务参数: shopName=好又多超市
参数拼接成字符串A: appId=100010&shopName=好又多超市&timeStamp=1651215937000
字符串A的末尾拼接appSecret, 组装成字符串B: appId=100010&shopName=好又多超市&timeStamp=1651215937000&appSecret=test001
字符串B进行MD5运算得到字符串C: MD5(appId=100010&shopName=好又多超市&timeStamp=1651215937000&appSecret=test001)
字符串C转成全大写, 得到签名signValue: MD5(appId=100010&shopName=好又多超市&timeStamp=1651215937000&appSecret=test001).toUpperCase()
签名算法如下(Java代码示例)
private static String getSignValue(Map<String, Object> paramMap, String appSecret) {
Set<String> keySet = paramMap.keySet();
StringBuilder param = new StringBuilder(20 * keySet.size());
String[] keys = keySet.toArray(new String[keySet.size()]);
Arrays.sort(keys);
try {
for (String key : keys) {
Object value = paramMap.get(key);
// 排除值为null的情况
if (value == null || StringUtils.isEmpty(value.toString())) {
param.append(URLEncoder.encode(key, "UTF-8")).append("=").append(value).append("&");
}
}
param.append("appSecret").append("=").append(URLEncoder.encode(appSecret, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return Md5Util.md5(param.toString()).toUpperCase();
}