package com.platform.controller.wxpay;

import java.io.*;
import java.math.BigDecimal;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.annotation.Resource;
import javax.crypto.spec.SecretKeySpec;
import javax.mail.event.FolderAdapter;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.platform.response.xml.*;
import com.platform.util.wxrefund.WXBizMsgCrypt;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.platform.util.*;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.platform.util.wxrefund.Base64Util;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
import org.xml.sax.InputSource;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.platform.dao.WxAccountDetilMapper;
import com.platform.dao.WxRecordMapper;
import com.platform.pojo.Epay;
import com.platform.pojo.InterfaceInvokeLog;
import com.platform.pojo.TransactionJournal;
import com.platform.pojo.WxAccountDetil;
import com.platform.pojo.WxPay;
import com.platform.pojo.WxRecord;
import com.platform.pojo.WxTransactionJournal;
import com.platform.pojo.WxpayConfig;
import com.platform.pojo.WxpayConfigExample;
import com.platform.request.xml.RequestParameter;
import com.platform.request.xml.RequestParameterForEpay;
import com.platform.request.xml.WxRequestParameter;
import com.platform.request.xml.WxRequestParameterForWxpay;
import com.platform.response.xml.WxResponseParameter;
import com.platform.service.WPayService;
import com.platform.service.WxAccountDetilService;
import com.platform.service.WxRecordService;
import com.platform.util.ClassUtil;
import com.platform.util.ConstantsUtil;
import com.platform.util.DateUtil;
import com.platform.util.EpayMD5;
import com.platform.util.HttpUtil;
import com.platform.util.JSONUtil;
import com.platform.util.JaxbUtil;
import com.platform.util.PayForUtil;
import com.platform.util.QRCodeUtil;
import com.platform.util.WXPayUtil;
import com.platform.util.WebToolUtils;
import com.platform.util.WxHttpUtil;
import com.platform.util.XMLUtil;
import com.platform.util.Xml2JsonUtil;
import com.platform.util.StrKit;
import net.sf.json.JSONObject;
import javax.net.ssl.SSLContext;
import java.security.Security;
import com.platform.util.wxrefund.AESUtil;

/**
 * @ClassName: WxpayXmlController
 * @Description: TODO(微信扫码付WxPay对接类)
 * @author lyp
 * @date 2017年8月28日 上午8:21:53
 * 
 */
@Controller
@RequestMapping("/wxpayxml")
public class WxpayXmlController {
	// 定义日志文件操作类对象
	private static Logger logger = (Logger) LoggerFactory.getLogger(WxpayXmlController.class);
	@Resource
	private WPayService wPayService;
	@Resource
	private WxAccountDetilService wxAccountDetilService;
	@Resource
	private WxRecordService wxRecordService;
	List<WxpayConfig> wxpayConfigs = new ArrayList<WxpayConfig>();
	WxpayConfigExample example = new WxpayConfigExample();
	WxRequestParameter requestParameter = new WxRequestParameter();

	/**
	 * 
	 * @Title: wPay @Description: TODO(微信支付下单接口) @param @param
	 *         requestParameter @param @return 设定文件 @return String 返回类型 @throws
	 */
	@RequestMapping(value = "/wPay", consumes = "application/xml", method = RequestMethod.POST)
	@ResponseBody
	public String wPay(@RequestBody WxRequestParameter requestParameter) {
		logger.debug("###############################################################执行微信支付扫码下单接口wPay方法");
		logger.debug("###################################################接收到的body值：" + requestParameter);
		String str = null;
		String resXML = null;
		String errorString = null;
		// 将返回的XML结果封装处理成接口调用日志Java类对象
		XmlMapper xmlMapper = new XmlMapper();
		ObjectMapper mapper = new ObjectMapper(); // 转换器
		logger.debug("##########################################################读取微信支付配置表开始");
		example.or().andDeleteFlagEqualTo(0);
		wxpayConfigs = wPayService.getConfigList1(example);
		logger.debug("#########################################获取到的支付配置表数据记录条数" + wxpayConfigs.size());
		if (wxpayConfigs.size() == 0) {
			errorString = "支付配置表没有配置！";
			resXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
					+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
			logger.debug("支付配置表没有配置");
		} else if (wxpayConfigs.size() == 1) {
			logger.debug("#########################################################获取到的支付配置表唯一一条记录，支付开始");
			// 全局DeserializationFeature配置：配置该objectMapper在反序列化时，忽略目标对象没有的属性。凡是使用该objectMapper反序列化时，都会拥有该特性。
			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
			// 将传入的Java类转换为集合
			try {
				SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
				packageParams.put("appid", wxpayConfigs.get(0).getAppId());
				packageParams.put("mch_id", wxpayConfigs.get(0).getMchId());
				packageParams.put("nonce_str", WXPayUtil.generateNonceStr());
				packageParams.put("body", requestParameter.getBody());
				packageParams.put("out_trade_no", requestParameter.getOut_trade_no());
				packageParams.put("total_fee", (requestParameter.getTotal_fee()));
				packageParams.put("spbill_create_ip", WXPayUtil.localip());
				packageParams.put("notify_url", wxpayConfigs.get(0).getPayNotifyUrl());
				packageParams.put("trade_type", requestParameter.getTrade_type());
				String sign = PayForUtil.createSign("UTF-8", packageParams, wxpayConfigs.get(0).getSignKey());
				logger.debug("#####################获取到的支付配置表中设定的API密钥为："+wxpayConfigs.get(0).getSignKey());
				logger.debug("#####################################################根据入参拼接API密钥生成的签名为："+sign);
				packageParams.put("sign", sign);
				String requestXML = PayForUtil.getRequestXml(packageParams);
				System.out.println(requestXML);
				resXML = WxHttpUtil.postData(wxpayConfigs.get(0).getPayGateUrl(), requestXML);
				logger.debug("#######################################执行HTTP POST 请求后得到的XML返回结果：" + resXML);
				if (null == resXML || "".equals(resXML)) {
					errorString = "接口异常！返回数据为空，请检查接口是否可用；接口地址：" + ConstantsUtil.WX_PAY_GATE_URL;
					resXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "fail"
							+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
					logger.debug("############################################################" + errorString);
				} else {
					try {
						// 字符串转换成map集合
						Map map = XMLUtil.doXMLParse(resXML);
						WxResponseParameterForInsert responseParameterForQrCode = new WxResponseParameterForInsert();
						// 获取二维码内容地址
						String qr_url = (String) map.get("code_url");
						logger.debug("######################################获取到的二维码内容地址" + qr_url);
						// 设定二维码图片存放目录地址
						String folderPath = getWebappsURL() + File.separator + "uploadimeges" + File.separator
								+ "qrcode" + File.separator + "wxpay" + File.separator + "mb" + File.separator
								+ DateUtil.format(new Date(), "yyyyMMdd");
						logger.debug("######################################设定二维码图片存放目录地址" + folderPath);
						String ip = "";
						String code_url = "";
						ip = WebToolUtils.getLocalIP();// 获得本机IP
						logger.debug("#############################################获得本机IP" + ip);
						WxResponseParameterForInsert responseParameterForInsert = new WxResponseParameterForInsert();
						// 重新生成二维码图片
						String fileName = QRCodeUtil.encode(qr_url, folderPath, false);
						code_url = "http://" + ip + ":" + ConstantsUtil.TOMCAT_PORT_WXALIPAY + File.separator
								+ "uploadimeges" + File.separator + "qrcode" + File.separator + "wxpay" + File.separator
								+ "mb" + File.separator + DateUtil.format(new Date(), "yyyyMMdd") + File.separator
								+ fileName;
						code_url = code_url.replace("\\", "/");
						logger.debug("######################################重新生成的二维码图片地址" + code_url);
						responseParameterForQrCode.setCode_url(code_url);
						WxResponseParameterForQrCode responseParameterForQrCode2 = new WxResponseParameterForQrCode();
						responseParameterForQrCode2.setAppid((String) map.get("appid"));
						responseParameterForQrCode2.setMch_id((String) map.get("mch_id"));
						// responseParameterForQrCode2.setNonce_str((String)
						// map.get("nonce_str"));
						// responseParameterForQrCode2.setSign((String)
						// map.get("sign"));
						responseParameterForQrCode2.setResult_code((String) map.get("result_code"));
						responseParameterForQrCode2.setReturn_msg((String) map.get("return_msg"));
						responseParameterForQrCode2.setCode_url(responseParameterForQrCode.getCode_url());
						responseParameterForQrCode2.setTrade_type((String) map.get("trade_type"));
						responseParameterForQrCode2.setPrepay_id((String) map.get("prepay_id"));
						// 重新将java对象转换成xml字符串
						resXML = JaxbUtil.convertToXml(responseParameterForQrCode2);
						logger.debug("######################################重新将java对象转换成xml字符串：" + resXML);
						responseParameterForInsert = xmlMapper.readValue(resXML, WxResponseParameterForInsert.class);
						logger.debug("############################XML结果封装处理成接口调用成功，日志Java类对象为："
								+ responseParameterForInsert);
						// 声明日志插入结果对象
						InterfaceInvokeLog record = new InterfaceInvokeLog();
						// 基础赋值
						record.setMachineIp(requestParameter.getMachine_ip());
						record.setMachineNo(requestParameter.getMachine_no());
						record.setMachineName(requestParameter.getMachine_name());
						record.setMachineType(requestParameter.getMachine_type());
						record.setInvokeTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
						record.setInvokeType("1");// 调用类型：1-支付 2-退款 3-查询 4-支付回调
													// 5-退款回调 99-其他
						record.setTradeChannel("3");// 交易渠道：1-百合易付 2-支付宝 3-微信
													// 99-其他
						record.setService("unifiedorder_service");
						record.setServiceVersion("2.0");
						record.setInputCharset("UTF-8");
						// 对象赋值操作
						record.setAppid(wxpayConfigs.get(0).getAppId());
						record.setMchId(wxpayConfigs.get(0).getMchId());
						record.setRetcode((String) map.get("return_code"));
						record.setTransactionId((String) map.get("transaction_id"));
						record.setOutTradeNo((String) map.get("out_trade_no"));
						record.setCodeUrl((String) map.get("code_url"));
						record.setQrUrl((String) map.get("code_url"));
						record.setSign((String) map.get("sign"));
						record.setSignType("MD5");
						record.setRetmsg((String) map.get("return_msg"));
						record.setQrUrl(responseParameterForInsert.getQr_url());
						// 调用service，插入对象
						logger.debug("####################################################调用service，插入日志表对象开始");
						int num = wPayService.saveInvokeLog(record);
						logger.debug("######################################调用service，插入日志表对象结束，影响条数：" + num);
					} catch (JsonParseException e) {
						logger.debug("##################XML结果封装处理成接口调用日志Java类对象失败，Json解析出错：" + e.toString());
						e.printStackTrace();
					} catch (JsonMappingException e) {
						logger.debug("##################XML结果封装处理成接口调用日志Java类对象失败，Json映射出错：" + e.toString());
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						logger.debug("###################XML结果封装处理成接口调用日志Java类对象失败，流出错：" + e.toString());
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						logger.debug("######################################二维码图片生成失败，异常结果：" + e.toString());
					}
				}
			} catch (JSONException e) {
				errorString = "数据转换错误(JSONException)！";
				resXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
						+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
				logger.debug("################################################################数据转换错误(JSONException)："
						+ e.toString());
			} catch (Exception e) {
				errorString = "流异常(IOException)！";
				resXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
						+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
				logger.debug("#######################################################################流异常(IOException)："
						+ e.toString());
			}
		} else {
			errorString = "支付配置表存在多条记录！";
			resXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
					+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
			logger.debug("################################################################################支付配置表存在多条记录");
		}
		logger.debug("#######################################################################执行微信支付下单接口pay方法结束");
		return resXML;
	}

	/**
	 * 
	 * @Title: paynotify @Description: TODO(微信支付异步通知接口) @param @param
	 *         responseParameter @param @param response @param @return
	 *         设定文件 @return String 返回类型 @throws
	 */
	@RequestMapping(value = "/paynotify")
	public void paynotify(HttpServletRequest request, HttpServletResponse response) {
		logger.debug("#############################################执行微信扫码支付回调方法开始");
		InputStream inputStream;
		StringBuffer sb = new StringBuffer();
		try {
			inputStream = request.getInputStream();
			String s;
			BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
			while ((s = in.readLine()) != null) {
				sb.append(s);
			}
			in.close();
			inputStream.close();
			// 解析xml成map
			Map<String, String> m = new HashMap<String, String>();
			m = XMLUtil.doXMLParse(sb.toString());
			// 过滤空设置TreeMap,扫码
			SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
			Iterator<String> it = m.keySet().iterator();
			while (it.hasNext()) {
				String parameter = it.next();
				String parameterValue = m.get(parameter);
				String v = "";
				if (null != parameterValue) {
					v = parameterValue.trim();
				}
				packageParams.put(parameter, v);
			}
			// 微信支付的api密钥
			String key = ConstantsUtil.WX_SIGN_KEY;
			logger.info("微信支付返回回来的参数：" + packageParams);
			String return_code = (String) packageParams.get("return_code");
			String result_code = (String) packageParams.get("result_code");
			// 判断签名是否正确
			if (PayForUtil.isTenpaySign("UTF-8", packageParams, key)) {
				// -------------------------------
				// 处理业务开始
				// --------------------------
				String resXml = "";
				if (StrKit.notBlank(return_code) && StrKit.notBlank(result_code)
						&& return_code.equalsIgnoreCase("SUCCESS") && result_code.equalsIgnoreCase("SUCCESS")) {
					// 支付成功
					// 执行自己的业务逻辑
					// 声明日志插入结果对象
					InterfaceInvokeLog record = new InterfaceInvokeLog();
					logger.debug(
							"############################################################################声明日志插入结果对象"
									+ record);
					// 基础赋值
					logger.debug(
							"####################################################################################基础赋值操作开始");
					record.setInvokeTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
					record.setInvokeType("4");// 调用类型：1-支付 2-退款 3-查询 4-支付回调
					// 5-退款回调 99-其他
					record.setTradeChannel("3");// 交易渠道：1-百合易付 2-支付宝 3-微信
					// 99-其他
					record.setService("query_order_service");
					record.setServiceVersion("1.0");
					record.setInputCharset("UTF-8");
					record.setSignType(m.get("sign_type"));
					record.setSign(m.get("sign"));
					logger.debug(
							"#################################################################################基础赋值操作结束");
					// 对象赋值操作
					logger.debug(
							"############################################################################日志表对象赋值操作开始");
					record.setRetcode(m.get("return_code"));
					record.setTradeState(m.get("trade_state"));
					record.setOutTradeNo(m.get("out_trade_no"));
					record.setTransactionId(m.get("transaction_id"));
					record.setBankType(m.get("bank_type"));
					if (null != m.get("total_fee")) {
						record.setTotalFee(Float.parseFloat(m.get("total_fee").toString()));
					}
					record.setFeeType(m.get("fee_type"));
					record.setTimeEnd(m.get("time_end"));
					record.setAttach(m.get("attach"));
					logger.debug(
							"###################################################################################日志表对象赋值操作结束");
					// 调用service，插入日志表
					logger.debug(
							"###############################################################################调用service，插入日志表开始");
					int num = wPayService.saveInvokeLog(record);
					logger.debug(
							"#################################################################调用service，插入日志表结束，影响条数："
									+ num);
					/////////////////////////////////////////////////////////////////////////////////////////
					logger.debug(
							"#########################################################################################流水表插入开始");

					WxTransactionJournal transactionJournal = new WxTransactionJournal();
					transactionJournal.setTranType("1");//
					transactionJournal.setTranStatus("1");
					transactionJournal.setAppid((String) packageParams.get("appid"));
					transactionJournal.setMchId((String) packageParams.get("mch_id"));
					transactionJournal.setReturnCode((String) packageParams.get("return_code"));
					transactionJournal.setTradeType((String) packageParams.get("trade_type"));
					transactionJournal.setOutTradeNo((String) packageParams.get("out_trade_no"));
					transactionJournal.setTransactionId((String) packageParams.get("transaction_id"));
					transactionJournal.setBankType((String) packageParams.get("bank_type"));
//					if (null != ((String) packageParams.get("total_fee"))) {
//						BigDecimal bd=new BigDecimal((String) packageParams.get("total_fee"));
//						BigDecimal bd2=new BigDecimal(Double.valueOf(0.01).toString());
//						BigDecimal totleFee=bd.multiply(bd2);
//						Float f=totleFee.floatValue();
//						transactionJournal.setTotalFee(f);
//					}
					
					transactionJournal.setTotalFee(Float.valueOf(packageParams.get("total_fee").toString()));
					transactionJournal.setFeeType((String) packageParams.get("fee_type"));
					transactionJournal.setTimeEnd((String) packageParams.get("time_end"));
					transactionJournal.setAttach((String) packageParams.get("attach"));
					transactionJournal
							.setCreateTime(DateUtil.parseDate(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")));
					logger.debug(
							"###################################################################################流水表对象赋值操作结束");
					// 调用service，插入日志表
					logger.debug(
							"################################################################################调用service，插入日志表开始");
					int num2 = wPayService.saveTransactionJournal(transactionJournal);
					logger.debug(
							"#################################################################调用service，插入日志表结束，影响条数："
									+ num2);
					logger.debug(
							"##########################################################################################流水表插入结束");
					/////////////////////////////////////////////////////////////////////////////////////
					// 执行自己业务逻辑结束
					logger.info("支付成功");
					// 通知微信异步成功不然会一直通知后台八次之后交易失败
					resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
							+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
				} else {
					logger.info("支付失败,错误信息：" + packageParams.get("err_code"));
					resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
							+ "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
				}
				// ------------------------------
				// 处理业务完毕
				// ------------------------------
				BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
				out.write(resXml.getBytes());
				out.flush();
				out.close();
			} else {
				logger.info("通知签名验证失败");
			}

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 *
	 * @Title: refund @Description: TODO(微信退款接口) @param @param
	 *         requestParameter @param @return 设定文件 @return String 返回类型 @throws
	 */
	@RequestMapping(value = "/refund", consumes = "application/xml", method = RequestMethod.POST)
	@ResponseBody
	public Object refund(@RequestBody WxRequestParameter requestParameter) {
		logger.debug("#############################################执行微信支付退款接口refund方法开始");
		logger.debug("###############################################################接收到的body值：" + requestParameter);
		String result = null;
		String resXml = null;
		String str = null;
		String errorString = null;
		logger.debug("#######################################################################读取微信支付配置表开始");
		example.or().andDeleteFlagEqualTo(0);
		wxpayConfigs = wPayService.getConfigList1(example);
		logger.debug("#######################################################获取到的支付配置表数据记录条数" + wxpayConfigs.size());
		if (wxpayConfigs.size() == 0) {
			errorString = "支付配置表没有配置！";
			result = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
					+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
			logger.debug("##############################################################################支付配置表没有配置");
		} else if (wxpayConfigs.size() == 1) {
			ObjectMapper mapper = new ObjectMapper(); // 转换器
			// 全局DeserializationFeature配置：配置该objectMapper在反序列化时，忽略目标对象没有的属性。凡是使用该objectMapper反序列化时，都会拥有该特性。
			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
			logger.debug("==========================微信退款开始!!========================");
			String filePath = ConstantsUtil.WX_CERTIFICATE_LOCATION;// 退款需要提供证书数据，所以需要根据证书路径读取证书
			/*-----  1.生成预支付订单需要的的package数据-----*/
			SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
			packageParams.put("appid", requestParameter.getAppid());
			packageParams.put("mch_id", requestParameter.getMch_id());
			packageParams.put("nonce_str", WXPayUtil.generateNonceStr());
			packageParams.put("out_trade_no", requestParameter.getOut_trade_no());
			packageParams.put("out_refund_no", requestParameter.getOut_refund_no());
			packageParams.put("total_fee", requestParameter.getTotal_fee());
			packageParams.put("refund_fee", requestParameter.getRefund_fee());
			/*----2.根据package生成签名sign---- */
			String sign = PayForUtil.createSign("UTF-8", packageParams, wxpayConfigs.get(0).getSignKey());
			packageParams.put("sign", sign);
			String requestXML = PayForUtil.getRequestXml(packageParams);
			/*----5.发送数据到微信的退款接口---- */
			try {
				resXml = HttpUtil.sendPostUrlBySsl(wxpayConfigs.get(0).getRefundGateUrl(), requestXML, filePath,
						requestParameter.getMch_id());
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if (null == resXml || "".equals(resXml)) {
				errorString = "接口异常！返回数据为空，请检查接口是否可用；接口地址：" + wxpayConfigs.get(0).getRefundGateUrl();
				resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "fail"
						+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
				logger.debug("###########################################################" + errorString);
			} else {
				Map<String, Object> map = new HashMap<String, Object>();
				try {
					map = XMLUtil.doXMLParse(resXml);
				} catch (JDOMException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				// logger.debug("###########################XML结果封装处理成接口调用成功，日志Java类对象为："+responseParameterForInsert);
				// 声明日志插入结果对象
				InterfaceInvokeLog record = new InterfaceInvokeLog();
				// 基础赋值
				record.setMachineIp(requestParameter.getMachine_ip());
				record.setMachineNo(requestParameter.getMachine_no());
				record.setMachineName(requestParameter.getMachine_name());
				record.setMachineType(requestParameter.getMachine_type());
				record.setInvokeTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
				record.setInvokeType("2");// 调用类型：1-支付 2-退款 3-查询 4-支付回调 5-退款回调
											// 99-其他
				record.setTradeChannel("3");// 交易渠道：1-百合易付 2-支付宝 3-微信 99-其他
				// 对象赋值操作
				record.setRetcode((String) map.get("return_code"));
				record.setRetmsg((String) map.get("return_msg"));
				record.setTransactionId((String) map.get("transaction_id"));
				record.setOutRefundNo((String) map.get("out_refund_no"));
				record.setRefundId((String) map.get("refund_id"));
				record.setAppid((String) map.get("appid"));
				record.setMchId((String) map.get("mch_id"));
				record.setNoceStr((String) map.get("noce_str"));
				record.setRefundFee((String) map.get("refund_fee"));
				record.setOutTradeNo((String) map.get("out_trade_no"));
				record.setTimeEnd(DateUtil.Giveformat(new Date()));
				// 调用service，插入对象
				logger.debug("################################################################调用service，插入日志表对象开始");
				int num = wPayService.saveInvokeLog(record);
				logger.debug("######################################################调用service，插入对象结束，影响条数：" + num);
			}
		}
		return resXml;
	}

	/**
	 *
	 * @Title: refundnotify @Description: TODO(微信支付退款异步通知接口方法) @param @param
	 *         responseParameter @param @param response 设定文件 @return void
	 *         返回类型 @throws
	 */
	@RequestMapping(value = "/refundnotify")
	public void refundnotify(HttpServletRequest request, HttpServletResponse response) {
		logger.debug("######################################################################执行微信支付退款回调方法开始");
		InputStream inputStream;
		try {
			StringBuffer sb = new StringBuffer();
			inputStream = request.getInputStream();
			String s;
			BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
			while ((s = in.readLine()) != null) {
				sb.append(s);
			}
			in.close();
			inputStream.close();
			logger.debug("###########################微信退款异步通知返回值打印开始######################################");
			logger.debug("######################################################微信退款异步通知返回的值："+sb.toString());
			logger.debug("###########################微信退款异步通知返回值打印结束######################################");
			logger.debug("###############################################################################解析返回值开始");
			// 解析xml成map
			Map<String, String> m = new HashMap<String, String>();
			m = XMLUtil.doXMLParse(sb.toString());
			logger.debug("####################################################################################得到map");
			// 过滤空设置TreeMap,扫码
			SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
			Iterator<String> it = m.keySet().iterator();
			while (it.hasNext()) {
				String parameter = it.next();
				String parameterValue = m.get(parameter);
				String v = "";
				if (null != parameterValue) {
					v = parameterValue.trim();
				}
				logger.debug("####################################################################得到map的value值："+v);
				packageParams.put(parameter, v);
			}
			logger.info("微信退款返回回来的参数：" + packageParams);
			String return_code = (String) packageParams.get("return_code");
			logger.debug("#############################################################得到的return_code："+return_code);
			if (StrKit.notBlank(return_code) && return_code.equalsIgnoreCase("SUCCESS")) {
				logger.debug("############################################################得到的返回状态码："+return_code);
				logger.debug("############################################微信退款加密串解密开始########################");

				String A=packageParams.get("req_info").toString();
				logger.debug("######################################################################得到的加密串A为："+A);

				logger.debug("############################################对加密串A做base64解码########################");
				byte [] B=Base64Util.decode(A);
				logger.debug("###################################################################解码后得到的字节组B:"+B);
				if (wxpayConfigs.size() == 0) {
					example.or().andDeleteFlagEqualTo(0);
					wxpayConfigs = wPayService.getConfigList1(example);
				}
				logger.debug("#######################################获取到的支付配置表数据记录条数" + wxpayConfigs.size());
				if (wxpayConfigs.size() == 0) {
					logger.debug("###################################################################支付配置表没有配置");
				} else if (wxpayConfigs.size() == 1) {
					logger.debug("########################支付配置表中获取的商户key为："+wxpayConfigs.get(0).getSignKey());
					logger.debug("#####################################################对商户key做md5，得到32位小写key*");

					String keyMD5=MD5Util.MD5Encode(wxpayConfigs.get(0).getSignKey(),"UTF-8")
							.toLowerCase();
					logger.debug("############################################对商户key做md5，得到32的位小写key为"+keyMD5);
					//定义接收退款回调结果返回值字符串
					String resXml;
					logger.debug("#####################################################用key*对加密串B做AES-256-ECB解密");
					resXml= AESUtil.decryptData(B);
					logger.debug("########################################################解密后的退款xml字符串为"+resXml);
					logger.debug("#######################################################################解析返回值结束");

					WxResponseParameterForRefundNotify wxResponseParameter =
							JaxbUtil.converyToJavaBean(resXml,WxResponseParameterForRefundNotify.class);
					if (null != wxResponseParameter){
						if (null != wxResponseParameter.getRefund_status()
								&& wxResponseParameter.getRefund_status().equals("SUCCESS")){
							// 退款成功
							// 执行自己的业务逻辑
							// 声明日志插入结果对象
							InterfaceInvokeLog record = new InterfaceInvokeLog();
							logger.debug("#################################################声明日志插入结果对象"+ record);
							// 基础赋值
							logger.debug("#############################################################基础赋值操作开始");
							record.setInvokeTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
							record.setInvokeType("5");// 调用类型：1-支付 2-退款 3-查询 4-支付回调
							// 5-退款回调 99-其他
							record.setTradeChannel("3");// 交易渠道：1-百合易付 2-支付宝 3-微信
							// 99-其他
							record.setServiceVersion("1.0");
							record.setInputCharset("UTF-8");
							record.setAppid((String)packageParams.get("appid"));
							record.setMchId((String)packageParams.get("mch_id"));
							record.setNoceStr((String)packageParams.get("nonce_str"));
							logger.debug("#############################################################基础赋值操作结束");
							// 对象赋值操作
							logger.debug("########################################################日志表对象赋值操作开始");
							record.setRetcode((String) packageParams.get("return_code"));
							record.setOutTradeNo(wxResponseParameter.getOut_trade_no());
							record.setTransactionId(wxResponseParameter.getTransaction_id());
							record.setTotalFee(wxResponseParameter.getTotal_fee());
							record.setRefundId(wxResponseParameter.getRefund_id());
							record.setOutRefundNo(wxResponseParameter.getOut_refund_no());
							record.setRefundFee(wxResponseParameter.getRefund_fee());
							record.setRefundStatus(wxResponseParameter.getRefund_status());
							record.setTimeEnd(DateUtil.Giveformat(new Date()));
							logger.debug(
									"############################################################日志表对象赋值操作结束");
							// 调用service，插入日志表
							logger.debug(
									"########################################################调用service，插入日志表开始");
							int num = wPayService.saveInvokeLog(record);
							logger.debug("##########################################调用service，插入日志表结束，影响条数："
									+ num);
							/////////////////////////////////////////////////////////////////////////////////////////
							logger.debug(
									"####################################################################流水表插入开始");
							WxTransactionJournal transactionJournal = new WxTransactionJournal();
							String transaction_id=wxResponseParameter.getTransaction_id();
	//						boolean b=wPayService.deletebyid(transaction_id);
	//						System.out.println(b);
	//						if(b){
							Float totalFee=wxResponseParameter.getTotal_fee();
							logger.debug(
									"####################################################################11111111111111111");
							Float refundFee=Float.parseFloat(wxResponseParameter.getRefund_fee());
							transactionJournal.setTranType("2");
							if (totalFee.compareTo(refundFee)>0){//部分退款
								transactionJournal.setTranStatus("2");
							}
							if (totalFee.compareTo(refundFee)==0){//全部退款
								transactionJournal.setTranStatus("3");
							}
							transactionJournal.setRefundFee(refundFee);
							transactionJournal.setAppid((String) packageParams.get("appid"));
							transactionJournal.setMchId((String) packageParams.get("mch_id"));
							transactionJournal.setReqInfo((String) packageParams.get("req_info"));
							transactionJournal.setReturnCode((String) packageParams.get("return_code"));
							transactionJournal.setRefundStatus((String) packageParams.get("refund_status"));
							transactionJournal.setTransactionId(wxResponseParameter.getTransaction_id());
							transactionJournal.setRefundId(wxResponseParameter.getRefund_id());
							/*transactionJournal
										.setRefundFee((Float.parseFloat(wxResponseParameter.getRefund_fee())));*/
							transactionJournal.setOutRefundNo(wxResponseParameter.getOut_refund_no());
							transactionJournal.setOutTradeNo(wxResponseParameter.getOut_trade_no());
							transactionJournal.setRefundRequestSource(wxResponseParameter.getRefund_request_source());
//								BigDecimal bd=new BigDecimal(wxResponseParameter.getSettlement_refund_fee());
//								BigDecimal bd2=new BigDecimal(Double.valueOf(0.01).toString());
//								BigDecimal totleFee=bd.multiply(bd2);
//								Float t=totleFee.floatValue();
							logger.debug("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"+transactionJournal.getTotalFee());
							transactionJournal.setTotalFee(Float.valueOf(0));
//								BigDecimal bd1=new BigDecimal(wxResponseParameter.getTotal_fee());
//								BigDecimal bd3=new BigDecimal(Double.valueOf(0.01).toString());
//								BigDecimal Settlement_refund_fee=bd1.multiply(bd3);
//								Float f=Settlement_refund_fee.floatValue();
//								String m1=f.toString();
							transactionJournal.setSettlementRefundFee(wxResponseParameter.getSettlement_refund_fee());
							transactionJournal.setRefundStatus(wxResponseParameter.getRefund_status());
							transactionJournal.setRefundRecvAccout(wxResponseParameter.getRefund_recv_accout());
							transactionJournal.setRefundAccount(wxResponseParameter.getRefund_accout());
							transactionJournal.setTimeEnd(wxResponseParameter.getSuccess_time());
							transactionJournal.setTranType("2");
							transactionJournal.setTranStatus("3");
							transactionJournal.setRefundStatus("success");
							transactionJournal.setCreateTime(DateUtil.parseDate(DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss")));
							logger.debug(
									"#############################################################流水表对象赋值操作结束");
							// 调用service，插入日志表
							logger.debug(
									"#######################################################调用service，插入日志表开始");
							int num2 = wPayService.saveTransactionJournal(transactionJournal);
							logger.debug("##########################################调用service，插入日志表结束，影响条数："
									+ num2);
							logger.debug(
									"####################################################################流水表插入结束");
							/////////////////////////////////////////////////////////////////////////////////////
							// 执行自己业务逻辑结束
							logger.info("#####################################################################退款成功");
							// 通知微信异步成功不然会一直通知后台八次之后交易失败
							resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
									+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
					}
					else {
							logger.info("########################退款失败,错误代码：" + packageParams.get("return_code"));
							logger.info("#########################退款失败,错误信息：" + packageParams.get("return_msg"));
							resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
									+ "<return_msg><![CDATA[退款失败]]></return_msg>" + "</xml> ";
						}
					}
					else {
						logger.info("########################退款失败,错误代码：" + packageParams.get("return_code"));
						logger.info("#########################退款失败,错误信息：" + packageParams.get("return_msg"));
						resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
								+ "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
					}
					// ------------------------------
					// 处理业务完毕
					// ------------------------------
					BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
					out.write(resXml.getBytes());
					out.flush();
					out.close();
				}else {
					logger.debug("###############################################################支付配置表存在多条记录");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @Title: search @Description: TODO(微信支付订单查询接口) @param @param
	 *         requestParameter @param @return 设定文件 @return String 返回类型 @throws
	 */
	@RequestMapping(value = "/search", consumes = "application/xml", method = RequestMethod.POST)
	@ResponseBody
	public String serach(@RequestBody WxRequestParameter requestParameter) {
		logger.debug("########################################################执行微信支付订单查询接口search方法开始");
		logger.debug("########################################################接收到的body值：" + requestParameter);
		String resXml = null;
		String str = null;
		String errorString = null;
		if (wxpayConfigs.size() == 0) {
			example.or().andDeleteFlagEqualTo(0);
			wxpayConfigs = wPayService.getConfigList1(example);
		}
		logger.debug(
				"###############################################################获取到的支付配置表数据记录条数" + wxpayConfigs.size());
		if (wxpayConfigs.size() == 0) {
			errorString = "支付配置表没有配置！";
			resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
					+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
			logger.debug(
					"######################################################################################支付配置表没有配置");

		} else if (wxpayConfigs.size() == 1) {
			ObjectMapper mapper = new ObjectMapper(); // 转换器
			// 全局DeserializationFeature配置：配置该objectMapper在反序列化时，忽略目标对象没有的属性。凡是使用该objectMapper反序列化时，都会拥有该特性。
			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
			// 将传入的Java类转换为Json串
			try {
				str = JSONUtil.objectToJson(requestParameter).toString();
				logger.debug(
						"#############################################################################body值转换为Json串："
								+ str);
				SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
				packageParams.put("appid", wxpayConfigs.get(0).getAppId());
				packageParams.put("mch_id", wxpayConfigs.get(0).getMchId());
				packageParams.put("nonce_str", WXPayUtil.generateNonceStr());
				packageParams.put("out_trade_no", requestParameter.getOut_trade_no());
				String sign = PayForUtil.createSign("UTF-8", packageParams, wxpayConfigs.get(0).getSignKey());
				packageParams.put("sign", sign);
				String requestXML = PayForUtil.getRequestXml(packageParams);
				System.out.println(requestXML);
				resXml = WxHttpUtil.postData(wxpayConfigs.get(0).getSearchGateUrl(), requestXML);
				if (null == resXml || "".equals(resXml)) {
					errorString = "接口异常！返回数据为空，请检查接口是否可用；接口地址：" + wxpayConfigs.get(0).getSearchGateUrl();
					resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "fail"
							+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
					logger.debug(
							"######################################################################################"
									+ errorString);
				} else {
					logger.debug(
							"###################################################################执行微信支付订单查询接口search方法结束");
				}
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				errorString = "数据转换错误(JSONException)！";
				resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
						+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
				logger.debug("################################################################数据转换错误(JSONException)："
						+ e.toString());
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				errorString = "流异常(IOException)！";
				resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
						+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
				logger.debug("#######################################################################流异常(IOException)："
						+ e.toString());
				e.printStackTrace();
			}
		} else {
			errorString = "支付配置表存在多条记录！";
			resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "fail"
					+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
			logger.debug("################################################################################支付配置表存在多条记录");
		}
		logger.debug("######################################################################执行微信支付订单查询接口search方法结束");
		return resXml;
	
	}
	/**
	 * @Title: search @Description: TODO(微信支付订单查询接口) @param @param
	 *         requestParameter @param @return 设定文件 @return String 返回类型 @throws
	 */
	@RequestMapping(value = "/close", consumes = "application/xml", method = RequestMethod.POST)
	@ResponseBody
	public String close(@RequestBody WxRequestParameter requestParameter) {
		logger.debug("########################################################执行微信支付关闭订单close方法开始");
		logger.debug("########################################################接收到的body值：" + requestParameter);
		String resXml = null;
		String str = null;
		String errorString = null;
		if (wxpayConfigs.size() == 0) {
			example.or().andDeleteFlagEqualTo(0);
			wxpayConfigs = wPayService.getConfigList1(example);
		}
		logger.debug(
				"###############################################################获取到的支付配置表数据记录条数" + wxpayConfigs.size());
		if (wxpayConfigs.size() == 0) {
			errorString = "支付配置表没有配置！";
			resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
					+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
			logger.debug(
					"######################################################################################支付配置表没有配置");

		} else if (wxpayConfigs.size() == 1) {
			ObjectMapper mapper = new ObjectMapper(); // 转换器
			// 全局DeserializationFeature配置：配置该objectMapper在反序列化时，忽略目标对象没有的属性。凡是使用该objectMapper反序列化时，都会拥有该特性。
			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
			// 将传入的Java类转换为Json串
			try {
				str = JSONUtil.objectToJson(requestParameter).toString();
				logger.debug(
						"#############################################################################body值转换为Json串："
								+ str);
				SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
				packageParams.put("appid", wxpayConfigs.get(0).getAppId());
				packageParams.put("mch_id", wxpayConfigs.get(0).getMchId());
				packageParams.put("nonce_str", WXPayUtil.generateNonceStr());
				packageParams.put("out_trade_no", requestParameter.getOut_trade_no());
				String sign = PayForUtil.createSign("UTF-8", packageParams, wxpayConfigs.get(0).getSignKey());
				packageParams.put("sign", sign);
				String requestXML = PayForUtil.getRequestXml(packageParams);
				System.out.println(requestXML);
				resXml = WxHttpUtil.postData(wxpayConfigs.get(0).getCloseGateUrl(), requestXML);
				if (null == resXml || "".equals(resXml)) {
					errorString = "接口异常！返回数据为空，请检查接口是否可用；接口地址：" + wxpayConfigs.get(0).getSearchGateUrl();
					resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "fail"
							+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
					logger.debug(
							"######################################################################################"
									+ errorString);
				} else {
					Map<String, Object> map = new HashMap<String, Object>();
					try {
						map = XMLUtil.doXMLParse(resXml);
					} catch (JDOMException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					// 声明日志插入结果对象
					InterfaceInvokeLog record = new InterfaceInvokeLog();
					logger.debug("#################################################声明日志插入结果对象"+ record);
					// 基础赋值
					logger.debug("#############################################################基础赋值操作开始");
						record.setMachineIp(requestParameter.getMachine_ip());
						record.setMachineNo(requestParameter.getMachine_no());
						record.setMachineName(requestParameter.getMachine_name());
						record.setInvokeTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
						record.setInvokeType("99");
						record.setTradeChannel("3");
						record.setService("关闭订单");
						record.setInputCharset("UTF-8");
						record.setRetcode((String) map.get("return_code"));
						record.setRetmsg((String) map.get("return_code"));
						record.setAppid((String) map.get("appid"));
						record.setMchId((String) map.get("mch_id"));
						record.setNoceStr((String) map.get("nonce_str"));
						record.setSign((String) map.get("sign"));
					logger.debug(
							"###################################################################执行微信支付订单查询接口close方法结束");
				}
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				errorString = "数据转换错误(JSONException)！";
				resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
						+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
				logger.debug("################################################################数据转换错误(JSONException)："
						+ e.toString());
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				errorString = "流异常(IOException)！";
				resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
						+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
				logger.debug("#######################################################################流异常(IOException)："
						+ e.toString());
				e.printStackTrace();
			}
		} else {
			errorString = "支付配置表存在多条记录！";
			resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "fail"
					+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
			logger.debug("################################################################################支付配置表存在多条记录");
		}
		logger.debug("######################################################################执行微信支付订单查询接口close方法结束");
		return resXml;
	}


	/**
	 * @Title: accountdownload @Description: TODO(对账单下载接口)
	 *         商户对指定日期的对账单发起查询，三维易付实时返回该天订单的信息。接口只能下载昨天及昨天之前的对账单 @param @param
	 *         requestParameter @param @return 设定文件 @return String 返回类型 @throws
	 */
	@RequestMapping(value = "/accountdownload", consumes = "application/xml", method = RequestMethod.POST)
	@ResponseBody
	public String accountdownload(@RequestBody WxRequestParameter requestParameter) {
		logger.debug("#############################################################执行微信对账单下载接口accountdownload方法开始");
		logger.debug("##########################################################################接收到的body值："
				+ requestParameter);
		String resXml = null;
		String str = null;
		String errorString = null;
		logger.debug("##########################################################读取微信支付配置表开始");
		example.or().andDeleteFlagEqualTo(0);
		wxpayConfigs = wPayService.getConfigList1(example);
		logger.debug("#########################################获取到的支付配置表数据记录条数" + wxpayConfigs.size());
		if (wxpayConfigs.size() == 0) {
			errorString = "支付配置表没有配置！";
			resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
					+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
			logger.debug("支付配置表没有配置");
		} else if (wxpayConfigs.size() == 1) {
			logger.debug("#########################################################获取到的支付配置表唯一一条记录，支付开始");
			ObjectMapper mapper = new ObjectMapper(); // 转换器
			// 全局DeserializationFeature配置：配置该objectMapper在反序列化时，忽略目标对象没有的属性。凡是使用该objectMapper反序列化时，都会拥有该特性。
			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
			try {
				SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
				packageParams.put("appid",wxpayConfigs.get(0).getAppId());
				packageParams.put("mch_id",wxpayConfigs.get(0).getMchId());
				packageParams.put("nonce_str", requestParameter.getNonce_str());
				packageParams.put("body",requestParameter.getBody());
				packageParams.put("bill_date", requestParameter.getBill_date());
				packageParams.put("bill_type", requestParameter.getBill_type());
				String sign = PayForUtil.createSign("UTF-8", packageParams,wxpayConfigs.get(0).getSignKey());
				packageParams.put("sign", sign);
				String requestXML = PayForUtil.getRequestXml(packageParams);
				System.out.println(requestXML);
				resXml = WxHttpUtil.postData(wxpayConfigs.get(0).getAccountDownloadGateUrl(), requestXML);
				if(null==resXml|| "".equals(resXml)){
					errorString="接口异常！返回数据为空，请检查接口是否可用；接口地址："+ConstantsUtil.WX_ACCOUNT_DOWNLOAD_GATE_URL;
					resXml="<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>"+"fail"+"</return_code><return_msg>"+errorString+"</return_msg></xml> ";
					logger.debug("#########################################################################################"+errorString);
				}else {	logger.debug("############################################################执行HTTP POST 请求后得到的XML返回结果："
						+ resXml);
				logger.debug("##########################################################################################日志表插入开始");
				//声明日志插入结果对象
				InterfaceInvokeLog record = new InterfaceInvokeLog();
				logger.debug("###############################################################################声明日志插入结果对象"+record);
				//基础赋值
				logger.debug("########################################################################################基础赋值操作开始");
				record.setInvokeTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
				record.setInvokeType("6");//调用类型：1-支付 2-退款  3-查询 4-支付回调 5-退款回调  6-对账单下载 99-其他
				record.setService("account_ download_service");
				record.setServiceVersion("1.0");
				record.setSignType("MD5");
				record.setInputCharset("UTF-8");  //字符集
				logger.debug("########################################################################################基础赋值操作结束");
				//对象赋值操作
				logger.debug("########################################################################################对象赋值操作开始");
				//resXml=resXml.substring(129);
				//System.out.println(resXml);
				//record.setRetcode(wpay.getReturn_code());
				//record.setRetmsg(wpay.getReturn_msg());
				 String[] stringbuf = null;
			     stringbuf =resXml.split("`");  
			     	int m=stringbuf.length;
			        int num = stringbuf.length / 24;
			        int j=stringbuf.length%24;
			        for (int i = 0; i <num; i++) {  
			            for (int k =i*24+1; k <=24*(i+1); k++) {  
			            	  /*********************** 我添加的开始 ***********************/
			                //如果是最后列且是最后一行数据时，去除数据里的汉字
			                if((i == num-1)){
			                	 WxAccountDetil wxmxRecord = new WxAccountDetil();
					                wxmxRecord.setPayTime(((stringbuf[k]).substring(0,((stringbuf[k]).length()-1))));
					                k++;
					                wxmxRecord.setPublicId(((stringbuf[k]).substring(0,((stringbuf[k]).length()-1))));
					                k++;
					                wxmxRecord.setPartnerNo(((stringbuf[k]).substring(0,((stringbuf[k]).length()-1))));
					                k++;
					                wxmxRecord.setPartnerChild(((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)))); 
					                k++; 
					                if(((stringbuf[k]).length()-1)==0){
					                	 wxmxRecord.setDecvNo(stringbuf[k]);
					                	 k++;
					                }else{
					                	  wxmxRecord.setDecvNo(((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)))); 
							                k++;  
					                }
					                wxmxRecord.setWeixinId((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setSahnghuId((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setOpenid((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setTradeType((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setTradeState((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setBank((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setFeeType((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setTotalMoney((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setUcid((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setWtNo((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setStNo((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setTuiMoney((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++; 
					                wxmxRecord.setDaiTui((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;
					                wxmxRecord.setTuiType((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++; 
					                wxmxRecord.setTuiState((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;
					                wxmxRecord.setProduct((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;
					                wxmxRecord.setAttach((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;
					                wxmxRecord.setShouFee((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++; 
					                String reg = "[\u4e00-\u9fa5]";//汉字的正则表达式
				                    Pattern pat = Pattern.compile(reg); 
				                    Matcher mat=pat.matcher((stringbuf[k])); 
				                    String repickStr = mat.replaceAll("");
					                wxmxRecord.setFevi(repickStr);  
					                k++; 
					             int count=wxAccountDetilService.insert(wxmxRecord); 
						        WxRecord wx=new WxRecord();
						        wx.setRecord((stringbuf[m-j+1].substring(0,(stringbuf[m-j+1].length()-1))));
						        wx.setSumMoney((stringbuf[m-j+2].substring(0,(stringbuf[m-j+2].length()-1))));
						        wx.setTuiTotalMoney((stringbuf[m-j+3].substring(0,(stringbuf[m-j+3].length()-1))));
						        wx.setZongDai((stringbuf[m-j+4].substring(0,(stringbuf[m-j+4].length()-1))));
						        wx.setShouTotalMoney((stringbuf[m-j+5].substring(0,(stringbuf[m-j+5].length()-1))));
						        int count1=wxRecordService.insert(wx); 
						        i++;
			                }else{
			                	  WxAccountDetil wxmxRecord = new WxAccountDetil();
					                wxmxRecord.setPayTime(((stringbuf[k]).substring(0,((stringbuf[k]).length()-1))));
					                k++;
					                wxmxRecord.setPublicId(((stringbuf[k]).substring(0,((stringbuf[k]).length()-1))));
					                k++;
					                wxmxRecord.setPartnerNo(((stringbuf[k]).substring(0,((stringbuf[k]).length()-1))));
					                k++;
					                wxmxRecord.setPartnerChild(((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)))); 
					                k++; 
					                if(((stringbuf[k]).length()-1)==0){
					                	 wxmxRecord.setDecvNo(stringbuf[k]);
					                	 k++;
					                }else{
					                	  wxmxRecord.setDecvNo(((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)))); 
							                k++;  
					                }
					                wxmxRecord.setWeixinId((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setSahnghuId((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setOpenid((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setTradeType((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setTradeState((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setBank((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setFeeType((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setTotalMoney((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setUcid((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setWtNo((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setStNo((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;  
					                wxmxRecord.setTuiMoney((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++; 
					                wxmxRecord.setDaiTui((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;
					                wxmxRecord.setTuiType((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++; 
					                wxmxRecord.setTuiState((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;
					                wxmxRecord.setProduct((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;
					                wxmxRecord.setAttach((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++;
					                wxmxRecord.setShouFee((stringbuf[k]).substring(0,((stringbuf[k]).length()-1)));  
					                k++; 
					                wxmxRecord.setFevi((stringbuf[k]));  
					                k++; 
					                int count=wxAccountDetilService.insert(wxmxRecord); 
			                }
			              
			            }
			        }   
				logger.debug("#######################################################################################对象赋值操作结束");
				//调用service，插入对象
				logger.debug("###########################################################################调用service，插入日志表对象开始");
				int num1 = wPayService.saveInvokeLog(record);
				logger.debug("#############################################################调用service，插入日志表对象结束，影响条数："+num1);
				logger.debug("#########################################################################################日志表插入结束");
				}
			
			} catch (JSONException e) {
				errorString = "数据转换错误(JSONException)！";
				resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "fail"
						+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
				logger.debug("################################################################数据转换错误(JSONException)："
						+ e.toString());
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else {
			errorString = "支付配置表存在多条记录！";
			resXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <xml> <return_code>" + "-1"
					+ "</return_code><return_msg>" + errorString + "</return_msg></xml> ";
			logger.debug("################################################################################支付配置表存在多条记录");
		}
		logger.debug("###########################################################执行百合易付对账单下载接口accountdownload方法结束");
		return resXml;
	}

	/**
	 * 
	 * @Title: getWebappsURL @Description:
	 *         TODO(获取tomcat发布目录webapps路径) @param @return 设定文件 @return String
	 *         返回类型 @throws
	 */
	public String getWebappsURL() {
		String fengeFu = File.separator;
		WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
		ServletContext servletContext = webApplicationContext.getServletContext();
		String webRoot = servletContext.getRealPath(fengeFu);
		int lastXiegangIndex = webRoot.substring(0, webRoot.lastIndexOf(fengeFu)).lastIndexOf(fengeFu);
		String webappsLujing = webRoot.substring(0, lastXiegangIndex);
		return webappsLujing;

	}
}