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 = "" + tagName + ">";
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;
}
}
}