关于微信/支付宝等平台验签/签名sign生成算法

  • 引言

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

猜你喜欢

转载自blog.csdn.net/qq_41611676/article/details/134878241