1. 程式人生 > >微信支付之SHA256簽名失敗

微信支付之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