package com.platform.controller.epay;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
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 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.pojo.Epay;
import com.platform.pojo.EpayConfig;
import com.platform.pojo.EpayConfigExample;
import com.platform.pojo.InterfaceInvokeLog;
import com.platform.pojo.TransactionJournal;
import com.platform.request.xml.RequestParameter;
import com.platform.request.xml.RequestParameterForEpay;
import com.platform.response.xml.ResponseParameter;
import com.platform.response.xml.ResponseParameterForInsert;
import com.platform.response.xml.ResponseParameterForQrCode;
import com.platform.service.IEPayService;
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.QRCodeUtil;
import com.platform.util.WebToolUtils;

/**
 * @author kiosk
 * @ClassName: EPayController
 * @Description: TODO(兰州银行百合易付 ( EPay)支付对接类)
 * @date 2017年7月23日 下午4:24:01
 */

@Controller
@RequestMapping("/epayxml")
public class EPayXmlController {
    //定义日志文件操作类对象
    private static Logger logger = (Logger) LoggerFactory.getLogger(EPayXmlController.class);
    @Resource
    private IEPayService ePayService;

    List<EpayConfig> epayConfigs = new ArrayList<EpayConfig>();
    EpayConfigExample example = new EpayConfigExample();

    /**
     * @param @param  requestParameter
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: pay
     * @Description: TODO(百合易付支付下单接口)
     */
    @RequestMapping(value = "/pay", consumes = "application/xml", method = RequestMethod.POST)
    @ResponseBody
    public String pay(@RequestBody RequestParameter requestParameter) {
        logger.debug("###################################################执行百合易付支付下单接口pay方法开始");
        logger.debug("###################################################接收到的body值：" + requestParameter);
        String resultStr = null;
        String str = null;
        String errorString = null;
        //将返回的XML结果封装处理成接口调用日志Java类对象
        XmlMapper xmlMapper = new XmlMapper();
        ObjectMapper mapper = new ObjectMapper(); //转换器
        logger.debug("##########################################################读取百合易付支付配置表开始");
        example.or().andDeleteFlagEqualTo(0);
        epayConfigs = ePayService.getConfigList(example);
        logger.debug("#########################################获取到的支付配置表数据记录条数" + epayConfigs.size());
        if (epayConfigs.size() == 0) {
            errorString = "支付配置表没有配置！";
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
            logger.debug("支付配置表没有配置");
        } else if (epayConfigs.size() == 1) {
            logger.debug("#########################################################获取到的支付配置表唯一一条记录，支付开始");
            //全局DeserializationFeature配置：配置该objectMapper在反序列化时，忽略目标对象没有的属性。凡是使用该objectMapper反序列化时，都会拥有该特性。
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            try {
                //将传入的Java类转换为Json串
                str = JSONUtil.objectToJson(requestParameter).toString();
                logger.debug("##########################################body值转换为Json串：" + str);
                RequestParameterForEpay requestParamForEpay = new RequestParameterForEpay();
                //准备支付赋值操作
                requestParamForEpay = (RequestParameterForEpay) mapper.readValue(str, RequestParameterForEpay.class);
                requestParamForEpay.setService(epayConfigs.get(0).getPayService());  //服务名称
                requestParamForEpay.setService_version("2.0"); //版本号
                requestParamForEpay.setInput_charset("UTF-8");  //字符集
                requestParamForEpay.setSign_type("MD5");//签名算法
                requestParamForEpay.setFee_type("1");//人民币
                requestParamForEpay.setPay_type("unifiedorder");
                requestParamForEpay.setTrade_mode("0002");
                requestParamForEpay.setTrans_channel("mb");
                requestParamForEpay.setBiz_type("0009");
                //读取表配置赋值开始
                logger.debug("######################读取表配置赋值开始############################");
                requestParamForEpay.setService(epayConfigs.get(0).getPayService());
                requestParamForEpay.setNotify_url(epayConfigs.get(0).getPayNotifyUrl());
                requestParamForEpay.setReturn_url(epayConfigs.get(0).getReturnUrl());
                requestParamForEpay.setShow_url(epayConfigs.get(0).getShowUrl());
                requestParamForEpay.setPartner(epayConfigs.get(0).getPartner());
                requestParamForEpay.setSubpartner(epayConfigs.get(0).getSubpartner());
                requestParamForEpay.setSpbill_create_ip(requestParameter.getMachine_ip());
                logger.debug("######################读取表配置赋值结束############################");
                //读取表配置赋值结束
                Map<String, String> params = new HashMap<String, String>();
                params = ClassUtil.setConditionMap(requestParamForEpay);
                //签名有两个步骤，先按一定规则拼接要签名的原始串，再选择具体的算法和密钥计算出签名结果。
                //拼原始串
                Map<String, String> filterMap = EpayMD5.paraFilter(params);
                String linkStr = EpayMD5.createLinkString(filterMap);
                logger.debug("######################################MD5签名拼原始串的值：" + linkStr);
                //签名（签名时要把三维易付分配给商户的私钥（key）加入进行MD5签名）
                String sign = EpayMD5.sign(linkStr, epayConfigs.get(0).getSignKey(), "UTF-8");
                logger.debug("###################################私钥（key）加入进行MD5签名后的值：" + sign);
                params.put("sign", sign);//将签名结果放入map
                //发送POST请求，返回XML结果
                resultStr = HttpUtil.sendPostMap(epayConfigs.get(0).getPayGateUrl(), params, "UTF-8", false);
                logger.debug("#######################################执行HTTP POST 请求后得到的XML返回结果：" + resultStr);
                if (null == resultStr || "".equals(resultStr)) {
                    errorString = "接口异常！返回数据为空，请检查接口是否可用；接口地址：" + epayConfigs.get(0).getPayGateUrl();
                    resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                    logger.debug("############################################################" + errorString);
                } else {
                    /**
                     * ******************************************************************************************************
                     */
                    ResponseParameterForInsert responseParameterForInsert = new ResponseParameterForInsert();
                    try {
                        //服务器端根据二维码内容重新生成二维码
                        logger.debug("######################################服务器端根据二维码内容重新生成二维码");
                        ResponseParameterForInsert responseParameterForQrCode = new ResponseParameterForInsert();
                        responseParameterForQrCode = xmlMapper.readValue(resultStr, ResponseParameterForInsert.class);
                        //获取二维码内容地址
                        String qr_url = responseParameterForQrCode.getQr_url();
                        logger.debug("######################################获取到的二维码内容地址" + qr_url);
                        //设定二维码图片存放目录地址
                        String folderPath = getWebappsURL()
                                + File.separator + "uploadimeges"
                                + File.separator + "qrcode"
                                + File.separator + "epay"
                                + 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);
                        //重新生成二维码图片
                        String fileName = QRCodeUtil.encode(qr_url, folderPath, false);
                        code_url = "http://" + ip + ":" + ConstantsUtil.TOMCAT_PORT + File.separator + "uploadimeges"
                                + File.separator + "qrcode"
                                + File.separator + "epay"
                                + 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);
                        ResponseParameterForQrCode responseParameterForQrCode2 = new ResponseParameterForQrCode();
                        responseParameterForQrCode2.setRetcode(responseParameterForQrCode.getRetcode());
                        responseParameterForQrCode2.setService(responseParameterForQrCode.getService());
                        responseParameterForQrCode2.setService_version(responseParameterForQrCode.getService_version());
                        responseParameterForQrCode2.setInput_charset(responseParameterForQrCode.getInput_charset());
                        responseParameterForQrCode2.setTransaction_id(responseParameterForQrCode.getTransaction_id());
                        responseParameterForQrCode2.setOut_trade_no(responseParameterForQrCode.getOut_trade_no());
                        responseParameterForQrCode2.setQr_url(responseParameterForQrCode.getQr_url());
                        responseParameterForQrCode2.setCode_url(responseParameterForQrCode.getCode_url());
                        //重新将java对象转换成xml字符串
                        resultStr = JaxbUtil.convertToXml(responseParameterForQrCode2);
                        logger.debug("######################################重新将java对象转换成xml字符串：" + resultStr);

                        responseParameterForInsert = xmlMapper.readValue(resultStr, ResponseParameterForInsert.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("1");//交易渠道：1-百合易付 2-支付宝 3-微信 99-其他
                        record.setService(responseParameterForInsert.getService());
                        record.setServiceVersion(responseParameterForInsert.getService_version());
                        record.setInputCharset(responseParameterForInsert.getInput_charset());
                        //对象赋值操作
                        record.setRetcode(responseParameterForInsert.getRetcode());
                        record.setTransactionId(responseParameterForInsert.getTransaction_id());
                        record.setOutTradeNo(responseParameterForInsert.getOut_trade_no());
                        record.setCodeUrl(responseParameterForInsert.getCode_url());
                        record.setQrUrl(responseParameterForInsert.getQr_url());
                        //调用service，插入对象
                        logger.debug("####################################################调用service，插入日志表对象开始");
                        int num = ePayService.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)！";
                resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                logger.debug("################################################################数据转换错误(JSONException)：" + e.toString());
            } catch (IOException e) {
                errorString = "流异常(IOException)！";
                resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                logger.debug("#######################################################################流异常(IOException)：" + e.toString());
            }
        } else {
            errorString = "支付配置表存在多条记录！";
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
            logger.debug("################################################################################支付配置表存在多条记录");
        }
        logger.debug("#######################################################################执行百合易付支付下单接口pay方法结束");
        return resultStr;
    }

    /**
     * @param @param  requestParameter
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: refund
     * @Description: TODO(百合易付退款接口)
     */
    @RequestMapping(value = "/refund", consumes = "application/xml", method = RequestMethod.POST)
    @ResponseBody
    public String refund(@RequestBody RequestParameter requestParameter) {
        logger.debug("#############################################执行百合易付退款接口refund方法开始");
        logger.debug("###############################################################接收到的body值：" + requestParameter);
        String resultStr = null;
        String str = null;
        String errorString = null;
        logger.debug("#######################################################################读取百合易付支付配置表开始");
        example.or().andDeleteFlagEqualTo(0);
        epayConfigs = ePayService.getConfigList(example);
        logger.debug("#######################################################获取到的支付配置表数据记录条数" + epayConfigs.size());
        if (epayConfigs.size() == 0) {
            errorString = "支付配置表没有配置！";
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
            logger.debug("##############################################################################支付配置表没有配置");
        } else if (epayConfigs.size() == 1) {
            ObjectMapper mapper = new ObjectMapper(); //转换器
            //全局DeserializationFeature配置：配置该objectMapper在反序列化时，忽略目标对象没有的属性。凡是使用该objectMapper反序列化时，都会拥有该特性。
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            try {
                //将传入的Java类转换为Json串
                str = JSONUtil.objectToJson(requestParameter).toString();
                logger.debug("########################################################################body值转换为Json串：" + str);
                RequestParameterForEpay requestParamForEpay = new RequestParameterForEpay();
                //准备退款赋值操作
                requestParamForEpay = (RequestParameterForEpay) mapper.readValue(str, RequestParameterForEpay.class);
                //准备退款赋值操作
                requestParamForEpay.setService(epayConfigs.get(0).getRefundService());  //服务名称
                requestParamForEpay.setService_version("1.0"); //版本号
                requestParamForEpay.setInput_charset("UTF-8");  //字符集
                requestParamForEpay.setSign_type("MD5");//签名算法
                requestParamForEpay.setPartner(epayConfigs.get(0).getPartner());
                requestParamForEpay.setSubpartner(epayConfigs.get(0).getSubpartner());
                requestParamForEpay.setNotify_url(epayConfigs.get(0).getRefundNotifyUrl());
                Map<String, String> params = new HashMap<String, String>();
                params = ClassUtil.setConditionMap(requestParamForEpay);
                //签名有两个步骤，先按一定规则拼接要签名的原始串，再选择具体的算法和密钥计算出签名结果。
                //拼原始串
                Map<String, String> filterMap = EpayMD5.paraFilter(params);
                String linkStr = EpayMD5.createLinkString(filterMap);
                logger.debug("##############################################MD5签名拼原始串的值：" + linkStr);
                //签名（签名时要把三维易付分配给商户的私钥（key）加入进行MD5签名）
                String sign = EpayMD5.sign(linkStr, epayConfigs.get(0).getSignKey(), "UTF-8");
                logger.debug("#####################################私钥（key）加入进行MD5签名后的值：" + sign);
                params.put("sign", sign);//将签名结果放入map
                //发送POST请求，返回XML结果
                resultStr = HttpUtil.sendPostMap(epayConfigs.get(0).getRefundGateUrl(), params, "UTF-8", false);
                logger.debug("##############################执行HTTP POST 请求后得到的XML返回结果：" + resultStr);
                if (null == resultStr || "".equals(resultStr)) {
                    errorString = "接口异常！返回数据为空，请检查接口是否可用；接口地址：" + epayConfigs.get(0).getRefundGateUrl();
                    resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                    logger.debug("###########################################################" + errorString);
                } else {
                    /**
                     * ******************************************************************************************************
                     */
                    //将返回的XML结果封装处理成接口调用日志Java类对象
                    XmlMapper xmlMapper = new XmlMapper();
                    ResponseParameterForInsert responseParameterForInsert = new ResponseParameterForInsert();
                    try {
                        responseParameterForInsert = xmlMapper.readValue(resultStr, ResponseParameterForInsert.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("2");//调用类型：1-支付 2-退款  3-查询 4-支付回调 5-退款回调  99-其他
                        record.setTradeChannel("1");//交易渠道：1-百合易付 2-支付宝 3-微信 99-其他
                        record.setService(responseParameterForInsert.getService());
                        record.setServiceVersion(responseParameterForInsert.getService_version());
                        record.setInputCharset(responseParameterForInsert.getInput_charset());
                        record.setSignType(responseParameterForInsert.getSign_type());
                        record.setSign(responseParameterForInsert.getSign());
                        //对象赋值操作
                        record.setRetcode(responseParameterForInsert.getRetcode());
                        record.setRetmsg(responseParameterForInsert.getRetmsg());
                        record.setPartner(responseParameterForInsert.getPartner());
                        record.setSubpartner(responseParameterForInsert.getSubpartner());
                        record.setTransactionId(responseParameterForInsert.getTransaction_id());
                        record.setOutRefundNo(responseParameterForInsert.getOut_refund_no());
                        record.setRefundId(responseParameterForInsert.getRefund_id());
                        record.setRefundChannel(responseParameterForInsert.getRefund_channel());
                        record.setRefundFee(responseParameterForInsert.getRefund_fee());
                        record.setRefundStatus(responseParameterForInsert.getRefund_status());
                        record.setRecvUserId(responseParameterForInsert.getRecv_user_id());
                        record.setReccvUserName(responseParameterForInsert.getReccv_user_name());
                        record.setTimeEnd(responseParameterForInsert.getTime_end());
                        //调用service，插入对象
                        logger.debug("################################################################调用service，插入日志表对象开始");
                        int num = ePayService.saveInvokeLog(record);
                        logger.debug("######################################################调用service，插入对象结束，影响条数：" + num);
                    } catch (JsonParseException e) {
                        logger.debug("###############################XML结果封装处理成接口调用日志Java类对象失败，Json解析出错：" + e.toString());
                        e.printStackTrace();
                    } catch (JsonMappingException e) {
                        logger.debug("################################3XML结果封装处理成接口调用日志Java类对象失败，Json映射出错：" + e.toString());
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        logger.debug("######################################XML结果封装处理成接口调用日志Java类对象失败，流出错：" + e.toString());
                    }
                }
            } catch (JSONException e) {
                errorString = "数据转换错误(JSONException)！";
                resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                logger.debug("################################################################数据转换错误(JSONException)：" + e.toString());
            } catch (IOException e) {
                errorString = "流异常(IOException)！";
                resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                logger.debug("########################################################################流异常(IOException)：" + e.toString());
            }
        } else {
            errorString = "支付配置表存在多条记录！";
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
            logger.debug("################################################################################支付配置表存在多条记录");
        }
        logger.debug("##########################################################################执行百合易付退款接口refund方法结束");
        return resultStr;
    }

    /**
     * @param @param  requestParameter
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: search
     * @Description: TODO(百合易付订单查询接口)
     */
    @RequestMapping(value = "/search", consumes = "application/xml", method = RequestMethod.POST)
    @ResponseBody
    public String search(@RequestBody RequestParameter requestParameter) {
        logger.debug("#######################################################################执行百合易付订单查询接口search方法开始");
        logger.debug("#########################################################################接收到的body值：" + requestParameter);
        String resultStr = null;
        String str = null;
        String errorString = null;
        if (epayConfigs.size() == 0) {
            example.or().andDeleteFlagEqualTo(0);
            epayConfigs = ePayService.getConfigList(example);
        }
        logger.debug("###############################################################获取到的支付配置表数据记录条数" + epayConfigs.size());
        if (epayConfigs.size() == 0) {
            errorString = "支付配置表没有配置！";
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
            logger.debug("######################################################################################支付配置表没有配置");
        } else if (epayConfigs.size() == 1) {
            ObjectMapper mapper = new ObjectMapper(); //转换器
            //全局DeserializationFeature配置：配置该objectMapper在反序列化时，忽略目标对象没有的属性。凡是使用该objectMapper反序列化时，都会拥有该特性。
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            try {
                //将传入的Java类转换为Json串
                str = JSONUtil.objectToJson(requestParameter).toString();
                logger.debug("#############################################################################body值转换为Json串：" + str);
                RequestParameterForEpay requestParamForEpay = new RequestParameterForEpay();
                //准备查询赋值操作
                requestParamForEpay = (RequestParameterForEpay) mapper.readValue(str, RequestParameterForEpay.class);
                //准备查询赋值操作
                requestParamForEpay.setService(epayConfigs.get(0).getSearchService());  //服务名称
                requestParamForEpay.setService_version("1.0"); //版本号
                requestParamForEpay.setInput_charset("UTF-8");  //字符集
                requestParamForEpay.setSign_type("MD5");//签名算法
                requestParamForEpay.setPartner(epayConfigs.get(0).getPartner());
                requestParamForEpay.setSubpartner(epayConfigs.get(0).getSubpartner());
                Map<String, String> params = new HashMap<String, String>();
                params = ClassUtil.setConditionMap(requestParamForEpay);
                //签名有两个步骤，先按一定规则拼接要签名的原始串，再选择具体的算法和密钥计算出签名结果。
                //拼原始串
                Map<String, String> filterMap = EpayMD5.paraFilter(params);
                String linkStr = EpayMD5.createLinkString(filterMap);
                logger.debug("#########################################################################MD5签名拼原始串的值：" + linkStr);
                //签名（签名时要把三维易付分配给商户的私钥（key）加入进行MD5签名）
                String sign = EpayMD5.sign(linkStr, epayConfigs.get(0).getSignKey(), "UTF-8");
                logger.debug("################################################################私钥（key）加入进行MD5签名后的值：" + sign);
                params.put("sign", sign);//将签名结果放入map
                //发送POST请求，返回XML结果
                resultStr = HttpUtil.sendPostMap(epayConfigs.get(0).getSearchGateUrl(), params, "UTF-8", false);
                logger.debug("########################################################执行HTTP POST 请求后得到的XML返回结果：" + resultStr);
                if (null == resultStr || "".equals(resultStr)) {
                    errorString = "接口异常！返回数据为空，请检查接口是否可用；接口地址：" + epayConfigs.get(0).getSearchGateUrl();
                    resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                    logger.debug("######################################################################################" + errorString);
                } else {
                    /**
                     * ******************************************************************************************************
                     */
                    //将返回的XML结果封装处理成接口调用日志Java类对象
//					XmlMapper xmlMapper = new XmlMapper();
//					ResponseParameterForInsert responseParameterForInsert=new ResponseParameterForInsert();
//					try {
//						responseParameterForInsert = xmlMapper.readValue(resultStr, ResponseParameterForInsert.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("3");//调用类型：1-支付 2-退款  3-查询 4-支付回调 5-退款回调  99-其他
//						record.setTradeChannel("1");//交易渠道：1-百合易付 2-支付宝 3-微信 99-其他
//						record.setService(responseParameterForInsert.getService());
//						record.setServiceVersion(responseParameterForInsert.getService_version());
//						record.setInputCharset(responseParameterForInsert.getInput_charset());
//						record.setSignType(responseParameterForInsert.getSign_type());
//						record.setSign(responseParameterForInsert.getSign());
//						//对象赋值操作
//						record.setRetcode(responseParameterForInsert.getRetcode());
//						record.setTradeState(responseParameterForInsert.getTrade_state());
//						record.setRefundState(responseParameterForInsert.getRefund_state());
//						record.setClearState(responseParameterForInsert.getClear_state());
//						record.setRetmsg(responseParameterForInsert.getRetmsg());
//						record.setTradeMode(responseParameterForInsert.getTrade_mode());
//						record.setTradeType(responseParameterForInsert.getTrade_type());
//						record.setBankTransno(responseParameterForInsert.getBank_transno());
//						record.setTotalFee(responseParameterForInsert.getTotal_fee());
//						record.setFeeType(responseParameterForInsert.getFee_type());
//						record.setOutTradeNo(responseParameterForInsert.getOut_trade_no());
//						record.setOutRefundNo(responseParameterForInsert.getOut_refund_no());
//						record.setTransactionId(responseParameterForInsert.getTransaction_id());
//						record.setIsSplit(String.valueOf(responseParameterForInsert.isIs_split()));
//						record.setTimeEnd(responseParameterForInsert.getTime_end());
//						if(null != responseParameterForInsert.getTransport_fee()){
//							record.setTransportFee(responseParameterForInsert.getTransport_fee().toString());
//						}
//						record.setPlatCharge(String.valueOf(responseParameterForInsert.getPlatCharge()));
//						record.setSubPlatCharge(String.valueOf(responseParameterForInsert.getSubPlatCharge()));
//						record.setProductFee(String.valueOf(responseParameterForInsert.getProduct_fee()));
//						record.setDiscount(String.valueOf(responseParameterForInsert.getDiscount()));
//						record.setAttach(responseParameterForInsert.getAttach());
//						//调用service，插入对象
//						logger.debug("#######################################################################调用service，插入日志表对象开始");
//						int num = ePayService.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());
//			        }
                }
                logger.debug("###################################################################执行百合易付订单查询接口search方法结束");
            } catch (JSONException e) {
                errorString = "数据转换错误(JSONException)！";
                resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                logger.debug("################################################################数据转换错误(JSONException)：" + e.toString());
            } catch (IOException e) {
                errorString = "流异常(IOException)！";
                resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                logger.debug("#######################################################################流异常(IOException)：" + e.toString());
            }
        } else {
            errorString = "支付配置表存在多条记录！";
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
            logger.debug("################################################################################支付配置表存在多条记录");
        }

        logger.debug("######################################################################执行百合易付订单查询接口search方法结束");
        return resultStr;
    }

    /**
     * @param @param  responseParameter
     * @param @param  response
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: paynotify
     * @Description: TODO(百合易付支付异步通知接口)
     */
    @RequestMapping(value = "/paynotify", method = RequestMethod.POST, consumes = "application/x-www-form-urlencoded")
    public void paynotify(ResponseParameter responseParameter, HttpServletResponse response) {
        logger.debug("##################################################################执行百合易付支付异步通知接口paynotify方法开始");
        logger.debug("############################################################################接收到的值：" + responseParameter);
        try {
            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("4");//调用类型：1-支付 2-退款  3-查询 4-支付回调 5-退款回调  99-其他
            record.setTradeChannel("1");//交易渠道：1-百合易付 2-支付宝 3-微信 99-其他
            record.setService(responseParameter.getService());
            record.setServiceVersion(responseParameter.getService_version());
            record.setInputCharset(responseParameter.getInput_charset());
            record.setSignType(responseParameter.getSign_type());
            record.setSign(responseParameter.getSign());
            logger.debug("#################################################################################基础赋值操作结束");
            //对象赋值操作
            logger.debug("############################################################################日志表对象赋值操作开始");
            record.setRetcode(responseParameter.getRetcode());
            record.setTradeMode(responseParameter.getTrade_mode());
            record.setTradeState(responseParameter.getTrade_state());
            record.setPayInfo(responseParameter.getPay_info());
            record.setTransChannel(responseParameter.getTrans_channel());
            record.setPartner(responseParameter.getPartner());
            record.setSubpartner(responseParameter.getSubpartner());
            record.setOutTradeNo(responseParameter.getOut_trade_no());
            record.setTransactionId(responseParameter.getTransaction_id());
            record.setBankType(responseParameter.getBank_type());
            if (null != responseParameter.getTotal_fee()) {
                record.setTotalFee(Float.parseFloat(responseParameter.getTotal_fee().toString()));
            }
            record.setFeeType(responseParameter.getFee_type());
            record.setNotifyId(responseParameter.getNotify_id());
            record.setTimeEnd(responseParameter.getTime_end());
            if (null != responseParameter.getTransport_fee()) {
                record.setTransportFee(responseParameter.getTransport_fee().toString());
            }
            if (null != responseParameter.getProduct_fee()) {
                record.setProductFee(responseParameter.getProduct_fee().toString());
            }
            if (null != responseParameter.getDiscount()) {
                record.setDiscount(responseParameter.getDiscount().toString());
            }
            record.setBuyerAlias(responseParameter.getBuyer_alias());
            record.setAttach(responseParameter.getAttach());
            logger.debug("###################################################################################日志表对象赋值操作结束");
            //调用service，插入日志表
            logger.debug("###############################################################################调用service，插入日志表开始");
            int num = ePayService.saveInvokeLog(record);
            logger.debug("#################################################################调用service，插入日志表结束，影响条数：" + num);
            /////////////////////////////////////////////////////////////////////////////////////////
            logger.debug("#########################################################################################流水表插入开始");
            //声明流水表对象
            TransactionJournal transactionJournal = new TransactionJournal();
            //对象赋值操作
            logger.debug("##################################################################################流水表对象赋值操作开始");
            transactionJournal.setTradeChannel("1");//交易渠道：1-百合易付 2-支付宝 3-微信 99-其他
            transactionJournal.setRetcode(responseParameter.getRetcode());
            transactionJournal.setTradeMode(responseParameter.getTrade_mode());
            transactionJournal.setTradeState(responseParameter.getTrade_state());
            transactionJournal.setPayInfo(responseParameter.getPay_info());
            transactionJournal.setTransChannel(responseParameter.getTrans_channel());
            transactionJournal.setPartner(responseParameter.getPartner());
            transactionJournal.setSubpartner(responseParameter.getSubpartner());
            transactionJournal.setOutTradeNo(responseParameter.getOut_trade_no());
            transactionJournal.setTransactionId(responseParameter.getTransaction_id());
            transactionJournal.setBankType(responseParameter.getBank_type());
            if (null != responseParameter.getTotal_fee()) {
                transactionJournal.setTotalFee(responseParameter.getTotal_fee());
            }
            transactionJournal.setFeeType(responseParameter.getFee_type());
            transactionJournal.setNotifyId(responseParameter.getNotify_id());
            transactionJournal.setTimeEnd(responseParameter.getTime_end());
            if (null != responseParameter.getTransport_fee()) {
                transactionJournal.setTransportFee(responseParameter.getTransport_fee());
            }
            if (null != responseParameter.getProduct_fee()) {
                transactionJournal.setProductFee(responseParameter.getProduct_fee());
            }
            if (null != responseParameter.getDiscount()) {
                transactionJournal.setDiscount(responseParameter.getDiscount());
            }
            transactionJournal.setBuyerAlias(responseParameter.getBuyer_alias());
            transactionJournal.setAttach(responseParameter.getAttach());
            transactionJournal.setTradeType("0001");//交易类型：百合易付（0001-支付交易  0002 – 退款交易）
            transactionJournal.setCreateTime(DateUtil.parseDate(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")));
            logger.debug("###################################################################################流水表对象赋值操作结束");
            //调用service，插入日志表
            logger.debug("################################################################################调用service，插入日志表开始");
            int num2 = ePayService.saveTransactionJournal(transactionJournal);
            logger.debug("#################################################################调用service，插入日志表结束，影响条数：" + num2);
            logger.debug("##########################################################################################流水表插入结束");
            /////////////////////////////////////////////////////////////////////////////////////

            /**
             * *****************************************************************************************
             */
            logger.debug("#############################################################################给回调接口发送接收成功结果开始");
            //给回调接口发送接收成功结果
            response.reset();
            PrintWriter out = response.getWriter();
            out.write("success");
            logger.debug("##################################################################给回调接口发送接收成功结果字符串" + "success");
            logger.debug("############################################################################给回调接口发送接收成功结果结束");
            /**
             * *******************************************************************************************
             */
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            logger.debug("######################################################################支付回调失败，异常信息：" + e.toString());
        }
    }

    /**
     * @param @param responseParameter
     * @param @param response  设定文件
     * @return void    返回类型
     * @throws
     * @Title: refundnotify
     * @Description: TODO(百合易付退款异步通知接口方法)
     */
    @RequestMapping(value = "/refundnotify", method = RequestMethod.POST, consumes = "application/x-www-form-urlencoded")
    public void refundnotify(ResponseParameter responseParameter, HttpServletResponse response) {
        logger.debug("#################################################################执行百合易付退款异步通知接口refundnotify方法开始");
        logger.debug("##############################################################################接收到的值：" + responseParameter);
        try {
            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("5");//调用类型：1-支付 2-退款  3-查询 4-支付回调 5-退款回调  6-对账单下载 99-其他
            record.setTradeChannel("1");//交易渠道：1-百合易付 2-支付宝 3-微信 99-其他
            record.setService(responseParameter.getService());
            record.setServiceVersion(responseParameter.getService_version());
            record.setInputCharset(responseParameter.getInput_charset());
            record.setSignType(responseParameter.getSign_type());
            record.setSign(responseParameter.getSign());
            logger.debug("########################################################################################基础赋值操作结束");
            //对象赋值操作
            logger.debug("########################################################################################对象赋值操作开始");
            record.setRetcode(responseParameter.getRetcode());
            record.setRetmsg(responseParameter.getRetmsg());
            record.setPartner(responseParameter.getPartner());
            record.setSubpartner(responseParameter.getSubpartner());
            record.setTransactionId(responseParameter.getTransaction_id());
            record.setOutRefundNo(responseParameter.getOut_refund_no());
            record.setRefundId(responseParameter.getRefund_id());
            record.setRefundChannel(responseParameter.getRefund_channel());
            record.setRefundFee(responseParameter.getRefund_fee());
            record.setRefundStatus(responseParameter.getRefund_status());
            record.setRecvUserId(responseParameter.getRecv_user_id());
            record.setReccvUserName(responseParameter.getReccv_user_name());
            record.setTimeEnd(responseParameter.getTime_end());
            logger.debug("#######################################################################################对象赋值操作结束");
            //调用service，插入对象
            logger.debug("###########################################################################调用service，插入日志表对象开始");
            int num = ePayService.saveInvokeLog(record);
            logger.debug("#############################################################调用service，插入日志表对象结束，影响条数：" + num);
            logger.debug("#########################################################################################日志表插入结束");
            /////////////////////////////////////////////////////////////////////////////////////////
            logger.debug("########################################################################################流水表插入开始");
            //声明流水表对象
            TransactionJournal transactionJournal = new TransactionJournal();
            //对象赋值操作
            logger.debug("#################################################################################流水表对象赋值操作开始");
            transactionJournal.setTradeChannel("1");//交易渠道：1-百合易付 2-支付宝 3-微信 99-其他
            transactionJournal.setRetcode(responseParameter.getRetcode());
            transactionJournal.setRetmsg(responseParameter.getRetmsg());
            transactionJournal.setPartner(responseParameter.getPartner());
            transactionJournal.setSubpartner(responseParameter.getSubpartner());
            transactionJournal.setTransactionId(responseParameter.getTransaction_id());
            transactionJournal.setOutRefundNo(responseParameter.getOut_refund_no());
            transactionJournal.setRefundId(responseParameter.getRefund_id());
            transactionJournal.setRefundChannel(responseParameter.getRefund_channel());
            transactionJournal.setRefundFee(responseParameter.getRefund_fee());
            transactionJournal.setRefundStatus(responseParameter.getRefund_status());
            transactionJournal.setRecvUserId(responseParameter.getRecv_user_id());
            transactionJournal.setReccvUserName(responseParameter.getReccv_user_name());
            transactionJournal.setTimeEnd(responseParameter.getTime_end());
            transactionJournal.setTradeType("0002");//交易类型：百合易付（0001-支付交易  0002 – 退款交易）
            transactionJournal.setCreateTime(DateUtil.parseDate(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")));
            logger.debug("###################################################################################流水表对象赋值操作结束");
            //调用service，插入对象
            logger.debug("###############################################################################调用service，插入流水表开始");
            int num2 = ePayService.saveTransactionJournal(transactionJournal);
            logger.debug("################################################################调用service，插入流水表结束，影响条数：" + num2);
            logger.debug("#########################################################################################流水表插入结束");
            /**
             * *****************************************************************************************
             */
            logger.debug("###########################################################################给回调接口发送接收成功结果开始");
            //给回调接口发送接收成功结果
            response.reset();
            PrintWriter out = response.getWriter();
            out.write("success");
            logger.debug("################################################################给回调接口发送接收成功结果字符串" + "success");
            logger.debug("##########################################################################给回调接口发送接收成功结果结束");
            /**
             * *******************************************************************************************
             */
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            logger.debug("####################################################################支付回调失败，异常信息：" + e.toString());
        }
    }

    /**
     * @param @param  requestParameter
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: accountdownload
     * @Description: TODO(对账单下载接口)
     * 商户对指定日期的对账单发起查询，三维易付实时返回该天订单的信息。接口只能下载昨天及昨天之前的对账单
     */
    @RequestMapping(value = "/accountdownload", consumes = "application/xml", method = RequestMethod.POST)
    @ResponseBody
    public String accountdownload(@RequestBody RequestParameter requestParameter) {
        logger.debug("#############################################################执行百合易付对账单下载接口accountdownload方法开始");
        logger.debug("##########################################################################接收到的body值：" + requestParameter);
        String resultStr = null;
        String str = null;
        String errorString = null;
        logger.debug("##########################################################读取百合易付支付配置表开始");
        example.or().andDeleteFlagEqualTo(0);
        epayConfigs = ePayService.getConfigList(example);
        logger.debug("#########################################获取到的支付配置表数据记录条数" + epayConfigs.size());
        if (epayConfigs.size() == 0) {
            errorString = "支付配置表没有配置！";
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
            logger.debug("支付配置表没有配置");
        } else if (epayConfigs.size() == 1) {
            logger.debug("#########################################################获取到的支付配置表唯一一条记录，支付开始");
            ObjectMapper mapper = new ObjectMapper(); //转换器
            //全局DeserializationFeature配置：配置该objectMapper在反序列化时，忽略目标对象没有的属性。凡是使用该objectMapper反序列化时，都会拥有该特性。
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            try {
                //将传入的Java类转换为Json串
                str = JSONUtil.objectToJson(requestParameter).toString();
                logger.debug("###############################################################################body值转换为Json串：" + str);
                RequestParameterForEpay requestParamForEpay = new RequestParameterForEpay();
                //准备查询赋值操作
                requestParamForEpay = (RequestParameterForEpay) mapper.readValue(str, RequestParameterForEpay.class);
                //准备查询赋值操作
                requestParamForEpay.setService("account_ download_service");  //服务名称
                requestParamForEpay.setService_version("1.0"); //版本号
                requestParamForEpay.setInput_charset("UTF-8");  //字符集
                requestParamForEpay.setSign_type("MD5");//签名算法
                Map<String, String> params = new HashMap<String, String>();
                params = ClassUtil.setConditionMap(requestParamForEpay);
                //签名有两个步骤，先按一定规则拼接要签名的原始串，再选择具体的算法和密钥计算出签名结果。
                //拼原始串
                Map<String, String> filterMap = EpayMD5.paraFilter(params);
                String linkStr = EpayMD5.createLinkString(filterMap);
                logger.debug("#############################################################################MD5签名拼原始串的值：" + linkStr);
                //签名（签名时要把三维易付分配给商户的私钥（key）加入进行MD5签名）
                String sign = EpayMD5.sign(linkStr, ConstantsUtil.SIGN_KEY_TEST, "UTF-8");
                logger.debug("####################################################################私钥（key）加入进行MD5签名后的值：" + sign);
                params.put("sign", sign);//将签名结果放入map
                //发送POST请求，返回XML结果
                resultStr = HttpUtil.sendPostMap(epayConfigs.get(0).getAccountDownloadGateUrl(), params, "UTF-8", false);
                logger.debug("############################################################执行HTTP POST 请求后得到的XML返回结果：" + resultStr);
                if (null == resultStr || "".equals(resultStr)) {
                    errorString = "接口异常！返回数据为空，请检查接口是否可用；接口地址：" + epayConfigs.get(0).getAccountDownloadGateUrl();
                    resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                    logger.debug("#########################################################################################" + errorString);
                } else {
                    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("########################################################################################对象赋值操作开始");
                    Epay epay = JaxbUtil.converyToJavaBean(resultStr, Epay.class);
                    record.setRetcode(epay.getRetcode());
                    record.setRetmsg(epay.getRetmsg());
                    logger.debug("#######################################################################################对象赋值操作结束");
                    //调用service，插入对象
                    logger.debug("###########################################################################调用service，插入日志表对象开始");
                    int num = ePayService.saveInvokeLog(record);
                    logger.debug("#############################################################调用service，插入日志表对象结束，影响条数：" + num);
                    logger.debug("#########################################################################################日志表插入结束");
                }
            } catch (JSONException e) {
                errorString = "数据转换错误(JSONException)！";
                resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                logger.debug("################################################################数据转换错误(JSONException)：" + e.toString());
            } catch (IOException e) {
                errorString = "流异常(IOException)！";
                resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                logger.debug("#######################################################################流异常(IOException)：" + e.toString());
            }
        } else {
            errorString = "支付配置表存在多条记录！";
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
            logger.debug("################################################################################支付配置表存在多条记录");
        }
        logger.debug("###########################################################执行百合易付对账单下载接口accountdownload方法结束");
        return resultStr;
    }


    /**
     * @param @param  requestParameter
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: notifyIdSearch
     * @Description: TODO(通知ID查询接口 ：)
     * 对于商户系统支付的订单，返回支付结果时，如果返回的notify_id字段不为空，
     * 商户系统通过商户号+notify_id的方式调用该查询接口，不需要签名，来验证是否来自三维易付的请求。
     * 建议商户系统获取支付结果时，先调用此接口，返回成功时，再验证签名是否正确。二者都验证都通过后，再进行业务数据处理
     */
    @RequestMapping(value = "/notifyidsearch", consumes = "application/xml", method = RequestMethod.POST)
    @ResponseBody
    public String notifyIdSearch(@RequestBody RequestParameter requestParameter) {
        logger.debug("#################################################################执行百合易付通知ID查询接口notifyIdSearch方法开始");
        logger.debug("###########################################################################接收到的body值：" + requestParameter);
        String resultStr = null;
        String str = null;
        String errorString = null;
        logger.debug("##########################################################读取百合易付支付配置表开始");
        example.or().andDeleteFlagEqualTo(0);
        epayConfigs = ePayService.getConfigList(example);
        logger.debug("#########################################获取到的支付配置表数据记录条数" + epayConfigs.size());
        if (epayConfigs.size() == 0) {
            errorString = "支付配置表没有配置！";
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
            logger.debug("支付配置表没有配置");
        } else if (epayConfigs.size() == 1) {
            logger.debug("#########################################################获取到的支付配置表唯一一条记录，支付开始");
            ObjectMapper mapper = new ObjectMapper(); //转换器
            //全局DeserializationFeature配置：配置该objectMapper在反序列化时，忽略目标对象没有的属性。凡是使用该objectMapper反序列化时，都会拥有该特性。
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            try {
                //将传入的Java类转换为Json串
                str = JSONUtil.objectToJson(requestParameter).toString();
                logger.debug("#################################################################################body值转换为Json串：" + str);
                RequestParameterForEpay requestParamForEpay = new RequestParameterForEpay();
                //准备支付赋值操作
                requestParamForEpay = (RequestParameterForEpay) mapper.readValue(str, RequestParameterForEpay.class);
                Map<String, String> params = new HashMap<String, String>();
                params = ClassUtil.setConditionMap(requestParamForEpay);
                //发送POST请求，返回XML结果
                resultStr = HttpUtil.sendPostMap(epayConfigs.get(0).getNotifyidGateUrl(), params, "UTF-8", false);
                logger.debug("###########################################################执行HTTP POST 请求后得到的XML返回结果：" + resultStr);
                if (null == resultStr || "".equals(resultStr)) {
                    errorString = "接口异常！返回数据为空，请检查接口是否可用；接口地址：" + epayConfigs.get(0).getNotifyidGateUrl();
                    resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                    logger.debug("#########################################################################################" + errorString);
                } else {
                    //do nothing
                }
            } catch (JSONException e) {
                errorString = "数据转换错误(JSONException)！";
                resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                logger.debug("################################################################数据转换错误(JSONException)：" + e.toString());
            } catch (IOException e) {
                errorString = "流异常(IOException)！";
                resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
                logger.debug("########################################################################流异常(IOException)：" + e.toString());
            }
        } else {
            errorString = "支付配置表存在多条记录！";
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
            logger.debug("################################################################################支付配置表存在多条记录");
        }
        logger.debug("##############################################################执行百合易付通知ID查询接口notifyIdSearch方法结束");
        return resultStr;
    }

    /**
     * @param @param  requestParameter
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: mySign
     * @Description: TODO(获取签名接口 ： 根据不同的服务类型 ， 传入参数 ， 获取签名值 ， 以便比对)
     */
    @RequestMapping(value = "/mysgin", consumes = "application/xml", method = RequestMethod.POST)
    @ResponseBody
    public String mySign(@RequestBody RequestParameter requestParameter) {
        logger.debug("########################################################################执行百合易付获取签名mysgin方法开始");
        logger.debug("########################################################################接收到的body值：" + requestParameter);
        String resultStr = null;
        String str = null;
        String errorString = null;
        ObjectMapper mapper = new ObjectMapper(); //转换器
        //全局DeserializationFeature配置：配置该objectMapper在反序列化时，忽略目标对象没有的属性。凡是使用该objectMapper反序列化时，都会拥有该特性。
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        try {
            //将传入的Java类转换为Json串
            str = JSONUtil.objectToJson(requestParameter).toString();
            logger.debug("##############################################################################body值转换为Json串：" + str);
            RequestParameterForEpay requestParamForEpay = new RequestParameterForEpay();
            //准备签名赋值操作
            requestParamForEpay = (RequestParameterForEpay) mapper.readValue(str, RequestParameterForEpay.class);
            //准备签名赋值操作
            requestParamForEpay.setService("refund_service");  //服务名称
            requestParamForEpay.setService_version("1.0"); //版本号
            requestParamForEpay.setInput_charset("UTF-8");  //字符集
            requestParamForEpay.setSign_type("MD5");//签名算法
            Map<String, String> params = new HashMap<String, String>();
            params = ClassUtil.setConditionMap(requestParamForEpay);
            //签名有两个步骤，先按一定规则拼接要签名的原始串，再选择具体的算法和密钥计算出签名结果。
            //拼原始串
            Map<String, String> filterMap = EpayMD5.paraFilter(params);
            String linkStr = EpayMD5.createLinkString(filterMap);
            logger.debug("#############################################################################MD5签名拼原始串的值：" + linkStr);
            //签名（签名时要把三维易付分配给商户的私钥（key）加入进行MD5签名）
            String sign = EpayMD5.sign(linkStr, ConstantsUtil.SIGN_KEY_TEST, "UTF-8");
            logger.debug("####################################################################私钥（key）加入进行MD5签名后的值：" + sign);
            resultStr = sign;
        } catch (JSONException e) {
            errorString = "数据转换错误(JSONException)！";
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
            logger.debug("################################################################数据转换错误(JSONException)：" + e.toString());
        } catch (IOException e) {
            errorString = "流异常(IOException)！";
            resultStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <epay> <retcode>" + "-1" + "</retcode><retmsg>" + errorString + "</retmsg></epay> ";
            logger.debug("########################################################################流异常(IOException)：" + e.toString());
        }
        logger.debug("#########################################################################执行百合易付获取签名mysgin方法结束");
        return resultStr;
    }

    /**
     * @param @return 设定文件
     * @return String    返回类型
     * @throws
     * @Title: getWebappsURL
     * @Description: TODO(获取tomcat发布目录webapps路径)
     */
    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;
    }

}
