1. 程式人生 > >微信支付回撥驗證簽名java版V3

微信支付回撥驗證簽名java版V3

微信支付java版V3驗證資料合法性

概要:使用微信支付介面時,微信會返回或回撥給商戶XML資料,開發者需要驗證微信返回的資料是否合法。

特別提醒:商戶系統對於支付結果通知的內容一定要做簽名驗證,防止資料洩漏導致出現“假通知”,造成資金損失。

1.解析微信回撥資料

 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資料。

2.解析微信返回的XML資料

 /**
  * 傳入微信回撥返回的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(“欄位名”)來獲取資料。

3.驗證微信返回簽名的合法性

 /**
  * 是否微信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。