## 签名 ##### **目的** 为了防止API调用过程中数据被恶意篡改,调用任何一个API都需要按照规则进行签名,开放平台服务端会根据同一规则对签名进行验证,签名不合法的请求将会被拒绝。 ##### **规则** 1. 将参数(sign除外)按照参数名的字典顺序排序 2. 将参数使用键值对的格式(即key1=value1&key2=value2...)拼接成字符串A 3. 在字符串A最后拼接上appSecret得到最终的待签名字符串B 4. 对待签名字符串B进行MD5运算,得到字符串C 5. 最后将字符串C转换为大写, 即得到签名值, signValue ##### **示例** appSecret=test001 系统参数: appId=100010 timeStamp=1651215937000 业务参数: shopName=好又多超市 empty= 参数拼接成字符串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代码示例)** ```java private static String getSignValue(Map paramMap, String appSecret) { Set 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) { 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(); } ```