• 微信支付之SHA256签名失败


    在接微信支付的时候,或多或少会遇到签名失败,本人接入的时候也遇了不少次:

    总结如下:

       1、参数没有经过ASCII排序

       2、参数包含中文未经过UTF-8标准转化加密后的签名不对应(经本人测验:加密算法要对中文进行utf-8)

    生成签名:

      

     /**
         * 生成签名
         * @param str         要签名的字段
         * @param signType    签名类型
         * @return
         */
        public static String toSign(StringBuffer str, String signType) {
            StringBuffer sb = str.append("&key=").append("商户的唯一KEY");
            String sign = null;
            sign = new String(sb.toString());
            LOG.info("生成对象成功: {}", sign);
            if (Constants.MD5.equals(signType)) {
                return MD5Utils.MD5Encode(sign).toUpperCase();
            }
            return ShA256Utils.sha256_HMAC(sign, "商户在公众平台的唯一KEY").toUpperCase();
        }
     /**
         * sha256_HMAC加密
         * @param message 消息
         * @param secret  秘钥
         * @return 加密后字符串
         */
        public static String sha256_HMAC(String message, String secret) {
            String hash = "";
            try {
                Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
                SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
                sha256_HMAC.init(secret_key);
           //对消息进行UTF-8转化 为了防止中文加密与微信的算法不匹配
    byte[] bytes = sha256_HMAC.doFinal(message.getBytes("UTF-8")); hash = byteArrayToHexString(bytes); System.out.println(hash); } catch (Exception e) { System.out.println("Error HmacSHA256 ===========" + e.getMessage()); } System.out.println("Sha256 生成结果:" + hash); return hash; }
     /**
         * MD5编码
         * @param origin 原始字符串
         * @return 经过MD5加密之后的结果
         */
        public static String MD5Encode(String origin) {
            String resultString = null;
            try {
                resultString = origin;
                MessageDigest md = MessageDigest.getInstance("MD5");
           //MD5也要加密 md.update(resultString.getBytes(
    "UTF-8")); resultString = byteArrayToHexString(md.digest()); } catch (Exception e) { e.printStackTrace(); } System.out.println("MD5 生成结果:" + resultString); return resultString; }

    原文:https://choviwu.top/archives/wxPayDemo

  • 相关阅读:
    当别人疑惑时你坚定
    如何设置mvc的role和user
    在项目中添加引用的意思
    vs的使用技巧
    无法删除表实体的问题
    JavaScriptSerializer类
    统计代码行数&&遍历jQuery
    远程调用
    select、验证
    委托和事件的区别
  • 原文地址:https://www.cnblogs.com/ChoviWu/p/10254107.html
Copyright © 2020-2023  润新知