package com.sp2p.util; import java.io.UnsupportedEncodingException; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.struts2.ServletActionContext; import chinapnr.SecureLink; import com.shove.Convert; import com.shove.config.ChinaPnrConfig; import com.shove.util.FormUtil; import com.shove.util.HttpUtil; import com.shove.util.UtilDate; public class ChinaPnRInterface { public static final String pnrURL = ChinaPnrConfig.chinapnr_gateway; /** * 前台 用户注册 * * @param usrName真实姓名 * @param usrId合和年用户id */ public static String userRegister(String cmdId, String usrId, String usrName, String idNo, String usrMp, String usrEmail) throws Exception { Map<String, String> map = new HashMap<String, String>(); String version = ChinaPnrConfig.chinapnr_version; String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String retUrl = ChinaPnrConfig.chinapnr_retUrl; // 前台返回 String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; // 后台返回 String idType = ChinaPnrConfig.chinapnr_idType; // 证件类型 '00': 身份证 String merPriv = "UserRegister"; // 商户私有域 String charSet = ChinaPnrConfig.chinapnr_input_charset; map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("BgRetUrl", bgRetUrl); map.put("RetUrl", retUrl); map.put("UsrId", usrId); map.put("UsrName", usrName); map.put("IdType", idType); map.put("IdNo", idNo); map.put("UsrMp", usrMp); map.put("UsrEmail", usrEmail); map.put("MerPriv", merPriv); map.put("CharSet", charSet); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(bgRetUrl); plain.append(retUrl); plain.append(usrId); plain.append(usrName); plain.append(idType); plain.append(idNo); plain.append(usrMp); plain.append(usrEmail); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return FormUtil.buildHtmlForm(map, pnrURL + "", "post"); } /** * 后台接口开户 * * @param usrId合和年用户id * @param usrName真实姓名 * @return * @throws UnsupportedEncodingException * @throws Exception */ public static String bgRegister(String cmdId, String usrId, String usrName, String loginPwd, String transPwd, String idNo, String usrMp, String usrEmail) throws UnsupportedEncodingException { Map<String, String> map = new HashMap<String, String>(); String version = ChinaPnrConfig.chinapnr_version; String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String idType = ChinaPnrConfig.chinapnr_idType; // 证件类型 '00': 身份证 String merPriv = "bgRegister"; // 商户私有域--后台开户 String charSet = ChinaPnrConfig.chinapnr_input_charset; map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("UsrId", usrId); map.put("UsrName", usrName); map.put("IdType", idType); map.put("IdNo", idNo); map.put("UsrMp", usrMp); map.put("UsrEmail", usrEmail); map.put("MerPriv", merPriv); map.put("CharSet", charSet); String longinPwds = "d3776loqw21h77mmh675aas567xyusgKUL2H3DK4735O9861M6Q1ETGHB1C5ZK17K3P32VZR31WC77AC9E7TC43188PD3H9" + loginPwd; // 登录测试私密 String transPwds = "d3776loqw21h77mmh675aas567xyusgKUL2H3DK4735O9861M6Q1ETGHB1C5ZK17K3P32VZR31WC77AC9E7TC43188PD3H9" + transPwd; // 交易测试私密 longinPwds = com.shove.security.Encrypt.MD5(longinPwds.trim()); transPwds = com.shove.security.Encrypt.MD5(transPwds.trim()); map.put("LoginPwd", longinPwds); map.put("TransPwd", transPwds); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(usrId); plain.append(usrName); plain.append(longinPwds); plain.append(transPwds); plain.append(idType); plain.append(idNo); plain.append(usrMp); plain.append(usrEmail); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 用户绑卡--后台确认 * * @param version * @param cmdId * @param merCustId * @param usrCustId * @param openAcctId * @param openBankId * @param openAreaId * @param openProvId * @param bgRetUrl * @param merPriv * @param chkValue * @return */ public static String bgBindCard(String cmdId, String usrCustId, String openBankId, String openAcctId, String openProvId, String openAreaId, String openBranchName) { Map<String, String> map = new HashMap<String, String>(); // 组装接口参数,并进行加密 String version = ChinaPnrConfig.chinapnr_version; String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String usrCustIds = usrCustId + ""; // 商户客户号,汇付生成,用户的唯一性标识 String merPriv = "a2"; // 商户私有域,自定义字段,该字段在交易完成后由商户专属平台原样返回 String isDefault = "Y"; map.put("Version", version); map.put("UsrCustId", usrCustId); map.put("MerCustId", merCustId); map.put("CmdId", cmdId); map.put("OpenBankId", openBankId); map.put("CharSet", ChinaPnrConfig.chinapnr_input_charset); map.put("MerPriv", merPriv); map.put("OpenAcctId", openAcctId); map.put("OpenProvId", openProvId); map.put("OpenAreaId", openAreaId); map.put("IsDefault", isDefault); // 是否默认 定长 1位 Y/N map.put("OpenBranchName", openBranchName); // 开户行支行名称 // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version).append(cmdId).append(merCustId).append(usrCustIds).append(openAcctId); plain.append(openBankId).append(openProvId).append(openAreaId).append(openBranchName).append(isDefault).append(merPriv); SecureLink sl = new SecureLink(); int ret = -1; try { ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); } catch (Exception e) { e.printStackTrace(); } if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 前台用户绑卡接口 * * @return */ public static String userBindCard(String usrCustId) { Map<String, String> map = new HashMap<String, String>(); String cmdId = "UserBindCard"; String version = ChinaPnrConfig.chinapnr_version; String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String merPriv = "userBindCard"; // 商户私有域,自定义字段, map.put("Version", version); map.put("UsrCustId", usrCustId); map.put("MerCustId", merCustId); map.put("CmdId", cmdId); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(usrCustId); plain.append(bgRetUrl); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = -1; try { ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); } catch (Exception e) { e.printStackTrace(); } if (ret != 0) { return "发送请求签名错误"; } map.put("ChkValue", sl.getChkValue()); return FormUtil.buildHtmlForm(map, pnrURL, "post"); } /** * 充值 * * @param body * @param nunber * @param userId * @param bankCode * @param tranDateTime * @param gateBusiId * 网关的细分业务类型 用户B2C,商户B2B */ public static String netSave(String body, String ordId, String openBankId, String usrCustId, String ordDate, String moneyStr, String gateBusiId, String merPriv, String retUrl, String cardDcFlag) throws Exception { // 组装接口参数,并进行加密 String version = ChinaPnrConfig.chinapnr_version; String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String usrCustIds = usrCustId + ""; // 商户客户号,汇付生成,用户的唯一性标识 String transAmt = moneyStr + ""; // 交易金额 // String retUrl = ChinaPnrConfig.chinapnr_retUrl; String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String cmdId = "NetSave"; String dcFlag = cardDcFlag; // 银行卡类型:D借记卡,C信用卡 Map<String, String> map = new HashMap<String, String>(); map.put("Version", version); map.put("UsrCustId", usrCustId); map.put("GateBusiId", gateBusiId); map.put("TransAmt", transAmt); map.put("MerCustId", merCustId); map.put("CmdId", cmdId); map.put("OrdId", ordId); map.put("DcFlag", dcFlag); map.put("OrdDate", ordDate); // 订单日期 map.put("RetUrl", retUrl); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); if (!"DEFAULT".equals(openBankId)) {// 开户银行代号 map.put("OpenBankId", openBankId); } else { map.put("OpenBankId", openBankId); } // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(usrCustIds); plain.append(ordId); plain.append(ordDate); plain.append(gateBusiId); plain.append(openBankId); plain.append(dcFlag); plain.append(transAmt); plain.append(retUrl); plain.append(bgRetUrl); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return FormUtil.buildHtmlForm(map, pnrURL, "post"); } /** * 商户无卡代扣充值 */ public static String posWhSave(String usrCustId, String openAcctId, String transAmt, String ordId, String ordDate, String checkDate) throws UnsupportedEncodingException { String cmdId = "PosWhSave"; String version = ChinaPnrConfig.chinapnr_version; String merCustId = ChinaPnrConfig.chinapnr_merCustId; String retUrl = ""; String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String merPriv = "posWhSave"; Map<String, String> map = new HashMap<String, String>(); map.put("CmdId", cmdId); map.put("Version", version); map.put("MerCustId", merCustId); map.put("UsrCustId", usrCustId); map.put("OpenAcctId", openAcctId); map.put("TransAmt", transAmt); map.put("OrdId", ordId); map.put("OrdDate", ordDate); map.put("CheckDate", checkDate); map.put("RetUrl", retUrl); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); StringBuilder plain = new StringBuilder(version).append(cmdId).append(merCustId).append(usrCustId).append(openAcctId); plain.append(transAmt).append(ordId).append(ordDate).append(checkDate).append(retUrl).append(bgRetUrl).append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 资金(货款)冻结 */ public static String usrFreezeBg(String usrCustId, String subAcctType, String subAcctId, String ordId, String transAmt) throws Exception { Map<String, String> map = new HashMap<String, String>(); // 拼接金额小数点 double amount = Convert.strToDouble(transAmt, 0); transAmt = new DecimalFormat("0.00").format(amount); String version = ChinaPnrConfig.chinapnr_version; String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String ordDate = UtilDate.getDate(); // 日期 String retUrl = ""; String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String merPriv = "UsrFreezeBg"; // 商户私有域,自定义字段,该字段在交易完成后由商户专属平台原样返回 String cmdId = "UsrFreezeBg"; // 消息类型,每一种消息类型代表一种交易-- 冻结 map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("UsrCustId", usrCustId);// 商户客户号,汇付生成,用户的唯一性标识 map.put("SubAcctType", subAcctType);// 子账号类型 map.put("SubAcctId", subAcctId);// 子账户号 map.put("OrdId", ordId);// 订单号 map.put("OrdDate", ordDate); map.put("TransAmt", transAmt); map.put("RetUrl", retUrl); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(usrCustId); plain.append(subAcctType); plain.append(subAcctId); plain.append(ordId); plain.append(ordDate); plain.append(transAmt); plain.append(retUrl); plain.append(bgRetUrl); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 资金(货款)解冻 * * @return * @throws Exception */ public static String usrUnFreeze(String ordId, String trxId) throws Exception { Map<String, String> map = new HashMap<String, String>(); ordId = trxId; String version = ChinaPnrConfig.chinapnr_version; String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String ordDate = UtilDate.getDate(); // 日期 String retUrl = ""; String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String merPriv = "UsrUnFreeze"; // 商户私有域,自定义字段,该字段在交易完成后由商户专属平台原样返回 String cmdId = "UsrUnFreeze"; // 消息类型,每一种消息类型代表一种交易-- 解冻 map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("OrdId", ordId); // 订单号 map.put("OrdDate", ordDate); map.put("TrxId", trxId);// 商户专属平台交易唯一标识定长 18 位 map.put("RetUrl", retUrl); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(ordId); plain.append(ordDate); plain.append(trxId); plain.append(retUrl); plain.append(bgRetUrl); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 投标撤销 */ public static String tenderCancle(String ordId, String transAmt, String usrCustId) throws Exception { Map<String, String> map = new HashMap<String, String>(); double amount = Convert.strToDouble(transAmt, 0); transAmt = new DecimalFormat("0.00").format(amount); String version = ChinaPnrConfig.chinapnr_version; String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String ordDate = UtilDate.getDate(); // 日期 String retUrl = ""; String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String merPriv = "TenderCancle"; // 商户私有域,自定义字段,该字段在交易完成后由商户专属平台原样返回 String cmdId = "TenderCancle"; // 消息类型 map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("OrdId", ordId); // 订单号 map.put("OrdDate", ordDate); map.put("TransAmt", transAmt); map.put("UsrCustId", usrCustId); map.put("RetUrl", retUrl); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(ordId); plain.append(ordDate); plain.append(transAmt); plain.append(usrCustId); plain.append(retUrl); plain.append(bgRetUrl); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); // return FormUtil.buildHtmlForm(map, pnrURL, "post"); return HttpUtil.http(pnrURL, map); } /** * 自动扣款(放款) * * @return * @throws Exception */ public static String loans(String OrdId, String OrdDate, String OutCustId, String TransAmt, String Fee, String SubOrdId, String SubOrdDate, String InCustId, String DivDetails, String IsDefault) throws Exception { SecureLink sl = new SecureLink(); String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "Loans"; // 操作类型自动扣款 放款 String MerCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户id String BgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String MerPriv = "Loans"; // 商户私有域,自定义在交易完成后原样返回 try { Date da = new SimpleDateFormat("yyyy-MM-dd").parse(SubOrdDate); SubOrdDate = new SimpleDateFormat("yyyyMMdd").format(da); Date da1 = new SimpleDateFormat("yyyy-MM-dd").parse(OrdDate); OrdDate = new SimpleDateFormat("yyyyMMdd").format(da1); } catch (ParseException e) { e.printStackTrace(); } // 生成订单 StringBuffer plain = new StringBuffer(); plain.append(Version).append(CmdId).append(MerCustId).append(OrdId).append(OrdDate); plain.append(OutCustId).append(TransAmt).append(Fee).append(SubOrdId).append(SubOrdDate); plain.append(InCustId).append(DivDetails).append(IsDefault).append(BgRetUrl).append(MerPriv); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("OrdId", OrdId); map.put("OrdDate", OrdDate); map.put("OutCustId", OutCustId); map.put("TransAmt", TransAmt); map.put("Fee", Fee); map.put("SubOrdId", SubOrdId); map.put("SubOrdDate", SubOrdDate); map.put("InCustId", InCustId); map.put("DivDetails", DivDetails); map.put("IsDefault", IsDefault); map.put("BgRetUrl", BgRetUrl); map.put("MerPriv", MerPriv); map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 转账(商户用) 回购代偿扣款--子账户转账 * * @return * @throws Exception */ public static String transfer(String ordId, String outCustId, String outAcctId, String transAmt, String inCustId, String inAcctId) throws Exception { Map<String, String> map = new HashMap<String, String>(); double amount = Convert.strToDouble(transAmt, 0); transAmt = new DecimalFormat("0.00").format(amount); String version = ChinaPnrConfig.chinapnr_version; // String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String retUrl = ""; String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String merPriv = "cmdId=" + "Transfer"; // 商户私有域,自定义字段,该字段在交易完成后由商户专属平台原样返回 String cmdId = "Transfer"; // 消息类型,每一种消息类型代表一种交易-- 冻结 map.put("Version", version); map.put("CmdId", cmdId); map.put("OrdId", ordId); map.put("OutCustId", outCustId);// 出账客户号 map.put("OutAcctId", outAcctId);// 出账客户号 map.put("TransAmt", transAmt); map.put("InCustId", inCustId);// 入账客户号 map.put("InAcctId", inAcctId);// 入账子账户 map.put("RetUrl", retUrl); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(ordId); plain.append(outCustId);// 出账客户号 plain.append(outAcctId);// 出账子账户 plain.append(transAmt); plain.append(inCustId); // 入账客户号 plain.append(inAcctId); // 入账子账户 plain.append(retUrl); plain.append(bgRetUrl); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 自动扣款(还款) * @还款使用的ordId取自t_invest_repayment * @如果出账账户是担保账户,请指定 outCustId,否则可空。如果入账账户是担保账户请指定 inCustId,否则可空。 */ public static String repayment(String version,String ordId, String outCustId, String outAcctId, String transAmt, String inCustId, String inAcctId, String subOrdId, String subOrdDate, String fee, String divDetails) throws Exception { Map<String, String> map = new HashMap<String, String>(); // 拼接金额小数点 StringBuffer sb = new StringBuffer(); if (transAmt != null && transAmt.indexOf(".") == -1) { transAmt = sb.append(transAmt).append(".00").toString(); } else { transAmt += "0000"; transAmt = transAmt.substring(0, transAmt.indexOf(".") + 3); } // 拼接金额小数点 double amount = Convert.strToDouble(fee, 0); fee = new DecimalFormat("0.00").format(amount); String OrdDate = DateUtil.dateToYMD(new Date()); String cmdId = "Repayment"; // 消息类型 String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String merPriv = "Repayment"; // 商户私有域,自定义字段,该字段在交易完成后由商户专属平台原样返回 map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("OrdId", ordId); map.put("OrdDate", OrdDate); map.put("OutCustId", outCustId);// 出账客户号 map.put("SubOrdId", subOrdId);// 订单号 变长 20 位 由商户的系统生成,必须保证唯一。 map.put("SubOrdDate", subOrdDate);// 关联投标订单流水日期是 map.put("OutAcctId", outAcctId);// 出账子账户 map.put("TransAmt", transAmt);// 金额 map.put("Fee", fee);// Fee 扣款手续费, 放款或扣款的手续费 map.put("InCustId", inCustId);// 入账客户号 map.put("InAcctId", inAcctId);// 入账子账户 map.put("DivDetails", divDetails);// 分账账户串 变长 map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version).append(cmdId).append(merCustId).append(ordId).append(OrdDate); plain.append(outCustId).append(subOrdId).append(subOrdDate).append(outAcctId).append(transAmt); plain.append(fee).append(inCustId).append(inAcctId).append(divDetails).append(bgRetUrl).append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "签名错误 ret=" + ret; } map.put("ChkValue", sl.getChkValue()); String html = FormUtil.buildHtmlForm(map, pnrURL + "", "post"); html.length(); return HttpUtil.http(pnrURL, map); } /** * 取现 */ public static String cash(String ordId, String usrCustId, String transAmt, String openAcctId) { Map<String, String> map = new HashMap<String, String>(); // 拼接金额小数点 double amount = Convert.strToDouble(transAmt, 0); transAmt = new DecimalFormat("0.00").format(amount); String version = ChinaPnrConfig.chinapnr_version; String cmdId = "Cash"; // 消息类型,每一种消息类型代表一种交易-- 冻结 String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String retUrl = ChinaPnrConfig.chinapnr_retUrl; String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String merPriv = "Cash"; // 商户私有域,自定义字段,该字段在交易完成后由商户专属平台原样返回 String remark = "hhnCash"; // 取现描述,长度有限(64 个汉字),请简明扼要的说明 String charSet = "utf-8"; map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("OrdId", ordId); map.put("UsrCustId", usrCustId); map.put("TransAmt", transAmt); map.put("OpenAcctId", openAcctId); map.put("RetUrl", retUrl); map.put("Remark", remark); map.put("BgRetUrl", bgRetUrl); map.put("CharSet", charSet); map.put("MerPriv", merPriv); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(ordId); plain.append(usrCustId); plain.append(transAmt); plain.append(openAcctId); plain.append(retUrl); plain.append(bgRetUrl); plain.append(remark); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString()); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return FormUtil.buildHtmlForm(map, pnrURL + "", "post"); // return HttpUtil.http(pnrURL, map); } /** * 取现复核 */ public static String cashAudit(String ordId, String usrCustId, String transAmt, String auditFlag) { Map<String, String> map = new HashMap<String, String>(); String version = ChinaPnrConfig.chinapnr_version; String cmdId = "CashAudit"; // 消息类型,每一种消息类型代表一种交易-- 冻结 String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String retUrl = ""; String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String merPriv = "CashAudit"; // 商户私有域,自定义字段,该字段在交易完成后由商户专属平台原样返回 map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("OrdId", ordId); map.put("UsrCustId", usrCustId); map.put("TransAmt", transAmt); map.put("AuditFlag", auditFlag);// AuditFlag 复核标识 定长 1 位 取值范围:{R,S} R:拒绝 // S:复核通过 map.put("RetUrl", retUrl); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(ordId); plain.append(usrCustId); plain.append(transAmt); plain.append(auditFlag); plain.append(retUrl); plain.append(bgRetUrl); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString()); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 查询余额,前台用户 */ public static String queryBalance(String usrCustId) throws Exception { // 组装接口参数,并进行加密 String version = ChinaPnrConfig.chinapnr_version; String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 // String usrCustIds = usrCustId + ""; //商户客户号,汇付生成,用户的唯一性标识 String cmdId = "QueryBalance"; // 消息类型,每一种消息类型代表一种交易 Map<String, String> map = new HashMap<String, String>(); map.put("Version", version); map.put("UsrCustId", usrCustId); map.put("MerCustId", merCustId); map.put("CmdId", cmdId); StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(usrCustId); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); // String html = FormUtil.buildHtmlForm(map, // pnrURL, "post"); return HttpUtil.http(pnrURL, map); } /** * 用户 查询余额 数据流方式 */ public static String queryBalanceBg(String UsrCustId) throws Exception { // String usrCustIds = usrCustId + ""; //商户客户号,汇付生成,用户的唯一性标识 // 组装接口参数,并进行加密 String version = ChinaPnrConfig.chinapnr_version; String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String cmdId = "QueryBalanceBg"; // 消息类型 --后台查询余额QueryBalanceBg Map<String, String> map = new HashMap<String, String>(); map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("UsrCustId", UsrCustId); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(UsrCustId); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 账户信息修改(页面)接口 */ public static String AccountUpdate(String usrCustId) throws Exception { Map<String, String> map = new HashMap<String, String>(); String version = ChinaPnrConfig.chinapnr_version; String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String cmdId = "AcctModify"; // 消息类型,每一种消息类型代表一种交易-- 账户信息修改 map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("UsrCustId", usrCustId); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(usrCustId); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return FormUtil.buildHtmlForm(map, pnrURL + "", "post"); } /** * 主动投标 */ public static String initiativeTender(String id, String ordId, String usrCustId, String transAmt, String borrowerDetails) { Map<String, String> map = new HashMap<String, String>(); String maxTenderRate = "0.01"; String version = ChinaPnrConfig.chinapnr_version; String cmdId = "InitiativeTender"; // 消息类型,每一种消息类型代表一种交易-- 冻结 String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String retUrl = ChinaPnrConfig.chinapnr_retUrl; String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String merPriv = id; // 商户私有域,自定义字段,该字段在交易完成后由商户专属平台原样返回 map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("OrdId", ordId); map.put("OrdDate", UtilDate.getDate()); map.put("TransAmt", transAmt); map.put("UsrCustId", usrCustId); map.put("MaxTenderRate", maxTenderRate); // 最大投资手 续费率 map.put("BorrowerDetails", borrowerDetails); // 借款人信息 , 变长 // ,支持传送多个借款人信息,使用json格式传送 map.put("RetUrl", retUrl); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(ordId); plain.append(UtilDate.getDate()); plain.append(transAmt); plain.append(usrCustId); plain.append(maxTenderRate); plain.append(borrowerDetails); plain.append(retUrl); plain.append(bgRetUrl); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString()); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return FormUtil.buildHtmlForm(map, pnrURL + "", "post"); } /** * 主动投标 */ public static String initiativeTender1(String id, String ordId, String usrCustId, String transAmt, String borrowerDetails,String url) { Map<String, String> map = new HashMap<String, String>(); String maxTenderRate = "0.01"; String version = ChinaPnrConfig.chinapnr_version; String cmdId = "InitiativeTender"; // 消息类型,每一种消息类型代表一种交易-- 冻结 String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String retUrl = ChinaPnrConfig.chinapnr_retUrl; String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; if (StringUtils.isNotBlank(url)&&StringUtils.contains(url, "colourlife.com")) { retUrl = url+"frontChinaPnrUrl.do"; bgRetUrl =url+"backgroundChinaPnrUrl.do"; } System.out.println("ChinaPnRInterface:initiativeTender1:url"+url); String merPriv = id; // 商户私有域,自定义字段,该字段在交易完成后由商户专属平台原样返回 map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("OrdId", ordId); map.put("OrdDate", UtilDate.getDate()); map.put("TransAmt", transAmt); map.put("UsrCustId", usrCustId); map.put("MaxTenderRate", maxTenderRate); // 最大投资手 续费率 map.put("BorrowerDetails", borrowerDetails); // 借款人信息 , 变长 System.out.println("回调地址:"+url); // ,支持传送多个借款人信息,使用json格式传送 map.put("RetUrl", retUrl); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(ordId); plain.append(UtilDate.getDate()); plain.append(transAmt); plain.append(usrCustId); plain.append(maxTenderRate); plain.append(borrowerDetails); plain.append(retUrl); plain.append(bgRetUrl); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString()); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return FormUtil.buildHtmlForm(map, pnrURL + "", "post"); } /** * 主动投标--债权购买 */ public static String inDebtTender(String id, String ordId, String usrCustId, String transAmt, String borrowerDetails, String debtUsrCustId) { Map<String, String> map = new HashMap<String, String>(); String maxTenderRate = "888.00"; String version = ChinaPnrConfig.chinapnr_version; String cmdId = "InitiativeTender"; // 消息类型,每一种消息类型代表一种交易-- 冻结 String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String retUrl = ChinaPnrConfig.chinapnr_retUrl; String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String merPriv = ordId + "=inDebtTender" + "=" + debtUsrCustId; // 商户私有域,自定义字段,该字段在交易完成后由商户专属平台原样返回 map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("OrdId", ordId); map.put("OrdDate", UtilDate.getDate()); map.put("TransAmt", transAmt); map.put("UsrCustId", usrCustId); map.put("MaxTenderRate", maxTenderRate); // 最大投资手 续费率 map.put("BorrowerDetails", borrowerDetails); // 借款人信息 , 变长 // ,支持传送多个借款人信息,使用json格式传送 map.put("RetUrl", retUrl); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(ordId); plain.append(UtilDate.getDate()); plain.append(transAmt); plain.append(usrCustId); plain.append(maxTenderRate); plain.append(borrowerDetails); plain.append(retUrl); plain.append(bgRetUrl); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString()); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return FormUtil.buildHtmlForm(map, pnrURL + "", "post"); } /** * 数据签名 */ public static String SignMsg(String MerId, String MerKeyFile, String MsgData) throws Exception { SecureLink sl = new SecureLink(); sl.SignMsg(MerId, MerKeyFile, MsgData.getBytes("utf-8")); return sl.getMsgData(); } /** * 用户账户支付 */ public static String UsrAcctPay(long debtId, long userId, double auctionPrice, String UsrCustId) throws Exception { String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "UsrAcctPay"; String OrdId = debtId + ""; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户id String TransAmt = auctionPrice + ""; if (TransAmt.indexOf('.') == -1) { TransAmt += ".00"; } else { TransAmt += "00"; TransAmt = TransAmt.substring(0, TransAmt.indexOf('.') + 3); } String InAcctId = "6227002101661415050";// 汇付生成的虚拟资金账号 // BASEDT基本借记户; DEP保证金账户; MERDT专属借记帐户;等 String InAcctType = "BASEDT"; String RetUrl = ChinaPnrConfig.chinapnr_retUrl; String BgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String MerPriv = "userId=" + userId; // 商户私有域,自定义在交易完成后原样返回 // 生成订单 StringBuffer plain = new StringBuffer(); plain.append(Version).append(CmdId).append(OrdId).append(UsrCustId).append(MerCustId); plain.append(TransAmt).append(InAcctId).append(InAcctType).append(RetUrl).append(BgRetUrl).append(MerPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("OrdId", OrdId); map.put("TransAmt", TransAmt); map.put("RetUrl", RetUrl); map.put("BgRetUrl", BgRetUrl); map.put("MerPriv", MerPriv); map.put("UsrCustId", UsrCustId); map.put("InAcctId", InAcctId); map.put("InAcctType", InAcctType); map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 商户无卡充值代扣 */ public static String posWhSave(String OrdId, String TransAmt, String UsrCustId, String OpenAcctId) throws Exception { String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "PosWhSave"; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户id if (TransAmt.indexOf('.') == -1) { TransAmt += ".00"; } else { TransAmt += "00"; TransAmt = TransAmt.substring(0, TransAmt.indexOf('.') + 3); } String OrdDate = UtilDate.getDate(); String CheckDate = UtilDate.getDate(); // 校验日期 定长 8 位 POS // 验证日期,该字段可以为空,如果传送的代扣卡 String RetUrl = ""; String BgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String MerPriv = CmdId; // 生成订单 StringBuffer plain = new StringBuffer(); plain.append(Version).append(CmdId).append(MerCustId).append(UsrCustId).append(OpenAcctId); plain.append(TransAmt).append(OrdId).append(OrdDate).append(RetUrl).append(BgRetUrl).append(MerPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("UsrCustId", UsrCustId); map.put("InAcctId", OpenAcctId); map.put("TransAmt", TransAmt); map.put("OrdId", OrdId); map.put("OrdDate", OrdDate); map.put("CheckDate", CheckDate); map.put("RetUrl", RetUrl); map.put("BgRetUrl", BgRetUrl); map.put("MerPriv", MerPriv); map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 商户代取现 */ public static String merCash(String OrdId, String UsrCustId, String TransAmt, String Remark) throws UnsupportedEncodingException { String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "MerCash"; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户id if (TransAmt.indexOf('.') == -1) { TransAmt += ".00"; } else { TransAmt += "00"; TransAmt = TransAmt.substring(0, TransAmt.indexOf('.') + 3); } String RetUrl = ""; String BgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String MerPriv = CmdId; String CharSet = ChinaPnrConfig.chinapnr_input_charset; // 生成订单 StringBuffer plain = new StringBuffer(); plain.append(Version).append(CmdId).append(MerCustId).append(OrdId).append(UsrCustId); plain.append(TransAmt).append(RetUrl).append(BgRetUrl).append(Remark).append(MerPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("OrdId", OrdId); map.put("UsrCustId", UsrCustId); map.put("TransAmt", TransAmt); map.put("Remark", Remark); map.put("RetUrl", RetUrl); map.put("BgRetUrl", BgRetUrl); map.put("MerPriv", MerPriv); map.put("CharSet", CharSet); map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 交易状态查询 */ public static String queryTransStat(String ordId, String ordDate, String queryTransType) throws Exception { // 组装接口参数,并进行加密 String version = ChinaPnrConfig.chinapnr_version; String cmdId = "QueryTransStat"; // 消息类型 String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 Map<String, String> map = new HashMap<String, String>(); map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("OrdId", ordId); map.put("OrdDate", ordDate); map.put("QueryTransType", queryTransType); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(ordId); plain.append(ordDate); plain.append(queryTransType); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** * 商户子账户信息查询 */ public static String queryAccts() throws Exception { String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "QueryAccts"; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, new StringBuilder(Version).append(CmdId).append(MerCustId).toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); // return FormUtil.buildHtmlForm(map, pnrURL + "", "post"); } /** * 取现对账 */ public static String cashReconciliation(String beginDate, String endDate, String pageSize, String pageNum) throws Exception { String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "CashReconciliation"; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; SecureLink sl = new SecureLink(); StringBuilder sb = new StringBuilder(Version).append(CmdId).append(MerCustId); sb.append(beginDate).append(endDate).append(pageNum).append(pageSize); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, sb.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("ChkValue", sl.getChkValue()); map.put("BeginDate", beginDate); map.put("EndDate", endDate); map.put("PageSize", pageSize); map.put("PageNum", pageNum); return HttpUtil.http(pnrURL, map); } /** * 充值对账 */ public static String saveReconciliation(String beginDate, String endDate, String pageSize, String pageNum) throws Exception { String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "SaveReconciliation"; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; SecureLink sl = new SecureLink(); StringBuilder sb = new StringBuilder(Version).append(CmdId).append(MerCustId); sb.append(beginDate).append(endDate).append(pageNum).append(pageSize); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, sb.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("ChkValue", sl.getChkValue()); map.put("BeginDate", beginDate); map.put("EndDate", endDate); map.put("PageSize", pageSize); map.put("PageNum", pageNum); return HttpUtil.http(pnrURL, map); } /** * 投标对账 */ public static String reconciliation(String BeginDate, String EndDate, String PageSize, String PageNum, String QueryTransType) throws Exception { String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "Reconciliation"; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; SecureLink sl = new SecureLink(); StringBuilder sb = new StringBuilder(Version).append(CmdId).append(MerCustId); sb.append(BeginDate).append(EndDate).append(PageNum).append(PageSize).append(QueryTransType); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, sb.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("ChkValue", sl.getChkValue()); map.put("QueryTransType", QueryTransType); map.put("BeginDate", BeginDate); map.put("EndDate", EndDate); map.put("PageSize", PageSize); map.put("PageNum", PageNum); return HttpUtil.http(pnrURL, map); } /** * 商户扣款对账 */ public static String trfReconciliation(String BeginDate, String EndDate, String PageSize, String PageNum) throws Exception { String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "TrfReconciliation"; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; SecureLink sl = new SecureLink(); StringBuilder sb = new StringBuilder(Version).append(CmdId).append(MerCustId); sb.append(BeginDate).append(EndDate).append(PageNum).append(PageSize); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, sb.toString().getBytes("utf-8")); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("ChkValue", sl.getChkValue()); map.put("BeginDate", BeginDate); map.put("EndDate", EndDate); map.put("PageSize", PageSize); map.put("PageNum", PageNum); return HttpUtil.http(pnrURL, map); } /** * 债权转让 * * @OrdId 订单号 * @SellCustId 转让人客户号 * @CreditAmt 债权总额 * @CreditDealAmt 债权转让承接人付给转让人的金额 * @BidDetails 债权转让明细 * @BidOrdId 原投标订单号 * @BidOrdDate 原投标订单日期 * @BidCreditAmt 转出原投标金额 * @Fee 手续费 * @DivDetails 分账账户串 * @BuyCustId 承接人客户号(债权购买人客户号) */ public static String creditAssign(String OrdId, String SellCustId, String CreditAmt, String CreditDealAmt, String BidDetails, String Fee, String DivDetails, String BuyCustId, String OrdDate,String MerPriv) { String Version = ChinaPnrConfig.chinapnr_version; // String Version = "20"; String CmdId = "CreditAssign"; String ReqExt = ""; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户id String RetUrl = ChinaPnrConfig.chinapnr_retUrl; String BgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; // 生成订单 StringBuffer plain = new StringBuffer(); plain.append(Version).append(CmdId).append(MerCustId).append(SellCustId); plain.append(CreditAmt).append(CreditDealAmt).append(BidDetails).append(Fee).append(DivDetails); plain.append(BuyCustId).append(OrdId).append(OrdDate).append(RetUrl).append(BgRetUrl).append(MerPriv).append(ReqExt); SecureLink sl = new SecureLink(); int ret = 1; try { ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); } catch (Exception e) { e.printStackTrace(); } if (ret != 0) { return "发送请求签名错误"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("SellCustId", SellCustId); map.put("CreditAmt", CreditAmt); map.put("CreditDealAmt", CreditDealAmt); map.put("BidDetails", BidDetails); map.put("Fee", Fee); map.put("DivDetails", DivDetails); map.put("BuyCustId", BuyCustId); map.put("OrdId", OrdId); map.put("OrdDate", OrdDate); map.put("RetUrl", RetUrl); map.put("BgRetUrl", BgRetUrl); map.put("MerPriv", MerPriv); map.put("ReqExt", ReqExt); map.put("ChkValue", sl.getChkValue()); String html = FormUtil.buildHtmlForm(map, pnrURL, "post"); html = html.replace("value=\"{\"BidDetails", "value='{\"BidDetails"); html = html.replace("}]}]}\"/>", "}]}]}'/>"); return html; } /** 自动投标 **/ public static String autoTender(String merPriv, String ordId, String usrCustId, String transAmt, String borrowerDetails) { Map<String, String> map = new HashMap<String, String>(); String maxTenderRate = "0.01"; // 最大投资手 续费率 String version = ChinaPnrConfig.chinapnr_version; String cmdId = "AutoTender"; String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String retUrl = "";//ChinaPnrConfig.chinapnr_retUrl; String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("OrdId", ordId); map.put("OrdDate", UtilDate.getDate()); map.put("TransAmt", transAmt); map.put("UsrCustId", usrCustId); map.put("MaxTenderRate", maxTenderRate); map.put("BorrowerDetails", borrowerDetails); map.put("RetUrl", retUrl); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version); plain.append(cmdId); plain.append(merCustId); plain.append(ordId); plain.append(UtilDate.getDate()); plain.append(transAmt); plain.append(usrCustId); plain.append(maxTenderRate); plain.append(borrowerDetails); plain.append(retUrl); plain.append(bgRetUrl); plain.append(merPriv); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString()); if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /** 开启自动投标计划 **/ public static String autoTenderPlan(String UsrCustId, String TenderPlanType, String TransAmt) { return autoTenderPlan(UsrCustId, TenderPlanType, TransAmt,""); } public static String autoTenderPlan(String UsrCustId, String TenderPlanType, String TransAmt,String retUrl) { String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "AutoTenderPlan"; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; String RetUrl = ChinaPnrConfig.chinapnr_retUrl; if (StringUtils.isNotBlank(retUrl)) { RetUrl = retUrl; } String MerPriv = generateSequenceNo.generateSequenceNo(); // 生成订单 StringBuffer plain = new StringBuffer(); plain.append(Version).append(CmdId).append(MerCustId).append(UsrCustId).append(TenderPlanType).append(TransAmt).append(RetUrl).append(MerPriv); SecureLink sl = new SecureLink(); int ret = 1; try { ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); } catch (Exception e) { e.printStackTrace(); } if (ret != 0) { return "发送请求签名错误"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("UsrCustId", UsrCustId); map.put("TenderPlanType", TenderPlanType); map.put("TransAmt", TransAmt); map.put("RetUrl", RetUrl); map.put("MerPriv", MerPriv); map.put("ChkValue", sl.getChkValue()); String html = FormUtil.buildHtmlForm(map, pnrURL, "post"); return html; } /** 关闭自动投标计划 **/ public static String autoTenderPlanClose(String UsrCustId) { return autoTenderPlanClose(UsrCustId,""); } public static String autoTenderPlanClose(String UsrCustId,String retUrl) { String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "AutoTenderPlanClose"; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; String RetUrl = ChinaPnrConfig.chinapnr_retUrl; if (StringUtils.isNotBlank(retUrl)) { RetUrl = retUrl; } String MerPriv = generateSequenceNo.generateSequenceNo(); // 生成订单 StringBuffer plain = new StringBuffer(); plain.append(Version).append(CmdId).append(MerCustId).append(UsrCustId).append(RetUrl).append(MerPriv); SecureLink sl = new SecureLink(); int ret = 1; try { ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); } catch (Exception e) { e.printStackTrace(); } if (ret != 0) { return "发送请求签名错误"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("UsrCustId", UsrCustId); map.put("RetUrl", RetUrl); map.put("MerPriv", MerPriv); map.put("ChkValue", sl.getChkValue()); String html = FormUtil.buildHtmlForm(map, pnrURL, "post"); return html; } /** 企业开户 **/ public static String corpRegister(String UsrId,String UsrName, String BusiCode, String GuarType) throws Exception{ String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "CorpRegister"; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; String InstuCode = ""; String TaxCode = ""; String MerPriv = ""; String Charset = "utf-8"; String BgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String ReqExt = ""; // 生成订单 StringBuffer plain = new StringBuffer(); plain.append(Version).append(CmdId).append(MerCustId).append(UsrId).append(UsrName).append(InstuCode); plain.append(BusiCode).append(TaxCode).append(MerPriv).append(GuarType).append(BgRetUrl).append(ReqExt); SecureLink sl = new SecureLink(); int ret = 1; try { ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); } catch (Exception e) { e.printStackTrace(); } if (ret != 0) { return "发送请求签名错误"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("UsrId", UsrId); map.put("UsrName", UsrName); map.put("InstuCode", InstuCode); map.put("BusiCode", BusiCode); map.put("TaxCode", TaxCode); map.put("MerPriv", MerPriv); map.put("Charset", Charset); map.put("GuarType", GuarType); map.put("BgRetUrl", BgRetUrl); map.put("ReqExt", ReqExt); map.put("ChkValue", sl.getChkValue()); String html = FormUtil.buildHtmlForm(map, pnrURL, "post"); return html; } /**企业开户查询**/ public static String CorpRegisterQuery(String BusiCode){ String Version = ChinaPnrConfig.chinapnr_version; String CmdId = "CorpRegisterQuery"; String MerCustId = ChinaPnrConfig.chinapnr_merCustId; String ReqExt = ""; // 生成订单 StringBuffer plain = new StringBuffer(); plain.append(Version).append(CmdId).append(MerCustId).append(BusiCode).append(ReqExt); SecureLink sl = new SecureLink(); int ret = 1; try { ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); } catch (Exception e) { e.printStackTrace(); } if (ret != 0) { return "{\"RespCode\":\"-101\",\"RespDesc\":\"发送请求签名错误\"}"; } Map<String, String> map = new HashMap<String, String>(); map.put("Version", Version); map.put("CmdId", CmdId); map.put("MerCustId", MerCustId); map.put("BusiCode", BusiCode); map.put("ReqExt", ReqExt); map.put("ChkValue", sl.getChkValue()); return HttpUtil.http(pnrURL, map); } /***2.0版本还款接口 **/ public static String repayment2(String version,String ordId, String outCustId, String outAcctId, String transAmt, String inCustId, String inAcctId, String subOrdId, String subOrdDate, String fee, String divDetails) throws Exception { Map<String, String> map = new HashMap<String, String>(); // 拼接金额小数点 StringBuffer sb = new StringBuffer(); if (transAmt != null && transAmt.indexOf(".") == -1) { transAmt = sb.append(transAmt).append(".00").toString(); } else { transAmt += "0000"; transAmt = transAmt.substring(0, transAmt.indexOf(".") + 3); } // 拼接金额小数点 double amount = Convert.strToDouble(fee, 0); fee = new DecimalFormat("0.00").format(amount); String OrdDate = DateUtil.dateToYMD(new Date()); String cmdId = "Repayment"; // 消息类型 String merCustId = ChinaPnrConfig.chinapnr_merCustId; // 商户号 String bgRetUrl = ChinaPnrConfig.chinapnr_bgRetUrl; String merPriv = "Repayment"; // 商户私有域,自定义字段,该字段在交易完成后由商户专属平台原样返回 String ReqExt = ""; String FeeObjFlag = ""; map.put("Version", version); map.put("CmdId", cmdId); map.put("MerCustId", merCustId); map.put("OrdId", ordId); map.put("OrdDate", OrdDate); map.put("OutCustId", outCustId);// 出账客户号 map.put("SubOrdId", subOrdId);// 订单号 变长 20 位 由商户的系统生成,必须保证唯一。 map.put("SubOrdDate", subOrdDate);// 关联投标订单流水日期是 map.put("OutAcctId", outAcctId);// 出账子账户 map.put("TransAmt", transAmt);// 金额 map.put("Fee", fee);// Fee 扣款手续费, 放款或扣款的手续费 map.put("InCustId", inCustId);// 入账客户号 map.put("InAcctId", inAcctId);// 入账子账户 map.put("DivDetails", divDetails);// 分账账户串 变长 map.put("FeeObjFlag", FeeObjFlag); map.put("BgRetUrl", bgRetUrl); map.put("MerPriv", merPriv); map.put("ReqExt", ReqExt); // 组织加密明文 StringBuffer plain = new StringBuffer(); plain.append(version).append(cmdId).append(merCustId).append(ordId).append(OrdDate); plain.append(outCustId).append(subOrdId).append(subOrdDate).append(outAcctId).append(transAmt); plain.append(fee).append(inCustId).append(inAcctId).append(divDetails).append(FeeObjFlag).append(bgRetUrl).append(merPriv).append(ReqExt); SecureLink sl = new SecureLink(); int ret = sl.SignMsg(ChinaPnrConfig.chinapnr_merId, ChinaPnrConfig.chinapnr_merKeyFile, plain.toString().getBytes("utf-8")); if (ret != 0) { return "签名错误 ret=" + ret; } map.put("ChkValue", sl.getChkValue()); String html = FormUtil.buildHtmlForm(map, pnrURL + "", "post"); html.length(); return HttpUtil.http(pnrURL, map); } }