package com.hehenian.biz.facade.account.chinapnr;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import com.hehenian.biz.common.trade.IParameterLogService;
import com.hehenian.biz.common.trade.dataobject.ParameterLogDo;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.hehenian.biz.common.exception.BusinessException;
import com.hehenian.biz.common.util.CalculateUtils;
import com.hehenian.biz.common.util.DateUtil;
import com.hehenian.biz.common.util.FormUtil;
import com.hehenian.biz.common.util.HttpClientUtils;
import com.hehenian.biz.facade.account.AbstractAccountManager;
import com.hehenian.biz.facade.account.ITradeManager;
import com.hehenian.biz.facade.account.parameter.InParameter;
import com.hehenian.biz.facade.account.parameter.OutParameter;
import com.ibm.icu.text.DecimalFormat;
@Component("chinaPnrTradeManager")
public class ChinaPnrTradeManager extends AbstractAccountManager implements ITradeManager {
private final Logger logger = Logger.getLogger(this.getClass());
private final String NEW_VERSION = "20";
@Autowired
private IParameterLogService parameterLogService;
@Override
public OutParameter cash(InParameter inParameter) {
try {
Map<String, String> params = new LinkedHashMap<String, String>();
params.put("Version", chinaPnrConfig.getVersion());// 接口版本号
params.put("CmdId", "Cash");// 消息类型
params.put("MerCustId", chinaPnrConfig.getMerCustId());// 商户号
params.put("OrdId", inParameter.getOrdId());
params.put("UsrCustId", (String) inParameter.getParams().get("usrCustId"));
params.put("TransAmt", (String) inParameter.getParams().get("transAmt"));
Double servFee = (Double) inParameter.getParams().get("servFee");
if (params.get("Version").equals(NEW_VERSION) && servFee != null && CalculateUtils.gt(servFee, 0)) {
params.put("ServFee", new DecimalFormat("#0.00").format(servFee));// 提现服务费
params.put("ServFeeAcctId", chinaPnrConfig.getFeeAccount());// 提现账号
}
params.put("OpenAcctId", (String) inParameter.getParams().get("openAcctId"));
params.put("RetUrl", getRetUrl(inParameter.getRetUrl()));
params.put("BgRetUrl", getBgRetUrl(inParameter.getBgRetUrl()));
params.put("Remark", "hhnCash");// 取现描述,长度有限(64 个汉字)
params.put("MerPriv", "Cash");// 商户私有域
params.put("ChkValue", getChkValue(params));// 设置请求签名
params.put("CharSet", DEFAULT_CHARSET);
logger.info("提现请求参数:" + params);
parameterLogService.addParameterLog(params, ParameterLogDo.ParameterType.REQU);// 记录交易参数
String htmlText = FormUtil.buildHtmlForm(params, chinaPnrConfig.getGateway(), "post");
OutParameter outParameter = new OutParameter();
outParameter.setSuccess(true);
outParameter.getParams().put("htmlText", htmlText);
return outParameter;
} catch (BusinessException e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter(e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter("提现申请失败!");
}
}
@Override
public OutParameter usrFreezeBg(InParameter inParameter) {
try {
Map<String, String> params = new LinkedHashMap<String, String>();
params.put("Version", chinaPnrConfig.getVersion());// 版本
params.put("CmdId", "UsrFreezeBg");// 消息类型
params.put("MerCustId", chinaPnrConfig.getMerCustId());// 商户号
params.put("UsrCustId", (String) inParameter.getParams().get("usrCustId"));// 商户客户号,汇付生成,用户的唯一性标识
params.put("SubAcctType", "");// 子账号类型
params.put("SubAcctId", "");// 子账户号
params.put("OrdId", inParameter.getOrdId());// 订单号
params.put("OrdDate", DateFormatUtils.format(new Date(), "yyyyMMdd"));
params.put("TransAmt", (String) inParameter.getParams().get("transAmt"));
params.put("RetUrl", "");
params.put("BgRetUrl", getBgRetUrl(inParameter.getBgRetUrl()));
params.put("MerPriv", "UsrFreezeBg");
params.put("ChkValue", getChkValue(params));// 设置请求签名
parameterLogService.addParameterLog(params, ParameterLogDo.ParameterType.REQU);// 记录交易参数
String jsonString = HttpClientUtils.post(chinaPnrConfig.getGateway(), params);
OutParameter outParameter = getSuccessOutParameter(jsonString);
parameterLogService.addParameterLog(outParameter.getParams(), ParameterLogDo.ParameterType.RESP);// 记录交易参数
return outParameter;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter("冻结账户资金失败!");
}
}
@Override
public OutParameter usrUnFreeze(InParameter inParameter) {
try {
Map<String, String> params = new LinkedHashMap<String, String>();
params.put("Version", chinaPnrConfig.getVersion());
params.put("CmdId", "UsrUnFreeze");
params.put("MerCustId", chinaPnrConfig.getMerCustId());
params.put("OrdId", inParameter.getTrxId()); // 订单号
params.put("OrdDate", DateFormatUtils.format(new Date(), "yyyyMMdd"));
params.put("TrxId", inParameter.getTrxId());// 商户平台交易唯一定长18位
params.put("RetUrl", "");
params.put("BgRetUrl", getBgRetUrl(inParameter.getBgRetUrl()));
params.put("MerPriv", "UsrUnFreeze");
params.put("ChkValue", getChkValue(params));// 设置请求签名
parameterLogService.addParameterLog(params, ParameterLogDo.ParameterType.REQU);// 记录交易参数
String jsonString = HttpClientUtils.post(chinaPnrConfig.getGateway(), params);
OutParameter outParameter = getSuccessOutParameter(jsonString);
parameterLogService.addParameterLog(outParameter.getParams(), ParameterLogDo.ParameterType.RESP);// 记录交易参数
return outParameter;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter("解冻账户资金失败!");
}
}
@Override
public OutParameter cashAudit(InParameter inParameter) {
try {
Map<String, String> params = new LinkedHashMap<String, String>();
params.put("Version", chinaPnrConfig.getVersion());
params.put("CmdId", "CashAudit");
params.put("MerCustId", chinaPnrConfig.getMerCustId());
params.put("OrdId", inParameter.getOrdId());
params.put("UsrCustId", (String) inParameter.getParams().get("usrCustId"));
params.put("TransAmt", (String) inParameter.getParams().get("transAmt"));
params.put("AuditFlag", (String) inParameter.getParams().get("auditFlag"));
params.put("RetUrl", "");
params.put("BgRetUrl", getBgRetUrl(inParameter.getBgRetUrl()));
params.put("MerPriv", "CashAudit");
params.put("ChkValue", getChkValue(params));// 设置请求签名
parameterLogService.addParameterLog(params, ParameterLogDo.ParameterType.REQU);// 记录交易参数
String jsonString = HttpClientUtils.post(chinaPnrConfig.getGateway(), params);
OutParameter outParameter = getSuccessOutParameter(jsonString);
parameterLogService.addParameterLog(outParameter.getParams(), ParameterLogDo.ParameterType.RESP);// 记录交易参数
return outParameter;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter("提现复核失败!");
}
}
@Override
public OutParameter netSave(InParameter inParameter) {
try {
Map<String, String> params = new LinkedHashMap<String, String>();
params.put("Version", chinaPnrConfig.getVersion());
params.put("CmdId", "NetSave");
params.put("MerCustId", chinaPnrConfig.getMerCustId());
params.put("UsrCustId", (String) inParameter.getParams().get("usrCustId"));
params.put("OrdId", inParameter.getOrdId());
params.put("OrdDate", (String) inParameter.getParams().get("OrdDate"));
params.put("GateBusiId", (String) inParameter.getParams().get("gateBusiId"));
params.put("OpenBankId", (String) inParameter.getParams().get("OpenBankId"));
params.put("DcFlag", (String) inParameter.getParams().get("DcFlag"));
params.put("TransAmt", (String) inParameter.getParams().get("transAmt"));
params.put("RetUrl", getRetUrl(inParameter.getRetUrl()));
params.put("BgRetUrl", getBgRetUrl(inParameter.getBgRetUrl()));
params.put("MerPriv", (String) inParameter.getParams().get("MerPriv"));
params.put("ChkValue", getChkValue(params));// 设置请求签名
parameterLogService.addParameterLog(params, ParameterLogDo.ParameterType.REQU);// 记录交易参数
String htmlText = FormUtil.buildHtmlForm(params, chinaPnrConfig.getGateway(), "post");
OutParameter outParameter = new OutParameter();
outParameter.setSuccess(true);
outParameter.getParams().put("htmlText", htmlText);
return outParameter;
} catch (BusinessException e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter(e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter("充值失败!");
}
}
@Override
public OutParameter posWhSave(InParameter inParameter) {
// TODO Auto-generated method stub
return null;
}
@Override
public OutParameter initiativeTender(InParameter inParameter) {
try {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("Version", "20");
map.put("CmdId", "InitiativeTender");
map.put("MerCustId", chinaPnrConfig.getMerCustId());
map.put("OrdId", inParameter.getOrdId());
map.put("OrdDate", (String) inParameter.getParams().get("OrdDate"));
map.put("TransAmt", (String) inParameter.getParams().get("TransAmt"));
map.put("UsrCustId", (String) inParameter.getParams().get("UsrCustId"));
map.put("MaxTenderRate", "0.10"); // 最大投资手 续费率
map.put("BorrowerDetails", (String) inParameter.getParams().get("BorrowerDetails")); // 借款人信息
// ,
// 变长
map.put("IsFreeze", "Y");
map.put("FreezeOrdId", (String) inParameter.getParams().get("FreezeOrdId"));
map.put("RetUrl", getRetUrl(inParameter.getRetUrl()));
map.put("BgRetUrl", getBgRetUrl(inParameter.getBgRetUrl()));
map.put("MerPriv", (String) inParameter.getParams().get("borrowId"));
map.put("ReqExt", "");
map.put("ChkValue", getChkValue(map));// 设置请求签名
parameterLogService.addParameterLog(map, ParameterLogDo.ParameterType.REQU);// 记录交易参数
String htmlText = FormUtil.buildHtmlForm(map, chinaPnrConfig.getGateway(), "post");
OutParameter outParameter = new OutParameter();
outParameter.setSuccess(true);
outParameter.getParams().put("htmlText", htmlText);
return outParameter;
} catch (BusinessException e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter(e.getMessage());
}
}
@Override
public OutParameter autoTender(InParameter inParameter) {
// TODO Auto-generated method stub
return null;
}
@Override
public OutParameter tenderCancle(InParameter inParameter) {
// TODO Auto-generated method stub
return null;
}
@Override
public OutParameter autoTenderPlan(InParameter inParameter) {
// TODO Auto-generated method stub
return null;
}
@Override
public OutParameter autoTenderPlanClose(InParameter inParameter) {
// TODO Auto-generated method stub
return null;
}
@Override
public OutParameter loans(InParameter inParameter) {
try {
Map<String, String> params = new LinkedHashMap<String, String>();
params.put("Version", chinaPnrConfig.getVersion());
params.put("CmdId", "Loans");
params.put("MerCustId", chinaPnrConfig.getMerCustId());
params.put("OrdId", inParameter.getOrdId());
String ordDate = DateFormatUtils.format((Date) inParameter.getParams().get("OrdDate"), "yyyyMMdd");
params.put("OrdDate", ordDate);
params.put("OutCustId", (Long) inParameter.getParams().get("OutCustId") + "");
String transAmt = new DecimalFormat("##0.00").format((Double) inParameter.getParams().get("TransAmt"));
params.put("TransAmt", transAmt);
String fee = new DecimalFormat("##0.00").format((Double) inParameter.getParams().get("Fee"));
params.put("Fee", fee);
params.put("SubOrdId", inParameter.getOrdId());
params.put("SubOrdDate", ordDate);
params.put("InCustId", (Long) inParameter.getParams().get("InCustId") + "");
params.put("DivDetails", (String) inParameter.getParams().get("DivDetails"));
params.put("IsDefault", (String) inParameter.getParams().get("IsDefault"));
params.put("BgRetUrl", getBgRetUrl(inParameter.getBgRetUrl()));
params.put("MerPriv", "Loans");
params.put("ChkValue", getChkValue(params));// 设置请求签名
parameterLogService.addParameterLog(params, ParameterLogDo.ParameterType.REQU);// 记录交易参数
String jsonString = HttpClientUtils.post(chinaPnrConfig.getGateway(), params);
OutParameter outParameter = getSuccessOutParameter(jsonString);
parameterLogService.addParameterLog(outParameter.getParams(), ParameterLogDo.ParameterType.RESP);// 记录交易参数
return outParameter;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter("放款失败!");
}
}
@Override
public OutParameter repayment(InParameter inParameter) {
String jsonString = "";
Map<String, String> params = new LinkedHashMap<String, String>();
try {
params.put("Version", "20");
params.put("CmdId", "Repayment");
params.put("MerCustId", chinaPnrConfig.getMerCustId());
params.put("OrdId", inParameter.getOrdId());
String OrdDate = DateUtil.dateToYMD(new Date());
params.put("OrdDate", OrdDate);
params.put("OutCustId", (String) inParameter.getParams().get("OutCustId"));// 出账客户号
params.put("SubOrdId", (String) inParameter.getParams().get("SubOrdId"));// 订单号
// 变长
// 20
// 位
// 由商户的系统生成,必须保证唯一。
params.put("SubOrdDate", (String) inParameter.getParams().get("SubOrdDate"));// 关联投标订单流水日期是
params.put("OutAcctId", (String) inParameter.getParams().get("OutAcctId"));// 出账子账户
params.put("TransAmt", (String) inParameter.getParams().get("TransAmt"));// 金额
params.put("Fee", (String) inParameter.getParams().get("Fee"));// Fee
// 扣款手续费,
// 放款或扣款的手续费
params.put("InCustId", (String) inParameter.getParams().get("InCustId"));// 入账客户号
params.put("InAcctId", (String) inParameter.getParams().get("InAcctId"));// 入账子账户
params.put("DivDetails", (String) inParameter.getParams().get("DivDetails"));// 分账账户串
// 变长
// FeeObjectFlag = 定长 1 位 I:向入款客户号InCustId收取 O:向出款客户号OutCustId收取
params.put("FeeObjFlag", "O");// 商户可以选择向借款人或者还款人收取手续
params.put("BgRetUrl", getBgRetUrl(inParameter.getBgRetUrl()));
params.put("MerPriv", (String) inParameter.getParams().get("MerPriv"));
params.put("ChkValue", getChkValue(params));// 设置请求签名
params.put("CharSet", DEFAULT_CHARSET);
parameterLogService.addParameterLog(params, ParameterLogDo.ParameterType.REQU);// 记录交易参数
logger.info("调用汇付回款开始, 参数:" + params);
jsonString = HttpClientUtils.post(chinaPnrConfig.getGateway(), params);
OutParameter outParameter = getSuccessOutParameter(jsonString);
parameterLogService.addParameterLog(outParameter.getParams(), ParameterLogDo.ParameterType.RESP);// 记录交易参数
return outParameter;
} catch (Throwable e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter("还款失败!");
} finally {
logger.info("调用汇付回款结束, 参数:" + params + "; 汇付返回结果:" + jsonString);
}
}
@Override
public OutParameter transfer(InParameter inParameter) {
try {
Map<String, String> params = new LinkedHashMap<String, String>();
params.put("Version", chinaPnrConfig.getVersion());
params.put("CmdId", "Transfer");
params.put("OrdId", inParameter.getOrdId());
params.put("OutCustId", (String) inParameter.getParams().get("OutCustId"));
params.put("OutAcctId", (String) inParameter.getParams().get("OutAcctId"));
Double transAmt = (Double) inParameter.getParams().get("TransAmt");
params.put("TransAmt", new DecimalFormat("##0.00").format(transAmt));
params.put("InCustId", (String) inParameter.getParams().get("InCustId"));
params.put("InAcctId", (String) inParameter.getParams().get("InAcctId"));
params.put("RetUrl", "");
params.put("BgRetUrl", getBgRetUrl(inParameter.getBgRetUrl()));
params.put("MerPriv", "Transfer");
params.put("ChkValue", getChkValue(params));// 设置请求签名
params.put("CharSet", DEFAULT_CHARSET);
String jsonString = HttpClientUtils.post(chinaPnrConfig.getGateway(), params);
OutParameter outParameter = getSuccessOutParameter(jsonString);
parameterLogService.addParameterLog(outParameter.getParams(), ParameterLogDo.ParameterType.RESP);// 记录交易参数
return outParameter;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter("提现复核失败!");
}
}
@Override
public OutParameter usrAcctPay(InParameter inParameter) {
// TODO Auto-generated method stub
return null;
}
@Override
public OutParameter merCash(InParameter inParameter) {
try {
Map<String, String> params = new LinkedHashMap<String, String>();
params.put("Version", chinaPnrConfig.getVersion());
params.put("CmdId", "MerCash");
params.put("MerCustId", chinaPnrConfig.getMerCustId());
params.put("OrdId", inParameter.getOrdId());
params.put("UsrCustId", (String) inParameter.getParams().get("usrCustId"));
Double transAmt = (Double) inParameter.getParams().get("transAmt");
params.put("TransAmt", new DecimalFormat("##0.00").format(transAmt));
params.put("RetUrl", "");
params.put("BgRetUrl", getBgRetUrl(inParameter.getBgRetUrl()));
params.put("Remark", (String) inParameter.getParams().get("remark"));
params.put("MerPriv", "MerCash");
params.put("ChkValue", getChkValue(params));// 设置请求签名
params.put("CharSet", DEFAULT_CHARSET);
parameterLogService.addParameterLog(params, ParameterLogDo.ParameterType.REQU);// 记录交易参数
String jsonString = HttpClientUtils.post(chinaPnrConfig.getGateway(), params);
OutParameter outParameter = getSuccessOutParameter(jsonString);
parameterLogService.addParameterLog(outParameter.getParams(), ParameterLogDo.ParameterType.RESP);// 记录交易参数
return outParameter;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter("提现复核失败!");
}
}
@Override
public OutParameter usrTransfer(InParameter inParameter) {
// TODO Auto-generated method stub
return null;
}
@Override
public OutParameter creditAssign(InParameter inParameter) {
try {
Map<String, String> params = new LinkedHashMap<String, String>();
params.put("Version", chinaPnrConfig.getVersion());
params.put("CmdId", "CreditAssign");
params.put("MerCustId", chinaPnrConfig.getMerCustId());
params.put("SellCustId", (Long) inParameter.getParams().get("SellCustId") + "");
DecimalFormat df = new DecimalFormat("##0.00");
params.put("CreditAmt", df.format((Double) inParameter.getParams().get("CreditAmt")));
params.put("CreditDealAmt", df.format((Double) inParameter.getParams().get("CreditDealAmt")));
params.put("BidDetails", (String) inParameter.getParams().get("BidDetails"));
params.put("Fee", (String) inParameter.getParams().get("Fee"));
params.put("DivDetails", (String) inParameter.getParams().get("DivDetails"));
params.put("BuyCustId", (Long) inParameter.getParams().get("BuyCustId") + "");
params.put("OrdId", inParameter.getOrdId());
params.put("OrdDate", (String) inParameter.getParams().get("OrdDate"));
params.put("RetUrl", getRetUrl(inParameter.getRetUrl()));
params.put("BgRetUrl", getBgRetUrl(inParameter.getBgRetUrl()));
params.put("MerPriv", (String) inParameter.getParams().get("MerPriv"));
params.put("ReqExt", "");
params.put("ChkValue", getChkValue(params));// 设置请求签名
parameterLogService.addParameterLog(params, ParameterLogDo.ParameterType.REQU);// 记录交易参数
logger.info("债权转让请求参数:" + params);
String htmlText = FormUtil.buildHtmlForm(params, chinaPnrConfig.getGateway(), "post");
htmlText = htmlText.replace("value=\"{\"BidDetails", "value='{\"BidDetails");
htmlText = htmlText.replace("}]}]}\"/>", "}]}]}'/>");
OutParameter outParameter = new OutParameter();
outParameter.setSuccess(true);
outParameter.getParams().put("htmlText", htmlText);
return outParameter;
} catch (BusinessException e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter(e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter("债权转让失败!");
}
}
@Override
public OutParameter autoCreditAssign(InParameter inParameter) {
// TODO Auto-generated method stub
return null;
}
@Override
public OutParameter fssTrans(InParameter inParameter) {
// TODO Auto-generated method stub
return null;
}
@Override
public OutParameter direcTrfAuth(InParameter inParameter) {
try {
Map<String, String> params = new LinkedHashMap<String, String>();
params.put("Version", chinaPnrConfig.getVersion());
params.put("CmdId", "DirecTrfAuth");
params.put("MerCustId", chinaPnrConfig.getMerCustId());
params.put("UsrCustId", (Long) inParameter.getParams().get("UsrCustId") + "");
params.put("InUsrCustId", (Long) inParameter.getParams().get("InUsrCustId") + "");
DecimalFormat df = new DecimalFormat("##0.00");
params.put("AuthAmt", df.format((Double) inParameter.getParams().get("AuthAmt")));
params.put("RetUrl", getRetUrl(inParameter.getRetUrl()));
params.put("ReqExt", "");
params.put("ChkValue", getChkValue(params));// 设置请求签名
parameterLogService.addParameterLog(params, ParameterLogDo.ParameterType.REQU);// 记录交易参数
String htmlText = FormUtil.buildHtmlForm(params, chinaPnrConfig.getGateway(), "post");
OutParameter outParameter = new OutParameter();
outParameter.setSuccess(true);
outParameter.getParams().put("htmlText", htmlText);
return outParameter;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter("提现复核失败!");
}
}
@Override
public OutParameter direcTrf(InParameter inParameter) {
try {
Map<String, String> params = new LinkedHashMap<String, String>();
params.put("Version", chinaPnrConfig.getVersion());
params.put("CmdId", "DirecTrf");
params.put("MerCustId", chinaPnrConfig.getMerCustId());
params.put("OrdId", inParameter.getOrdId());
params.put("UsrCustId", (Long) inParameter.getParams().get("UsrCustId") + "");
params.put("InUsrCustId", (Long) inParameter.getParams().get("InUsrCustId") + "");
DecimalFormat df = new DecimalFormat("##0.00");
params.put("TransAmt", df.format((Double) inParameter.getParams().get("TransAmt")));
params.put("RetUrl", "");
params.put("BgRetUrl", getBgRetUrl(inParameter.getBgRetUrl()));
params.put("MerPriv", "DirecTrf");
params.put("ReqExt", "");
params.put("ChkValue", getChkValue(params));// 设置请求签名
parameterLogService.addParameterLog(params, ParameterLogDo.ParameterType.REQU);// 记录交易参数
String jsonString = HttpClientUtils.post(chinaPnrConfig.getGateway(), params);
OutParameter outParameter = getSuccessOutParameter(jsonString);
parameterLogService.addParameterLog(outParameter.getParams(), ParameterLogDo.ParameterType.RESP);// 记录交易参数
return outParameter;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return getFailureOutParameter("提现复核失败!");
}
}
}