sign.md 2.1 KB

签名

目的

为了防止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=好又多超市

参数拼接成字符串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();
}