-
引言
????????我們在日常工作中經常會遇到對接微信平臺、支付寶平臺、或者自己對外開放一個api服務,那么這里經常會出現一個名字:sgin(簽名)。
-
舉個栗子
? ? ? ? 這是微信支付統一下單接口文檔,最簡單的理解就是,服務端為了安全考慮,要求客戶端在請求時,將請求參數全部進行加密生成一個密文傳過來,然后服務端在通過請求參數進行加密生成密文,比對這倆密文是否一樣,如果一樣說明本次請求是安全的。
-
怎么弄
????POST? ? http://localhost:8985/open/api/addUser請求體(body):appid、name、age、gender、sign
????????一般在對接這種平臺,會提供接口地址、請求方式、請求參數、appid、appsecret。
????????這兩個最簡單的理解就是appid代表你的名字,appsecret代表你的秘鑰(這個打死也不能告訴別人)。
? ? ? ? 一般文檔會告訴你,先將所有參數按照ASCII碼從小到大排序,中間key=value拼接,各個參數之間&拼接,然后再將秘鑰拼接,最終采用MD5方式加密轉大寫就可以生成sign。
? ? ? ? 直接上代碼,我相信看完,應該也都懂了。
/*** 提前引入hutool-all包* * <dependency>* <groupId>cn.hutool</groupId>* <artifactId>hutool-all</artifactId>* <version>5.4.4</version>* <scope>compile</scope>* </dependency>* @param args*/public static void main(String[] args) {String appid = "wangzhen";String appsecret = "123456";// 創建加密參數,這里為什么采用TreeMap,是因為treemap是天然的ASCII排序的TreeMap treeMap = new TreeMap();treeMap.put("appid", appid);treeMap.put("name", "小明");treeMap.put("age", "17");treeMap.put("gender", "0");
// 拼接后的字符串StringBuilder sb = new StringBuilder();treeMap.forEach((k, v) -> {sb.append(k + "=" + v + "&");});
// 將秘鑰拼接到尾部sb.append("appsecret=" + appsecret);
// 進行md5加密轉大寫String sign = SecureUtil.md5(sb.toString()).toUpperCase();System.out.println("sign:" + sign);
// 添加到請求體中treeMap.put("sign", sign);
// 請求接口String post = HttpUtil.post("http://localhost:8985/open/api/addUser", JSONUtil.toJsonStr(treeMap));System.out.println(post);}