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