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("<xml>").append("\n");
|
builder.append("<appid>").append(requestData.getAppid()).append("</appid>").append("\n");
|
builder.append("<mch_id>").append(requestData.getMch_id()).append("</mch_id>").append("\n");
|
builder.append("<device_info>").append(requestData.getDevice_info()).append("</device_info>").append("\n");
|
builder.append("<nonce_str>").append(requestData.getNonce_str()).append("</nonce_str>").append("\n");
|
builder.append("<sign>").append(requestData.getSign()).append("</sign>").append("\n");
|
builder.append("<body>").append(requestData.getBody()).append("</body>").append("\n");
|
builder.append("<detail>").append(requestData.getDetail()).append("</detail>").append("\n");
|
builder.append("<attach>").append(requestData.getAttach()).append("</attach>").append("\n");
|
builder.append("<out_trade_no>").append(requestData.getOut_trade_no()).append("</out_trade_no>").append("\n");
|
builder.append("<fee_type>").append(requestData.getFee_type()).append("</fee_type>").append("\n");
|
builder.append("<total_fee>").append(requestData.getTotal_fee()).append("</total_fee>").append("\n");
|
builder.append("<spbill_create_ip>").append(requestData.getSpbill_create_ip()).append("</spbill_create_ip>").append("\n");
|
builder.append("<time_start>").append(requestData.getTime_start()).append("</time_start>").append("\n");
|
builder.append("<time_expire>").append(requestData.getTime_expire()).append("</time_expire>").append("\n");
|
builder.append("<goods_tag>").append(requestData.getGoods_tag()).append("</goods_tag>").append("\n");
|
builder.append("<notify_url>").append(requestData.getNotify_url()).append("</notify_url>").append("\n");
|
builder.append("<trade_type>").append(requestData.getTrade_type()).append("</trade_type>").append("\n");
|
builder.append("<product_id>").append(requestData.getProduct_id()).append("</product_id>").append("\n");
|
builder.append("<limit_pay>").append(requestData.getLimit_pay()).append("</limit_pay>").append("\n");
|
builder.append("<openid>").append(requestData.getOpenid()).append("</openid>").append("\n");
|
builder.append("</xml>");
|
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<String, String> map = new HashMap<String, String>();
|
try {
|
ByteArrayInputStream xml = new ByteArrayInputStream(jsonStr.getBytes("UTF-8"));
|
|
// 读取输入流
|
SAXReader reader = new SAXReader();
|
Document document = reader.read(xml);
|
// 得到xml根元素
|
Element root = document.getRootElement();
|
// 得到根元素的所有子节点
|
List<Element> 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<String, String> parseXml(HttpServletRequest request) {
|
// 将解析结果存储在HashMap中
|
Map<String, String> map = new HashMap<String, String>();
|
// 从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<Element> 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("<![CDATA[");
|
writer.write(text);
|
writer.write("]]>");
|
} else {
|
writer.write(text);
|
}
|
}
|
};
|
}
|
});
|
|
public static void main(String[] args) throws Exception{
|
String xml1 = "<xml><appid><![CDATA[wx2421b1c4370ec43b]]></appid><attach><![CDATA[支付测试]]></attach><bank_type><![CDATA[CFT]]></bank_type><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[Y]]></is_subscribe><mch_id><![CDATA[10000100]]></mch_id><nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str><openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid><out_trade_no><![CDATA[1409811653]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code><return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign><sub_mch_id><![CDATA[10000100]]></sub_mch_id><time_end><![CDATA[20140903131540]]></time_end><total_fee>1</total_fee><trade_type><![CDATA[JSAPI]]></trade_type><transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id></xml>";
|
ByteArrayInputStream xml = new ByteArrayInputStream(xml1.getBytes("UTF-8"));
|
|
Map<String, String> paramMap = new HashMap<String, String>();
|
// 读取输入流
|
SAXReader reader = new SAXReader();
|
Document document = reader.read(xml);
|
System.out.println("requestXml------------------>"+document.asXML());
|
// 得到xml根元素
|
Element root = document.getRootElement();
|
// 得到根元素的所有子节点
|
List<Element> 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);
|
|
}
|
|
|
}
|