微信支付提交訂單的時候,一直返回簽名錯誤的問題。git
主要點在於:算法
一、全部參數,不能有中文、特殊字符微信
二、全部須要提交的參數,除了sign以外都須要參與簽名算法app
三、全部參數的參與順序,須要排序(按照accsii升序排序)微信支付
附上簽名算法:code
/** * 微信支付簽名算法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; } }