微信支付java版V3驗(yàn)證數(shù)據(jù)合法性(Deom)
1.1 解析微信回調(diào)數(shù)據(jù)
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(); /** 獲取微信調(diào)用notify_url的返回XML信息 */ String result = new String(outSteam.toByteArray(), "utf-8");
result結(jié)果就是微信回調(diào)返回的XML數(shù)據(jù)。
1.2 解析微信返回的XML數(shù)據(jù)
/** * 傳入微信回調(diào)返回的XML信息 * 以Map形式返回便于取值 * dom4j解析XML,返回第一級(jí)元素鍵值對(duì)。如果第一級(jí)元素有子節(jié)點(diǎn),則此節(jié)點(diǎn)的值為空 * @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格式數(shù)據(jù),取值以smap.get("字段名")來(lái)獲取數(shù)據(jù)。
1.3 驗(yàn)證微信返回簽名的合法性
/** * 是否微信V3簽名,規(guī)則是:按參數(shù)名稱a-z排序,遇到空值的參數(shù)不參加簽名 * 傳入微信返回信息解析后的SortedMap格式參數(shù)數(shù)據(jù) * 驗(yàn)證消息是否是微信發(fā)出的合法消息 * @param smap * @param apiKey 設(shè)置的密鑰 * @return 驗(yàn)證結(jié)果 */ @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); /** 驗(yàn)證的簽名 */ String sign = MD5Util.MD5Encode(sb.toString(), "utf-8").toUpperCase(); /** 微信端返回的合法簽名 */ String validSign = ((String) smap.get("sign")).toUpperCase(); return validSign.equals(sign); }
個(gè)人建議:驗(yàn)證微信簽名合法性之前可以先判斷微信返回的return_code和result_code是不是SUCCESS。
以上所述是小編給大家介紹的微信支付java版V3驗(yàn)證數(shù)據(jù)合法性(Deom),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- java實(shí)現(xiàn) 微博登錄、微信登錄、qq登錄實(shí)現(xiàn)代碼
- 微信開(kāi)發(fā)之使用java獲取簽名signature
- 微信支付java版本之查詢訂單
- java開(kāi)發(fā)微信分享到朋友圈功能
- java微信開(kāi)發(fā)API第四步 微信自定義個(gè)性化菜單實(shí)現(xiàn)
- java微信開(kāi)發(fā)API第三步 微信獲取以及保存接口調(diào)用憑證
- java微信企業(yè)號(hào)開(kāi)發(fā)之通訊錄
- java微信企業(yè)號(hào)開(kāi)發(fā)之發(fā)送消息(文本、圖片、語(yǔ)音)
- 微信 java 實(shí)現(xiàn)js-sdk 圖片上傳下載完整流程
相關(guān)文章
spring boot 監(jiān)聽(tīng)容器啟動(dòng)代碼實(shí)例
這篇文章主要介紹了spring boot 監(jiān)聽(tīng)容器啟動(dòng)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10java打印表格 將ResultSet中的數(shù)據(jù)打印成表格問(wèn)題
這篇文章主要介紹了java打印表格 將ResultSet中的數(shù)據(jù)打印成表格問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Java設(shè)計(jì)模式之Prototype原型模式
這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之Prototype原型模式的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03SpringBoot集成kafka全面實(shí)戰(zhàn)記錄
在實(shí)際開(kāi)發(fā)中,我們可能有這樣的需求,應(yīng)用A從TopicA獲取到消息,經(jīng)過(guò)處理后轉(zhuǎn)發(fā)到TopicB,再由應(yīng)用B監(jiān)聽(tīng)處理消息,即一個(gè)應(yīng)用處理完成后將該消息轉(zhuǎn)發(fā)至其他應(yīng)用,完成消息的轉(zhuǎn)發(fā),這篇文章主要介紹了SpringBoot集成kafka全面實(shí)戰(zhàn),需要的朋友可以參考下2021-11-11詳解JAVA使用Comparator接口實(shí)現(xiàn)自定義排序
這篇文章主要介紹了JAVA使用Comparator接口實(shí)現(xiàn)自定義排序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03詳解Java如何判斷ResultSet結(jié)果集是否為空
ResultSet 表示 select 語(yǔ)句的查詢結(jié)果集。這篇文章主要為大家詳細(xì)介紹了Java如何判斷ResultSet結(jié)果集是否為空,感興趣的可以了解一下2023-02-02基于SpringBoot集成測(cè)試遠(yuǎn)程連接Redis服務(wù)的教程詳解
這篇文章主要介紹了基于SpringBoot集成測(cè)試遠(yuǎn)程連接的Redis服務(wù)的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Java Base64算法實(shí)際應(yīng)用之郵件發(fā)送實(shí)例分析
這篇文章主要介紹了Java Base64算法實(shí)際應(yīng)用之郵件發(fā)送,結(jié)合實(shí)例形式分析了java字符編碼與郵件發(fā)送相關(guān)操作技巧,需要的朋友可以參考下2019-09-09IntelliJ IDEA像Eclipse一樣打開(kāi)多個(gè)項(xiàng)目的圖文教程
這篇文章主要介紹了IntelliJ IDEA像Eclipse一樣打開(kāi)多個(gè)項(xiàng)目的方法圖文教程講解,需要的朋友可以參考下2018-03-03