package cn.ksource.web.controller.wxpay.util; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.Writer; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import cn.ksource.core.util.ConvertUtil; import cn.ksource.core.util.JsonUtil; import cn.ksource.core.util.StringUtil; import cn.ksource.web.controller.wxpay.paybean.RequestData; import cn.ksource.web.controller.wxpay.paybean.ResponseMsg; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.core.util.QuickWriter; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; import com.thoughtworks.xstream.io.xml.XppDriver; public class CommonUtil { /** * 元转换成分 * @param money * @return */ public static String getMoney(String amount) { if(amount==null){ return ""; } // 金额转化为分为单位 String currency = amount.replaceAll("\\$|\\¥|\\,", ""); //处理包含, ¥ 或者$的金额 int index = currency.indexOf("."); int length = currency.length(); Long amLong = 0l; if(index == -1){ amLong = Long.valueOf(currency+"00"); }else if(length - index >= 3){ amLong = Long.valueOf((currency.substring(0, index+3)).replace(".", "")); }else if(length - index == 2){ amLong = Long.valueOf((currency.substring(0, index+2)).replace(".", "")+0); }else{ amLong = Long.valueOf((currency.substring(0, index+1)).replace(".", "")+"00"); } return amLong.toString(); } public static String toXML(RequestData requestData) { StringBuilder builder = new StringBuilder("").append("\n"); builder.append("").append(requestData.getAppid()).append("").append("\n"); builder.append("").append(requestData.getMch_id()).append("").append("\n"); builder.append("").append(requestData.getDevice_info()).append("").append("\n"); builder.append("").append(requestData.getNonce_str()).append("").append("\n"); builder.append("").append(requestData.getSign()).append("").append("\n"); builder.append("").append(requestData.getBody()).append("").append("\n"); builder.append("").append(requestData.getDetail()).append("").append("\n"); builder.append("").append(requestData.getAttach()).append("").append("\n"); builder.append("").append(requestData.getOut_trade_no()).append("").append("\n"); builder.append("").append(requestData.getFee_type()).append("").append("\n"); builder.append("").append(requestData.getTotal_fee()).append("").append("\n"); builder.append("").append(requestData.getSpbill_create_ip()).append("").append("\n"); builder.append("").append(requestData.getTime_start()).append("").append("\n"); builder.append("").append(requestData.getTime_expire()).append("").append("\n"); builder.append("").append(requestData.getGoods_tag()).append("").append("\n"); builder.append("").append(requestData.getNotify_url()).append("").append("\n"); builder.append("").append(requestData.getTrade_type()).append("").append("\n"); builder.append("").append(requestData.getProduct_id()).append("").append("\n"); builder.append("").append(requestData.getLimit_pay()).append("").append("\n"); builder.append("").append(requestData.getOpenid()).append("").append("\n"); builder.append(""); return builder.toString(); } /** * getCodeUrl */ public static String codeUrl(String jsonStr) { String code_url = new String(); if(jsonStr.indexOf("FAIL")!=-1){ return code_url; } Map map = xmlToMap(jsonStr); System.out.println(JsonUtil.map2Json(map)); code_url = (String) map.get("code_url"); return code_url; } private static Map xmlToMap(String jsonStr) { // 将解析结果存储在HashMap中 Map map = new HashMap(); try { ByteArrayInputStream xml = new ByteArrayInputStream(jsonStr.getBytes("UTF-8")); // 读取输入流 SAXReader reader = new SAXReader(); Document document = reader.read(xml); // 得到xml根元素 Element root = document.getRootElement(); // 得到根元素的所有子节点 List elementList = root.elements(); // 遍历所有子节点 for (Element e : elementList) { map.put(e.getName(), e.getText()); } } catch (Exception e) { } return map; } /** * 解析微信支付异步返回的结果 * * @param request * @return * @throws Exception */ public static Map parseXml(HttpServletRequest request) { // 将解析结果存储在HashMap中 Map map = new HashMap(); // 从request中取得输入流 try { InputStream inputStream = request.getInputStream(); // 读取输入流 SAXReader reader = new SAXReader(); Document document = reader.read(inputStream); System.out.println("requestXml------------------>"+document.asXML()); // 得到xml根元素 Element root = document.getRootElement(); // 得到根元素的所有子节点 List elementList = root.elements(); // 遍历所有子节点 for (Element e : elementList) { map.put(e.getName(), e.getText()); } // 释放资源 inputStream.close(); inputStream = null; } catch (Exception e) { // TODO: handle exception } return map; } /** * 回复消息对象转换成xml * * @param textMessage 文本消息对象 * @return xml */ public static String msgToXml(ResponseMsg msg) { xstream.alias("xml", msg.getClass()); String xml = xstream.toXML(msg); xml = xml.replaceAll("#", "_"); return xml; } /** * 扩展xstream,使其支持CDATA块 * * @date 2013-05-19 */ private static XStream xstream = new XStream(new XppDriver() { public HierarchicalStreamWriter createWriter(Writer out) { return new PrettyPrintWriter(out) { // 对所有xml节点的转换都增加CDATA标记 boolean cdata = true; @SuppressWarnings("unchecked") public void startNode(String name, Class clazz) { if(name.contains("_")) { name = name.replaceAll("_", "#"); } super.startNode(name, clazz); } protected void writeText(QuickWriter writer, String text) { if (cdata) { writer.write(""); } else { writer.write(text); } } }; } }); public static void main(String[] args) throws Exception{ String xml1 = "1"; ByteArrayInputStream xml = new ByteArrayInputStream(xml1.getBytes("UTF-8")); Map paramMap = new HashMap(); // 读取输入流 SAXReader reader = new SAXReader(); Document document = reader.read(xml); System.out.println("requestXml------------------>"+document.asXML()); // 得到xml根元素 Element root = document.getRootElement(); // 得到根元素的所有子节点 List elementList = root.elements(); // 遍历所有子节点 for (Element e : elementList) { paramMap.put(e.getName(), e.getText()); } String resultCode = ConvertUtil.obj2StrBlank(paramMap.get("return_code")); String return_msg = new String(); if(StringUtil.notEmpty(resultCode) && resultCode.equals("SUCCESS")) { //微信支付交易号 String trade_no = ConvertUtil.obj2StrBlank(paramMap.get("transaction_id")); String out_trade_no = ConvertUtil.obj2StrBlank(paramMap.get("out_trade_no")); String extra_common_param = ConvertUtil.obj2StrBlank(paramMap.get("attach")); System.out.println("trade_no-------------------->"+trade_no); System.out.println("out_trade_no-------------------->"+out_trade_no); System.out.println("extra_common_param-------------------->"+extra_common_param); return_msg = "OK"; } ResponseMsg responseMsg = new ResponseMsg(resultCode,return_msg); String responseMsgText = CommonUtil.msgToXml(responseMsg); System.out.println("responseMsgText------------------->"+responseMsgText); } }