package com.platform.controller.epay;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;
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 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.InterfaceInvokeLog;
import com.platform.request.json.RequestParameter;
import com.platform.request.json.RequestParameterForEpay;
import com.platform.response.json.ResponseParameter;
import com.platform.response.json.ResponseParameterForInsert;
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;

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

@Controller
@RequestMapping("/epayjson")
public class EPayJsonController {
	//定义日志文件操作类对象
	private static Logger logger =(Logger) LoggerFactory.getLogger(EPayJsonController.class);
	@Resource
	private IEPayService ePayService;
	
	/**
	 * 
	* @Title: pay 
	* @Description: TODO(百合易付支付下单接口) 
	* @param @param requestParameter
	* @param @return    设定文件 
	* @return String    返回类型 
	* @throws
	 */
	@RequestMapping(value="/pay",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;
		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("unifiedorder_service");  //服务名称	 
			requestParamForEpay.setService_version("2.0"); //版本号
			requestParamForEpay.setInput_charset("UTF-8");  //字符集
			requestParamForEpay.setSign_type("MD5");//签名算法
			requestParamForEpay.setFee_type("1");//人民币
			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(ConstantsUtil.PAY_REQUEST_TEST_URL, params, "UTF-8",false);
			logger.debug("执行HTTP POST 请求后得到的XML返回结果："+resultStr);
			if(null==resultStr || "".equals(resultStr)){
				errorString="接口异常！返回数据为空，请检查接口是否可用；接口地址："+ConstantsUtil.PAY_REQUEST_TEST_URL;
				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("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 (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("执行百合易付支付下单接口pay方法结束@@@@@@@@@@@");
		
		return resultStr;
	}
	
	/**
	 * 
	* @Title: refund 
	* @Description: TODO(百合易付退款接口) 
	* @param @param requestParameter
	* @param @return    设定文件 
	* @return String    返回类型 
	* @throws
	 */
	@RequestMapping(value="/refund",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;
		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);
			params.put("sign",sign);//将签名结果放入map
			//发送POST请求，返回XML结果
			resultStr=HttpUtil.sendPostMap(ConstantsUtil.REFUND_REQUEST_TEST_URL, params, "UTF-8",false);
			logger.debug("执行HTTP POST 请求后得到的XML返回结果："+resultStr);
			if(null==resultStr || "".equals(resultStr)){
				errorString="接口异常！返回数据为空，请检查接口是否可用；接口地址："+ConstantsUtil.REFUND_REQUEST_TEST_URL;
				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("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("执行百合易付退款接口refund方法结束@@@@@@@@@@@");
		} 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("执行百合易付退款接口refund方法结束@@@@@@@@@@@");
		return resultStr;
	}
	
	/**
	 * 
	* @Title: search 
	* @Description: TODO(百合易付订单查询接口) 
	* @param @param requestParameter
	* @param @return    设定文件 
	* @return String    返回类型 
	* @throws
	 */
	@RequestMapping(value="/search",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;
		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("query_order_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(ConstantsUtil.SEARCH_REQUEST_TEST_URL, params, "UTF-8",false);
			logger.debug("执行HTTP POST 请求后得到的XML返回结果："+resultStr);
			if(null==resultStr || "".equals(resultStr)){
				errorString="接口异常！返回数据为空，请检查接口是否可用；接口地址："+ConstantsUtil.SEARCH_REQUEST_TEST_URL;
				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(Float.parseFloat(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);
					logger.debug("执行百合易付订单查询接口search方法结束@@@@@@@@@@@");
		        }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());
		}
		logger.debug("执行百合易付订单查询接口search方法结束@@@@@@@@@@@");
		return resultStr;
	}
	
	/**
	 * 
	* @Title: paynotify 
	* @Description: TODO(百合易付支付异步通知接口) 
	* @param @param responseParameter
	* @param @param response
	* @param @return    设定文件 
	* @return String    返回类型 
	* @throws
	 */
	@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());
			record.setTotalFee(Float.parseFloat(responseParameter.getTotal_fee()));
			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("日志表插入结束@@@@@@@@@@@@@@");
			/**
			 * *****************************************************************************************
			 */
			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());
		}
	}
	
	/**
	 * 
	* @Title: refundnotify 
	* @Description: TODO(百合易付退款异步通知接口方法) 
	* @param @param responseParameter
	* @param @param response    设定文件 
	* @return void    返回类型 
	* @throws
	 */
	@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-退款回调  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("给回调接口发送接收成功结果开始@@@@@@@@@@@");
			//给回调接口发送接收成功结果
			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());
		}
	}
	
	/**
	 * 
	* @Title: accountdownload 
	* @Description: TODO(对账单下载接口)
	* 商户对指定日期的对账单发起查询，三维易付实时返回该天订单的信息。接口只能下载昨天及昨天之前的对账单 
	* @param @param requestParameter
	* @param @return    设定文件 
	* @return String    返回类型 
	* @throws
	 */
	@RequestMapping(value="/accountdownload",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;
		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(ConstantsUtil.ACCOUNT_DOWNLOAD_TEST_URL, params, "UTF-8",false);
			logger.debug("执行HTTP POST 请求后得到的XML返回结果："+resultStr);
			if(null==resultStr || "".equals(resultStr)){
				errorString="接口异常！返回数据为空，请检查接口是否可用；接口地址："+ConstantsUtil.ACCOUNT_DOWNLOAD_TEST_URL;
				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());
		}
		logger.debug("执行百合易付对账单下载接口accountdownload方法结束@@@@@@@@@@@");
		return resultStr;
	}
	
	
	
	/**
	 * 
	* @Title: notifyIdSearch 
	* @Description: TODO(通知ID查询接口：) 
	* 对于商户系统支付的订单，返回支付结果时，如果返回的notify_id字段不为空，
	* 商户系统通过商户号+notify_id的方式调用该查询接口，不需要签名，来验证是否来自三维易付的请求。
	* 建议商户系统获取支付结果时，先调用此接口，返回成功时，再验证签名是否正确。二者都验证都通过后，再进行业务数据处理
	* @param @param requestParameter
	* @param @return    设定文件 
	* @return String    返回类型 
	* @throws
	 */
	@RequestMapping(value="/notifyidsearch",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;
		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(ConstantsUtil.NOTIFYID_SEARCH_TEST_URL, params, "UTF-8",false);
			logger.debug("执行HTTP POST 请求后得到的XML返回结果："+resultStr);
			if(null==resultStr || "".equals(resultStr)){
				errorString="接口异常！返回数据为空，请检查接口是否可用；接口地址："+ConstantsUtil.NOTIFYID_SEARCH_TEST_URL;
				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());
		}
		logger.debug("执行百合易付通知ID查询接口notifyIdSearch方法结束@@@@@@@@@@@");
		return resultStr;
	}
	
	/**
	 *
	* @Title: mySign 
	* @Description: TODO(获取签名接口：根据不同的服务类型，传入参数，获取签名值，以便比对) 
	* @param @param requestParameter
	* @param @return    设定文件 
	* @return String    返回类型 
	* @throws
	 */
	@RequestMapping(value="/mysgin",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;
	}
	
	

}
