关于微信/支付宝等平台验签/签名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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

很搞笑的在打麻将

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值