在接微信支付的時候,或多或少會遇到簽名失敗,本人接入的時候也遇了很多次:算法
總結以下:微信
一、參數沒有通過ASCII排序app
二、參數包含中文未通過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加密