1.須要參於簽名的參數: a. 在請求參數列表中,除去 cliSign 參數外,其餘須要使用到的參數皆是要簽名的參數。 2.生成簽名字符串 a. 沒有值的參數無需傳遞,也無需包含到待簽名數據中 b. 簽名數據應該是原生值而不是 encoding 以後的值 c. 若遇參數值爲數組時,請以char=7對應字符進行分割此參數的多個值 d. 按簽名參數 a 到 z 的順序排序("&"是分割開出多個參數) 簽名參數字符串以下: params = channel =0&password=abc&userid=13876 pass = md5(params + appkey).toLowerCase() 注:「+」加與爲字符串相連符,不在簽名字符裏,appkey爲祕鑰,爲雙方平臺約定字符 加密後cliSign = pass.substring(5, 21);所有小寫後,獲取前8到24位共16位傳到服務端; e. 針對部分CDN接口如有傳中文,客戶端請在對中文URLEncoder後加密 3.開發測試環境簽名密鑰: appkey="test888"
import org.apache.commons.codec.digest.DigestUtils; //業務字段 String accessToken = vars.get("access_token"); String userId = vars.get("user_id"); String videoId = vars.get("videoId"); //POST/get請求公共參數 String appId = vars.get("appId"); String brand = vars.get("brand"); String channel = vars.get("channel"); String device = vars.get("device"); String platform = vars.get("platform"); String sysVersion = vars.get("sysVersion"); String times = vars.get("times"); String version = vars.get("version"); String appkey = vars.get("appkey"); //將簽名傳給cliSign參數,使用treemap,可自動進行排序 Map map = new TreeMap(); map.put("accessToken", accessToken); map.put("userId", userId); map.put("videoId", videoId); map.put("appId", appId); map.put("brand", brand); map.put("channel", channel); map.put("device", device); map.put("platform", platform); map.put("sysVersion", sysVersion); map.put("times",times); map.put("version", version); //URLEncoder.encode(value, "UTF-8") 對中文進行格式化,這裏不須要 StringBuffer sb = new StringBuffer(); for (Map.Entry entry : map.entrySet()) { sb.append(entry.getKey() + "=" + entry.getValue()); sb.append("&"); } String s = sb.toString(); if (s.endsWith("&")) { s = org.apache.commons.lang.StringUtils.substringBeforeLast(s, "&"); } log.info("Map轉換爲URL編碼"+s); String str1 = s+appkey; log.info("待加密字符串爲:"+str1); //進行md5加密 String pass = DigestUtils.md5Hex(str1).toLowerCase(); log.info("加密後的值:"+pass); //截取前8到21位爲簽名 String sign = pass.substring(5, 21); log.info("最終簽名爲:"+sign); //將簽名傳給cliSign參數 vars.put("cliSign",sign);
a. 不肯定拼接後的參數是否正確、順序是否正確,是否須要用URLEncoder進行轉碼或者獲取參數時出錯等,只有打印出來後才能知道; b.不肯定加密後的值是否正確,有可能與開發使用的加密方法不一致; c. 不肯定截取後,最終簽名是否正確 簽名機制就是這樣,每一步都不能出錯,須要步步爲營,抽絲剝繭。找到是哪一步出的問題
附錄:URL在線轉碼測試java