package cc.mrbird.febs.pay.service.impl; import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.entity.DataDictionaryCustom; import cc.mrbird.febs.mall.entity.MallMemberBank; import cc.mrbird.febs.mall.entity.MallMemberWithdraw; import cc.mrbird.febs.mall.entity.MallMemberWithdrawMsg; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.pay.model.NBYHResponse; import cc.mrbird.febs.pay.service.NBYHService; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.*; import java.math.BigDecimal; import java.net.*; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Map; @Slf4j @Service @RequiredArgsConstructor public class NBYHServiceImpl implements NBYHService { /** * 登录报文原文 */ private static final String SIGN_MESSAGE = "${serialNo}${reqTime}0000005332123456"; /** * 转账报文原文 */ private static final String ACCOUNT_MESSAGE_SEARCH = "${serialNo}${reqTime}${ZHHA}"; private static final String TRADE_MESSAGE_SEARCH = "${serialNo}${reqTime}${serialNoOld}"; private static final String TRADE_MESSAGE_SINGLE = "${serialNo}${reqTime}${FKZH}${SKZH}${SKHM}${JYJE}${YOTU}"; // private static final String TRADE_MESSAGE_SINGLE = "${serialNo}${reqTime}82260120102022631780401220000592777923119570.01银企接口测试"; // private static final String TRADE_MESSAGE = "${serialNo}${reqTime}${FKZH}${SKZH}${SKHM}${SKYH}${SKSH}${SKSI}${JYJE}${YOTU}${SKHH}"; private static final String TRADE_MESSAGE = "${serialNo}${reqTime}${FKZH}${SKZH}${SKHM}${SKYH}${SKSH}${SKSI}${JYJE}${YOTU}"; // private static final String TRADE_MESSAGE = "${serialNo}${reqTime}822601201020226316228481060643871117王苏平中国农业银行舟山市定海支行营业中心浙江省舟山市0.0101020银企接口测试103342040518"; /** * private static final String TRADE_MESSAGE = "" + "${serialNo}" + "${reqTime}" + "" + "82260120102022631" + "6228481060643871117" + "王苏平" + "中国农业银行舟山市定海支行营业中心" + "浙江省" + "舟山市" + "0.01" + "银企接口测试" + "103342040518" + "" + ""; 跨行转账 交易序列号 客户端请求时间 付款账号 收款账号 收款方户名 收款账号开户行名称 收款方行所在省 收款方行所在市 交易金额 用途 收款行号 ${serialNo}${reqTime}822601201020226316228481060643871117王苏平中国农业银行舟山市定海支行营业中心浙江省舟山市0.01银企接口测试103342040518 行内转账 交易序列号 客户端请求时间 付款账号 收款账号 收款方户名 交易金额 用途 ${serialNo}${reqTime}82260120102022631780401220000592777923119570.01银企接口测试 交易序列号 客户端请求时间 原交易序列号 ${serialNo}${reqTime}${serialNoOld} */ /** * 接收报文url */ // private static final String URL = "http://127.0.0.1:9080/directlink/httpAccess"; private static final String URL = "http://n5z7ej.natappfree.cc/directlink/httpAccess"; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; /** * 签名ip */ // private static final String VERIFY_IP = "127.0.0.1"; private static final String VERIFY_IP = "server.natappfree.cc"; /** * 付款账号 */ private static final String FKZH = "82260120102022631"; /** * 签名端口 */ private static final int VERIFY_PORT = 39296; // private static final int VERIFY_PORT = 8010; /** * cookies */ private static String cookies = null; /** * sessionIdhttp://1d6d-220-168-79-89.ngrok.io */ private static String sessionId = "-1"; /** * 客户号 */ private static String customerId = "0000005332"; /** * 客户号 */ private static String softwareId = "002"; /** * 返回码 */ private static String retCode; /** * 返回信息 */ private static String errorMessage; public static void main(String[] args) { try { InetAddress addr = InetAddress.getByName(VERIFY_IP); Socket socket = new Socket(addr, VERIFY_PORT); System.out.println("发送登录请求:"+addr); System.out.println("发送登录请求:"+socket.getKeepAlive()); // System.out.println("发送登录请求:"); // test.executeServerHttpService("srv001_signOn"); // System.out.println("\n发送跨行转账请求:"); // test.executeServerHttpService("srv007_singleOuterTransfer","跨行转账",null); // System.out.println("\n发送行内转账请求:"); // executeServerHttpService("srv006_singleInnerTransfer","行内转账","2023032910585227466"); } catch (Exception e) { e.printStackTrace(); } } @Resource private MallMemberWithdrawMapper mallMemberWithdrawMapper; @Resource private MallMemberWithdrawMsgMapper mallMemberWithdrawMsgMapper; @Resource private MallMemberBankMapper mallMemberBankMapper; @Override public NBYHResponse tradeSinge(Long id) { /** * * * -1 * srv006_singleInnerTransfer * 0000005332 * 002 * srv006 * 行内转账 * W2023042417134405086 * 20230424174016 * * 82260120102022631 * 78040122000059277 * 792311957 * 1.00 * 行内转账 * * * MIIEzQYKKoEcz1UGAQQCAqCCBL0wggS5AgEBMQ4wDAYIKoEcz1UBgxEFADCB+AYKKoEcz1UGAQQCAaCB6QSB5jxvcFJlcT48c2VyaWFsTm8+VzIwMjMwNDI0MTcxMzQ0MDUwODY8L3NlcmlhbE5vPjxyZXFUaW1lPjIwMjMwNDI0MTc0MDE2PC9yZXFUaW1lPjxSZXFQYXJhbT48RktaSD44MjI2MDEyMDEwMjAyMjYzMTwvRktaSD48U0taSD43ODA0MDEyMjAwMDA1OTI3NzwvU0taSD48U0tITT43OTIzMTE5NTc8L1NLSE0+PEpZSkU+MS4wMDwvSllKRT48WU9UVT7Q0MTa16rVyzwvWU9UVT48L1JlcVBhcmFtPjwvb3BSZXE+oIIC0TCCAs0wggJxoAMCAQICBRBVc1EWMAwGCCqBHM9VAYN1BQAwXDELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEbMBkGA1UEAwwSQ0ZDQSBURVNUIFNNMiBPQ0ExMB4XDTIzMDMwOTAyNTUzM1oXDTI1MDMwOTAyNTUzM1owcjELMAkGA1UEBhMCQ04xDDAKBgNVBAoMA0JPQzETMBEGA1UECwwKQ0ZDQVRlY2hURTEZMBcGA1UECwwQT3JnYW5pemF0aW9uYWwtMjElMCMGA1UEAwwcQ0ZDQVRlY2hURUB0ZXN0cWl5ZUBaMTExMTFAMTBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABPHX9dm+K8G4WGe2uAHWZKI0aJgmHQfcTyK6jxKvEC5ADcptfpbe2u0cgSwBXFsyAuXY/6wq2vm1wyzmKqGCikGjggEGMIIBAjAfBgNVHSMEGDAWgBRr/hjaj0I6prhtsy6Igzo0osEw4TAMBgNVHRMBAf8EAjAAMEgGA1UdIARBMD8wPQYIYIEchu8qAQEwMTAvBggrBgEFBQcCARYjaHR0cDovL3d3dy5jZmNhLmNvbS5jbi91cy91cy0xNC5odG0wOQYDVR0fBDIwMDAuoCygKoYoaHR0cDovL3VjcmwuY2ZjYS5jb20uY24vU00yL2NybDQ3MDc2LmNybDAOBgNVHQ8BAf8EBAMCBsAwHQYDVR0OBBYEFEr8/JLNuSXaME4XwdfG4VbI1nppMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAMBggqgRzPVQGDdQUAA0gAMEUCIDO8ojBrfnfn1xqHqLovnTRUmSfwmKBPHSCjIf7DBQUzAiEAnGcbKMqUfYj+35WqRfZrb9u34IcgYg0sOc9l/TKHol0xgdMwgdACAQEwZTBcMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDDBJDRkNBIFRFU1QgU00yIE9DQTECBRBVc1EWMAwGCCqBHM9VAYMRBQAwDQYJKoEcz1UBgi0BBQAERzBFAiEAhXpldulA3eL7gbu97bo7BFKDf+AJk2OUoNcU88pbb3ICIEwlp1PJ43Lj2frEIBp9HKiyaX/wQBDOasfOk5Kk39KC * */ NBYHResponse nbyhResponse = new NBYHResponse(); boolean flag = false; MallMemberWithdraw mallMemberWithdraw = mallMemberWithdrawMapper.selectById(id); MallMemberBank mallMemberBank = mallMemberBankMapper.selectById(mallMemberWithdraw.getWtihdrawTypeId()); try { String requestDataForWithDraw = getRequestDataForWithDraw("srv006_singleInnerTransfer", "行内转账", mallMemberWithdraw, mallMemberBank); String responseStr = executeServerHttpService(requestDataForWithDraw); errorMessage = responseStr.substring(responseStr.indexOf("") + 10, responseStr.indexOf("")); String SBYYStr = responseStr.substring(responseStr.indexOf("") + 6, responseStr.indexOf("")); nbyhResponse.setMsg(errorMessage+SBYYStr); boolean b = parseReturnValueForTrade(responseStr); if(b){ //插入一条记录 MallMemberWithdrawMsg mallMemberWithdrawMsg = mallMemberWithdrawMapper.selectMsgByWithdrawNo(mallMemberWithdraw.getId()); if(ObjectUtil.isEmpty(mallMemberWithdrawMsg)){ MallMemberWithdrawMsg mallMemberWithdrawMsg1 = new MallMemberWithdrawMsg(); mallMemberWithdrawMsg1.setWithdrawNo(mallMemberWithdraw.getWithdrawNo()); mallMemberWithdrawMsg1.setWithdrawId(mallMemberWithdraw.getId()); mallMemberWithdrawMsg1.setStatus(2); mallMemberWithdrawMsgMapper.insert(mallMemberWithdrawMsg1); } } flag = b; } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } nbyhResponse.setFlag(flag); return nbyhResponse; } @Override public NBYHResponse tradeSingeOuterTransfer(Long id) { NBYHResponse nbyhResponse = new NBYHResponse(); boolean flag = false; MallMemberWithdraw mallMemberWithdraw = mallMemberWithdrawMapper.selectById(id); MallMemberBank mallMemberBank = mallMemberBankMapper.selectById(mallMemberWithdraw.getWtihdrawTypeId()); try { String requestDataForWithDraw = getRequestDataForWithDraw("srv007_singleOuterTransfer", "跨行汇款", mallMemberWithdraw, mallMemberBank); String responseStr = executeServerHttpService(requestDataForWithDraw); errorMessage = responseStr.substring(responseStr.indexOf("") + 10, responseStr.indexOf("")); String SBYYStr = responseStr.substring(responseStr.indexOf("") + 6, responseStr.indexOf("")); nbyhResponse.setMsg(errorMessage+SBYYStr); boolean b = parseReturnValueForTrade(responseStr); if(b){ //插入一条记录 MallMemberWithdrawMsg mallMemberWithdrawMsg = mallMemberWithdrawMapper.selectMsgByWithdrawNo(mallMemberWithdraw.getId()); if(ObjectUtil.isEmpty(mallMemberWithdrawMsg)){ MallMemberWithdrawMsg mallMemberWithdrawMsg1 = new MallMemberWithdrawMsg(); mallMemberWithdrawMsg1.setWithdrawNo(mallMemberWithdraw.getWithdrawNo()); mallMemberWithdrawMsg1.setWithdrawId(mallMemberWithdraw.getId()); mallMemberWithdrawMsg1.setStatus(2); mallMemberWithdrawMsgMapper.insert(mallMemberWithdrawMsg1); } } flag = b; } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } nbyhResponse.setFlag(flag); return nbyhResponse; } @Override public NBYHResponse transferResultInfoQuery(Long id) { /** * * * -1 * srv008_transferResultInfoQuery * 0000005332 * 002 * srv008 * 转账结果查询 * * W2023042417134405087 * 20230424180506 * * W2023042417134405087 * * * MIIEdwYKKoEcz1UGAQQCAqCCBGcwggRjAgEBMQ4wDAYIKoEcz1UBgxEFADCBoQYKKoEcz1UGAQQCAaCBkgSBjzxvcFJlcT48c2VyaWFsTm8+VzIwMjMwNDI0MTcxMzQ0MDUwODc8L3NlcmlhbE5vPjxyZXFUaW1lPjIwMjMwNDI0MTgwNTA2PC9yZXFUaW1lPjxSZXFQYXJhbT48SllYSD5XMjAyMzA0MjQxNzEzNDQwNTA4NzwvSllYSD48L1JlcVBhcmFtPjwvb3BSZXE+oIIC0TCCAs0wggJxoAMCAQICBRBVc1EWMAwGCCqBHM9VAYN1BQAwXDELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEbMBkGA1UEAwwSQ0ZDQSBURVNUIFNNMiBPQ0ExMB4XDTIzMDMwOTAyNTUzM1oXDTI1MDMwOTAyNTUzM1owcjELMAkGA1UEBhMCQ04xDDAKBgNVBAoMA0JPQzETMBEGA1UECwwKQ0ZDQVRlY2hURTEZMBcGA1UECwwQT3JnYW5pemF0aW9uYWwtMjElMCMGA1UEAwwcQ0ZDQVRlY2hURUB0ZXN0cWl5ZUBaMTExMTFAMTBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABPHX9dm+K8G4WGe2uAHWZKI0aJgmHQfcTyK6jxKvEC5ADcptfpbe2u0cgSwBXFsyAuXY/6wq2vm1wyzmKqGCikGjggEGMIIBAjAfBgNVHSMEGDAWgBRr/hjaj0I6prhtsy6Igzo0osEw4TAMBgNVHRMBAf8EAjAAMEgGA1UdIARBMD8wPQYIYIEchu8qAQEwMTAvBggrBgEFBQcCARYjaHR0cDovL3d3dy5jZmNhLmNvbS5jbi91cy91cy0xNC5odG0wOQYDVR0fBDIwMDAuoCygKoYoaHR0cDovL3VjcmwuY2ZjYS5jb20uY24vU00yL2NybDQ3MDc2LmNybDAOBgNVHQ8BAf8EBAMCBsAwHQYDVR0OBBYEFEr8/JLNuSXaME4XwdfG4VbI1nppMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAMBggqgRzPVQGDdQUAA0gAMEUCIDO8ojBrfnfn1xqHqLovnTRUmSfwmKBPHSCjIf7DBQUzAiEAnGcbKMqUfYj+35WqRfZrb9u34IcgYg0sOc9l/TKHol0xgdQwgdECAQEwZTBcMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDDBJDRkNBIFRFU1QgU00yIE9DQTECBRBVc1EWMAwGCCqBHM9VAYMRBQAwDQYJKoEcz1UBgi0BBQAESDBGAiEAohIVn9P6WRg+ZdOzqgqKs38tRhG13f3jv1EEp9CQn+0CIQC//I83nEjczU5TgF273KCuCILgzUodySc3osMUyuEiGw== * */ NBYHResponse nbyhResponse = new NBYHResponse(); boolean flag = false; MallMemberWithdrawMsg mallMemberWithdrawMsg = mallMemberWithdrawMapper.selectMsgByWithdrawNo(id); // if(ObjectUtil.isNotEmpty(mallMemberWithdrawMsg)){ // Integer status = mallMemberWithdrawMsg.getStatus(); // if(1 == status){ // nbyhResponse.setFlag(flag); // return nbyhResponse; // } // } MallMemberWithdraw mallMemberWithdraw = mallMemberWithdrawMapper.selectById(id); MallMemberBank mallMemberBank = mallMemberBankMapper.selectById(mallMemberWithdraw.getWtihdrawTypeId()); try { String requestDataForWithDraw = getRequestDataForWithDraw("srv008_transferResultInfoQuery", "转账结果查询", mallMemberWithdraw, mallMemberBank); String responseStr = executeServerHttpService(requestDataForWithDraw); errorMessage = responseStr.substring(responseStr.indexOf("") + 10, responseStr.indexOf("")); String SBYYStr = responseStr.substring(responseStr.indexOf("") + 6, responseStr.indexOf("")); nbyhResponse.setMsg(errorMessage+SBYYStr); boolean b = parseReturnValue(responseStr); if(b){ if(ObjectUtil.isNotEmpty(mallMemberWithdrawMsg)){ mallMemberWithdrawMsg.setStatus(1); mallMemberWithdrawMsgMapper.updateById(mallMemberWithdrawMsg); } flag = true; } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } nbyhResponse.setFlag(flag); return nbyhResponse; } @Override public boolean accountInfoQuery(Long id) { boolean flag = false; MallMemberWithdraw mallMemberWithdraw = mallMemberWithdrawMapper.selectById(id); try { String requestDataForWithDraw = getRequestDataForWithDraw("srv003_singleAccountInfoQuery", "账户余额及基本信息查询", mallMemberWithdraw, null); String responseStr = executeServerHttpService(requestDataForWithDraw); String stateStr = responseStr.substring(responseStr.indexOf("") + 7, responseStr.indexOf("")); String KYERStr = responseStr.substring(responseStr.indexOf("") + 6, responseStr.indexOf("")); BigDecimal amount = BigDecimal.ZERO; if(mallMemberWithdraw.getRemark().equals("凭证提现")){ amount = mallMemberWithdraw.getAmount().setScale(2, BigDecimal.ROUND_DOWN); }else{ amount = mallMemberWithdraw.getAmount().subtract(mallMemberWithdraw.getAmountFee()).setScale(2, BigDecimal.ROUND_DOWN); } if(stateStr.equals("0") && new BigDecimal(KYERStr).compareTo(amount) >= 0){ flag = true; } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 执行交易 * * @throws Exception */ @SuppressWarnings("rawtypes") public String executeServerHttpService(String requestData) throws Exception { // public static void executeServerHttpService(String serviceId, String serviceName, String serialNo,String requestData) throws Exception { // 处理交易的url DataDictionaryCustom urlDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.BANK_TRANS_URL.getType(), DataDictionaryEnum.BANK_TRANS_URL.getCode() ); StringBuffer urlSb = new StringBuffer(); urlSb.append("http://"); urlSb.append(urlDic.getValue()); urlSb.append("/directlink/httpAccess"); java.net.URL url = new URL(urlSb.toString()); // java.net.URL url = new URL(URL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (cookies != null) { // 如果已登录,设置coikie connection.setRequestProperty("cokie", cookies); } // 请求以utf-8格式编码 connection.setRequestProperty("content-type", "text/xml;charset=utf-8"); connection.setDoInput(true); connection.setDoOutput(true); // post方式发送 connection.setRequestMethod("POST"); OutputStream out = connection.getOutputStream(); // 组装完整的交易报文 // String reqData = getRequestData(serviceId,serviceName,serialNo); String reqData = requestData; // utf-8 编码发送 System.out.println("请求报文:\n" + reqData); out.write(reqData.getBytes("UTF-8")); out.flush(); out.close(); int retCode = connection.getResponseCode(); if (retCode != 200) { throw new Exception("交易出错!retCode=" + retCode); } // 设置cookie Map heads = connection.getHeaderFields(); Object[] headNames = heads.keySet().toArray(); for (int i = 0; i < headNames.length; i++) { if (headNames[i] == null) { continue; } if ("Set-Cookie".equalsIgnoreCase((String) headNames[i])) { cookies = connection.getHeaderField(headNames[i] .toString()); } } int len = connection.getContentLength(); byte[] retData = readContent(connection.getInputStream(), len); String retStr = new String(retData, "UTF-8"); System.out.println("【返回报文】Ret Data:\n " + retStr); return retStr; // return parseReturnValue(retStr); } /** * 组装完整的报文 * * @param serviceId * @return * @throws FileNotFoundException * @throws IOException */ // public static String getRequestData(String serviceId, String serviceName, String serialNo) // throws FileNotFoundException, IOException { // StringBuffer buf = new StringBuffer(); // // 报文编码格式utf-8 // buf.append(""); // buf.append(""); // buf.append(sessionId); // buf.append(""); // buf.append(""); // buf.append(serviceId); // buf.append(""); // String reqData = ""; // if (serviceId.equals("srv001_signOn")) { // reqData = SIGN_MESSAGE; // } else if (serviceId.equals("srv006_singleInnerTransfer")) { // reqData = TRADE_MESSAGE_SINGLE; // /** // * ${serialNo}${reqTime}82260120102022631780401220000592777923119570.01银企接口测试 // * // * ${serialNo} // * ${reqTime} // * // * ${FKZH} // * ${SKZH} // * ${SKHM} // * ${JYJE} // * ${YOTU} // * // * // */ // reqData = reqData.replaceFirst("\\$\\{FKZH\\}", serialNo); // reqData = reqData.replaceFirst("\\$\\{SKZH\\}", serialNo); // reqData = reqData.replaceFirst("\\$\\{SKHM\\}", serialNo); // reqData = reqData.replaceFirst("\\$\\{JYJE\\}", serialNo); // reqData = reqData.replaceFirst("\\$\\{YOTU\\}", serialNo); // }else if (serviceId.equals("srv007_singleOuterTransfer")) { // reqData = TRADE_MESSAGE; // }else if (serviceId.equals("srv008_transferResultInfoQuery")) { // reqData = TRADE_MESSAGE_SEARCH; // //原订单流水号 // reqData = reqData.replaceFirst("\\$\\{serialNoOld\\}", serialNo); // } //// String serialNo = String.valueOf(Math.round(Math.random() * 10000)) //// + System.currentTimeMillis(); // Calendar calendar = Calendar.getInstance(); // Date date = calendar.getTime(); // SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); // // String reqTime = sdf.format(date); // reqData = reqData.replaceFirst("\\$\\{serialNo\\}", serialNo); // reqData = reqData.replaceFirst("\\$\\{reqTime\\}", reqTime); // String signData = null; // try { // signData = signData(reqData); // signData = getNodeValue(signData, "signed_data"); // } catch (Exception e) { // e.printStackTrace(); // } // buf.append(""); // buf.append(customerId); // buf.append(""); // buf.append(""); // buf.append(softwareId); // buf.append(""); // buf.append(""); // buf.append(serviceId.substring(0, 6)); // buf.append(""); // buf.append(""); // buf.append(serviceName); // buf.append(""); // buf.append(reqData + "" + signData // + ""); // return buf.toString(); // } /** * 组装完整的报文 * * @param serviceId * @return * @throws FileNotFoundException * @throws IOException */ public String getRequestDataForWithDraw(String serviceId, String serviceName,MallMemberWithdraw mallMemberWithdraw,MallMemberBank mallMemberBank) throws FileNotFoundException, IOException { StringBuffer buf = new StringBuffer(); // 报文编码格式utf-8 buf.append(""); buf.append(""); buf.append(sessionId); buf.append(""); buf.append(""); buf.append(serviceId); buf.append(""); String reqData = ""; DataDictionaryCustom fkzhDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.BANK_TRANS_FKZH.getType(), DataDictionaryEnum.BANK_TRANS_FKZH.getCode() ); DataDictionaryCustom customerIdDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.BANK_TRANS_customerId.getType(), DataDictionaryEnum.BANK_TRANS_customerId.getCode() ); DataDictionaryCustom softwareIdDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.BANK_TRANS_softwareId.getType(), DataDictionaryEnum.BANK_TRANS_softwareId.getCode() ); if (serviceId.equals("srv001_signOn")) { reqData = SIGN_MESSAGE; } else if (serviceId.equals("srv006_singleInnerTransfer")) { reqData = TRADE_MESSAGE_SINGLE; /** * ${serialNo}${reqTime}82260120102022631780401220000592777923119570.01银企接口测试 * * ${serialNo} * ${reqTime} * * ${FKZH} * ${SKZH} * ${SKHM} * ${JYJE} * ${YOTU} * * * * */ reqData = reqData.replaceFirst("\\$\\{FKZH\\}", fkzhDic.getValue()); reqData = reqData.replaceFirst("\\$\\{SKZH\\}", mallMemberBank.getBankNo()); reqData = reqData.replaceFirst("\\$\\{SKHM\\}", mallMemberBank.getName()); if(mallMemberWithdraw.getRemark().equals("凭证提现")){ reqData = reqData.replaceFirst("\\$\\{JYJE\\}", mallMemberWithdraw.getAmount().setScale(2, BigDecimal.ROUND_DOWN).toString()); }else{ reqData = reqData.replaceFirst("\\$\\{JYJE\\}", mallMemberWithdraw.getAmount().subtract(mallMemberWithdraw.getAmountFee()).setScale(2, BigDecimal.ROUND_DOWN).toString()); } reqData = reqData.replaceFirst("\\$\\{YOTU\\}", "行内转账"); }else if (serviceId.equals("srv007_singleOuterTransfer")) { /** * ${serialNo}${reqTime}822601201020226316228481060643871117王苏平中国农业银行舟山市定海支行营业中心浙江省舟山市0.01银企接口测试103342040518 * * ${serialNo} * ${reqTime} * * ${FKZH} * ${SKZH} * ${SKHM} * ${SKYH} * ${SKSH} * ${SKSI} * ${JYJE} * ${YOTU} * ${SKHH} * * * * ${serialNo}${reqTime}${FKZH}${SKZH}${SKHM}${SKYH}${SKSH}${SKSI}${JYJE}${YOTU}${SKHH} */ reqData = TRADE_MESSAGE; reqData = reqData.replaceFirst("\\$\\{FKZH\\}", fkzhDic.getValue()); reqData = reqData.replaceFirst("\\$\\{SKZH\\}", mallMemberBank.getBankNo()); reqData = reqData.replaceFirst("\\$\\{SKHM\\}", mallMemberBank.getName()); reqData = reqData.replaceFirst("\\$\\{SKYH\\}", mallMemberBank.getBankName()+mallMemberBank.getSubbranchName()); reqData = reqData.replaceFirst("\\$\\{SKSH\\}", mallMemberBank.getProvince()); reqData = reqData.replaceFirst("\\$\\{SKSI\\}", mallMemberBank.getCity()); if(mallMemberWithdraw.getRemark().equals("凭证提现")){ reqData = reqData.replaceFirst("\\$\\{JYJE\\}", mallMemberWithdraw.getAmount().setScale(2, BigDecimal.ROUND_DOWN).toString()); }else{ reqData = reqData.replaceFirst("\\$\\{JYJE\\}", mallMemberWithdraw.getAmount().subtract(mallMemberWithdraw.getAmountFee()).setScale(2, BigDecimal.ROUND_DOWN).toString()); } reqData = reqData.replaceFirst("\\$\\{YOTU\\}", "跨行汇款"); // reqData = reqData.replaceFirst("\\$\\{SKHH\\}", mallMemberBank.getSkhh()); }else if (serviceId.equals("srv008_transferResultInfoQuery")) { reqData = TRADE_MESSAGE_SEARCH; //原订单流水号 reqData = reqData.replaceFirst("\\$\\{serialNoOld\\}", mallMemberWithdraw.getWithdrawNo()); }else if (serviceId.equals("srv003_singleAccountInfoQuery")) { reqData = ACCOUNT_MESSAGE_SEARCH; /** * * ${serialNo} * ${reqTime} * * ${ZHHA} * * * ${serialNo}${reqTime}${ZHHA} */ //原订单流水号 reqData = reqData.replaceFirst("\\$\\{ZHHA\\}", fkzhDic.getValue()); } // String serialNo = String.valueOf(Math.round(Math.random() * 10000)) // + System.currentTimeMillis(); Calendar calendar = Calendar.getInstance(); Date date = calendar.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String reqTime = sdf.format(date); reqData = reqData.replaceFirst("\\$\\{serialNo\\}", mallMemberWithdraw.getWithdrawNo()); reqData = reqData.replaceFirst("\\$\\{reqTime\\}", reqTime); String signData = null; try { signData = signData(reqData); signData = getNodeValue(signData, "signed_data"); } catch (Exception e) { e.printStackTrace(); } buf.append(""); buf.append(customerIdDic.getValue()); buf.append(""); buf.append(""); buf.append(softwareIdDic.getValue()); buf.append(""); buf.append(""); buf.append(serviceId.substring(0, 6)); buf.append(""); buf.append(""); buf.append(serviceName); buf.append(""); buf.append(reqData + "" + signData + ""); return buf.toString(); } /** * 数据加密 *
* 重点 *
* 1.orignalData.getBytes("GBK").length 获取GBK编码格式的字节长度,为了通过格式验证 *
* 2.new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"GBK")); 指定流的编码格式,使加密服务接收到正确的中文字符 *
* * @param orignalData 原报文体 * @return * @throws UnsupportedEncodingException */ public String signData(String orignalData) throws UnsupportedEncodingException { InetAddress addr = null; Socket socket = null; // 加密报文编码格式gbk String verifyheader = "\n" + "\n" + "\n" + "0\n" + "1005\n" + "0\n" + "1\n" + "\n" + "\n" + "" + orignalData.getBytes("GBK").length + "\n" + "" + orignalData + "\n" + "\n" + ""; DataDictionaryCustom VERIFY_IPDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.BANK_TRANS_VERIFY_IP.getType(), DataDictionaryEnum.BANK_TRANS_VERIFY_IP.getCode() );DataDictionaryCustom VERIFY_PORT_Dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.BANK_TRANS_VERIFY_PORT.getType(), DataDictionaryEnum.BANK_TRANS_VERIFY_PORT.getCode() ); try { addr = InetAddress.getByName(VERIFY_IPDic.getValue()); socket = new Socket(addr, Integer.parseInt(VERIFY_PORT_Dic.getValue())); // InetAddress localHost = addr.getLocalHost(); // socket = new Socket(localHost, VERIFY_PORT); // 发送 BufferedWriter wr = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(),"GBK")); System.out.println("【数据加密】加密的明文:" + verifyheader); wr.write(verifyheader); wr.flush(); // 接收 BufferedReader rd = new BufferedReader(new InputStreamReader( socket.getInputStream(),"ISO8859-1")); String line = null; StringBuffer sb = new StringBuffer(); while ((line = rd.readLine()) != null) { sb.append(line); } // 处理返回 String returnStr = new String(sb.toString().getBytes("ISO8859-1"),"GBK"); System.out.println("【数据加密】返回的密文:" + returnStr); wr.close(); rd.close(); socket.close(); return returnStr; } catch (Exception e) { e.printStackTrace(); } return ""; } /** * 从加密返回密文中取出signData * * @param returnStr * @param tagName * @return */ public static String getNodeValue(String returnStr, String tagName) { int startIdx, endIdx; String beginTag = "<" + tagName + ">"; String endTag = ""; startIdx = returnStr.indexOf(beginTag) + beginTag.length(); endIdx = returnStr.indexOf(endTag, startIdx); return returnStr.substring(startIdx, endIdx); } /** * 处理返回信息 * * @param src * @throws Exception */ public static boolean parseReturnValueForTrade(String src) throws Exception { int beginIndex = src.indexOf(""); int endIndex = src.indexOf(""); String sessionIdRep = ""; if (beginIndex != -1 && endIndex != -1) { sessionIdRep = src.substring(beginIndex + 11, endIndex); } if (!sessionIdRep.equals("-1") && !sessionId.equals("-1") && !sessionId.equals(sessionIdRep)) // throw new Exception("上送的sessionId和返回的sessionId不一致! " + src); return false; if (sessionId.equals("-1")) sessionId = sessionIdRep; retCode = src.substring(src.indexOf("") + 9, src.indexOf("")); String JyztStr = src.substring(src.indexOf("") + 6, src.indexOf("")); String YddmStr = src.substring(src.indexOf("") + 6, src.indexOf("")); try { errorMessage = src.substring(src.indexOf("") + 10, src.indexOf("")); } catch (Exception e) { } // if (retCode == null || !retCode.equals("0000")) { // throw new Exception("ServerException: ErrorCode=" + retCode // + " ErrorMessage=" + errorMessage); // } /** * JyztStr * 交易成功 90 * 银行已受理,可通过转账结果查询进行状态查证 94 * 交易处理中,需过转账结果查询接口进行状态查证 99或者值为空 * * YddmStr * 0000或000000表示成功,其他标识失败 */ if((JyztStr.equals("90") || JyztStr.equals("94") || JyztStr.equals("99")) && (YddmStr.equals("0000") || YddmStr.equals("000000"))){ return true; }else{ return false; } } /** * 处理返回信息 * * @param src * @throws Exception */ public static boolean parseReturnValue(String src) throws Exception { int beginIndex = src.indexOf(""); int endIndex = src.indexOf(""); String sessionIdRep = ""; if (beginIndex != -1 && endIndex != -1) { sessionIdRep = src.substring(beginIndex + 11, endIndex); } if (!sessionIdRep.equals("-1") && !sessionId.equals("-1") && !sessionId.equals(sessionIdRep)) // throw new Exception("上送的sessionId和返回的sessionId不一致! " + src); return false; if (sessionId.equals("-1")) sessionId = sessionIdRep; retCode = src.substring(src.indexOf("") + 9, src.indexOf("")); String JyztStr = src.substring(src.indexOf("") + 6, src.indexOf("")); String YddmStr = src.substring(src.indexOf("") + 6, src.indexOf("")); try { errorMessage = src.substring(src.indexOf("") + 10, src.indexOf("")); } catch (Exception e) { } // if (retCode == null || !retCode.equals("0000")) { // throw new Exception("ServerException: ErrorCode=" + retCode // + " ErrorMessage=" + errorMessage); // } /** * JyztStr * 交易成功 90 * 银行已受理,可通过转账结果查询进行状态查证 94 * 交易处理中,需过转账结果查询接口进行状态查证 99或者值为空 * * YddmStr * 0000或000000表示成功,其他标识失败 */ if((JyztStr.equals("90")) && (YddmStr.equals("0000") || YddmStr.equals("000000"))){ return true; }else{ return false; } } /** * 读取返回信息 * * @param in * @param len * @return * @throws IOException */ public static byte[] readContent(InputStream in, int len) throws IOException { if (len <= 0) { byte[] buf = new byte[2048]; byte[] readBuf = new byte[1024]; int totalLen = 0; while (true) { int readLen = in.read(readBuf); if (readLen <= 0) break; if (totalLen + readLen > buf.length) { byte[] tmp = new byte[buf.length + readLen + 1024]; System.arraycopy(buf, 0, tmp, 0, totalLen); buf = tmp; } System.arraycopy(readBuf, 0, buf, totalLen, readLen); totalLen = totalLen + readLen; } byte[] retBuf = new byte[totalLen]; System.arraycopy(buf, 0, retBuf, 0, totalLen); return retBuf; } else { int totalLen = 0; byte[] buf = new byte[len]; while (totalLen < len) { int readLen = in.read(buf, totalLen, len - totalLen); if (readLen <= 0) break; totalLen = totalLen + readLen; } return buf; } } }