1.1 解析微信回調數據
1
2
3
4
5
6
7
8
9
10
11
|
InputStream inStream = request.getInputStream(); ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte [] buffer = new byte [ 1024 ]; int len = 0 ; while ((len = inStream.read(buffer)) != - 1 ) { outSteam.write(buffer, 0 , len); } outSteam.close(); inStream.close(); /** 獲取微信調用notify_url的返回XML信息 */ String result = new String(outSteam.toByteArray(), "utf-8" ); |
result結果就是微信回調返回的XML數據。
1.2 解析微信返回的XML數據
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/** * 傳入微信回調返回的XML信息 * 以Map形式返回便于取值 * dom4j解析XML,返回第一級元素鍵值對。如果第一級元素有子節點,則此節點的值為空 * @param strXML * @return * @throws DocumentException */ @SuppressWarnings ( "rawtypes" ) public static SortedMap<String, String> dom4jXMLParse(String strXML) throws DocumentException { SortedMap<String, String> smap = new TreeMap<String, String>(); Document doc = DocumentHelper.parseText(strXML); Element root = doc.getRootElement(); for (Iterator iterator = root.elementIterator(); iterator.hasNext();) { Element e = (Element) iterator.next(); smap.put(e.getName(), e.getText()); } return smap; } |
返回的是有序的Map格式數據,取值以smap.get("字段名")來獲取數據。
1.3 驗證微信返回簽名的合法性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/** * 是否微信V3簽名,規則是:按參數名稱a-z排序,遇到空值的參數不參加簽名 * 傳入微信返回信息解析后的SortedMap格式參數數據 * 驗證消息是否是微信發出的合法消息 * @param smap * @param apiKey 設置的密鑰 * @return 驗證結果 */ @SuppressWarnings ( "rawtypes" ) public static boolean isWechatSign(SortedMap<String, String> smap,String apiKey) { StringBuffer sb = new StringBuffer(); Set es = smap.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); if (! "sign" .equals(k) && null != v && ! "" .equals(v) && ! "key" .equals(k)) { sb.append(k + "=" + v + "&" ); } } sb.append( "key=" + apiKey); /** 驗證的簽名 */ String sign = MD5Util.MD5Encode(sb.toString(), "utf-8" ).toUpperCase(); /** 微信端返回的合法簽名 */ String validSign = ((String) smap.get( "sign" )).toUpperCase(); return validSign.equals(sign); } |
個人建議:驗證微信簽名合法性之前可以先判斷微信返回的return_code和result_code是不是SUCCESS。
以上所述是小編給大家介紹的微信支付java版V3驗證數據合法性(Deom),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.cnblogs.com/solang/archive/2016/09/19/5884835.html