Java後臺微信支付簽名演算法(MD5)
阿新 • • 發佈:2018-12-07
微信支付提交訂單的時候,一直返回簽名錯誤的問題。
主要點在於:
1、所有引數,不能有中文、特殊字元
2、所有需要提交的引數,除了sign之外都需要參與簽名演算法
3、所有引數的參與順序,需要排序(按照accsii升序排序)
附上簽名演算法:
/** * 微信支付簽名演算法sign * @param parameters * @return */ public static String createSign(SortedMap<String,Object> parameters){ StringBuffer sb = new StringBuffer(); Set es = parameters.entrySet();//所有參與傳參的引數按照accsii排序(升序) Iterator it = es.iterator(); while(it.hasNext()) { Map.Entry entry = (Map.Entry)it.next(); String k = (String)entry.getKey(); Object v = entry.getValue(); if(null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) { sb.append(k + "=" + v + "&"); } } sb.append("key=" + //這裡是商戶那裡設定的key); System.out.println("簽名字串:"+sb.toString()); // System.out.println("簽名MD5未變大寫:" + MD5Util.MD5Encode(sb.toString(), characterEncoding)); String sign = md5Password(sb.toString()).toUpperCase(); return sign; } /** * 生成32位md5碼 * * @param key * @return */ public static String md5Password(String key) { char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; try { byte[] btInput = key.getBytes(); // 獲得MD5摘要演算法的 MessageDigest 物件 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的位元組更新摘要 mdInst.update(btInput); // 獲得密文 byte[] md = mdInst.digest(); // 把密文轉換成十六進位制的字串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { return null; } }