公众号/小程序开发 签名参数拼接 MD5/SHA1加密参数获取JS-SDK接口权限

版权声明:本文为博主原创文章,如需转载,敬请注明转载链接 https://blog.csdn.net/guobinhui/article/details/85047526

在公众号或者小程序开发中,无论是微信小程序,百度小程序还是支付宝小程序开发,涉及到的很多官方sdk接口调用,都需要有接口权限,而这些接口权限的获取都要对接口参数做特殊处理后再加密签名,才有接口权限,比如小程序API里面的多媒体接口(上传,下载等),支付接口,统一下单接口等。下面直接上代码

    /**
     * MD5 加密,转为指定类型
     *
     * @param text
     * @param key
     * @param input_charset
     * @return
     */
    public static String sign(String text, String key, String input_charset) {
        text = text + key;
        return DigestUtils.md5Hex(getContentBytes(text, input_charset));
    }

    /**
     * SHA-1 加密,转为指定类型
     *
     * @param text
     * @param input_charset
     * @return
     */
    public static String signBySHA(String text, String input_charset) {
        String signature = null;
        try {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(text.getBytes(input_charset));
            signature = byteToHex(crypt.digest());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("SHA-1签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + input_charset);
        }
        return signature;
    }
    //十六进制字节数组转为字符串
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash) {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }
    /**
     * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符
     * @param params 需要排序并参与字符拼接的参数组
     * @return 拼接后字符串
     */
    public static String createLinkString(Map<String, String> params) {
        List<String> keys = new ArrayList<String>(params.keySet());
        Collections.sort(keys);
        String preStr = "";

        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            String value = params.get(key);
            if ("sign".equals(key)) {
                continue;
            }
            if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符
                preStr = preStr + key + "=" + value;
            } else {
                preStr = preStr + key + "=" + value + "&";
            }
        }
        return preStr;
    }

下面通过main方法测试上面的签名参数的处理以及签名参数的加密

    public static void main(String args[]) {
        Map map = new HashMap();
        map.put("method", "");
        map.put("username", "");
        map.put("password", "");
        String str = createLinkString(map) + "";
        String sign = signBySHA(str, "UTF-8").toLowerCase();//SHA-1方式加密签名
        System.out.println(sign);
    }

欢迎广大开发者一起交流学习,笔者电话微信18629374628

猜你喜欢

转载自blog.csdn.net/guobinhui/article/details/85047526