-
引言
我们在日常工作中经常会遇到对接微信平台、支付宝平台、或者自己对外开放一个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);}