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);
}
}