签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
- ◆ 参数名ASCII码从小到大排序(字典序);
- ◆ 如果参数的值为空不参与签名;
- ◆ 参数名区分大小写;
- ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
- ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
public static void main(String[] args) { SortedMap<Object,Object> parameters = new TreeMap<Object,Object>(); //String mfrchant_id="fffff"; String merchant_id="190010002"; String business_type="1005"; String out_trade_no="1400000001"; String key="3A4BC4A4000CF1B5FFA9E351E6C1539E"; //parameters.put("mfrchant_id", mfrchant_id); parameters.put("merchant_id", merchant_id); parameters.put("business_type", business_type); parameters.put("out_trade_no",out_trade_no); String characterEncoding = "UTF-8"; //指定字符集UTF-8 String mySign = createSign(characterEncoding,parameters,key); //System.out.println("我 的签名是:"+mySign); }
public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters,String key){ StringBuffer sb = new StringBuffer(); StringBuffer sbkey = 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)) { sb.append(k + "=" + v + "&"); sbkey.append(k + "=" + v + "&"); } } //System.out.println("字符串:"+sb.toString()); sbkey=sbkey.append("key="+key); System.out.println("字符串:"+sbkey.toString()); //MD5加密,结果转换为大写字符 String sign = MD5Util.MD5Encode(sbkey.toString(), characterEncoding).toUpperCase(); System.out.println("MD5加密值:"+sign); return sb.toString()+"sign="+sign; }