Browse Source

调试

master
zhaoyiran 1 year ago
parent
commit
caaa1f7bcb
  1. 94
      src/main/java/com/win/bank/service/bocom/BocomServiceImpl.java
  2. 81
      src/main/java/com/win/bank/service/cmb/CmbServiceImpl.java
  3. 78
      src/main/java/com/win/bank/utils/HttpUtil.java
  4. 3
      src/main/resources/application-dev.yml

94
src/main/java/com/win/bank/service/bocom/BocomServiceImpl.java

@ -1,10 +1,6 @@
package com.win.bank.service.bocom;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
@ -23,6 +19,7 @@ import org.xml.sax.InputSource;
import com.win.bank.domain.BankDO;
import com.win.bank.enums.PaymentStatusEnum;
import com.win.bank.service.BaseBankService;
import com.win.bank.utils.HttpUtil;
import com.win.bank.utils.XmlUtil;
/**
@ -36,12 +33,9 @@ public class BocomServiceImpl implements BaseBankService {
@Value("${bocom.userNo}")
private String userNo;
@Value("${bocom.ip}")
private String ip;
@Value("${bocom.url}")
private String url;
@Value("${bocom.port}")
private String port;
private static final int CONNECT_TIMEOUT = 15000;
public static final String DEFAULT_CHARSET = "GBK";
private static final String SUCCESS_CODE = "0000";
private static final Logger logger = LoggerFactory.getLogger(BocomServiceImpl.class);
@ -73,10 +67,14 @@ public class BocomServiceImpl implements BaseBankService {
}
body.append("<bank_flag>").append(bankFlag).append("</bank_flag>");
body.append("</body>");
String response = sendRequest(head, body.toString());
String message = "<ap>" + head + body + "</ap>";
logger.debug("发给交通银行的数据:" + XmlUtil.formatXML(message));
try {
byte[] messageByte = message.getBytes(DEFAULT_CHARSET);
String response = HttpUtil.httpPost(url, messageByte, DEFAULT_CHARSET);
logger.debug("收到交通银行返回的数据:" + XmlUtil.formatXML(response));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(response)));
@ -89,7 +87,7 @@ public class BocomServiceImpl implements BaseBankService {
} else {
bankDO.setStatus(PaymentStatusEnum.FAILED.getCode());
}
String message = headElement.getElementsByTagName("particular_info").item(0).getTextContent();
message = headElement.getElementsByTagName("particular_info").item(0).getTextContent();
bankDO.setMessage(message);
} catch (Exception e) {
@ -101,6 +99,39 @@ public class BocomServiceImpl implements BaseBankService {
@Override
public BankDO queryPaymentResult(BankDO bankDO) {
String trCode = "310204";
String head = generateHeadMessage(trCode, bankDO.getId().toString());
StringBuilder body = new StringBuilder();
body.append("<body>");
body.append("<query_flag>1</query_flag>");
body.append("<ogl_serial_no>").append(bankDO.getId()).append("</ogl_serial_no>");
body.append("</body>");
String message = "<ap>" + head + body + "</ap>";
logger.debug("发给交通银行的数据:" + XmlUtil.formatXML(message));
try {
byte[] messageByte = message.getBytes(DEFAULT_CHARSET);
String response = HttpUtil.httpPost(url, messageByte, DEFAULT_CHARSET);
logger.debug("收到交通银行返回的数据:" + XmlUtil.formatXML(response));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(response)));
Element headElement = (Element)document.getDocumentElement().getElementsByTagName("head").item(0);
Element bodyElement = (Element)document.getDocumentElement().getElementsByTagName("body").item(0);
String particularCode = headElement.getElementsByTagName("particular_code").item(0).getTextContent();
if (SUCCESS_CODE.equals(particularCode)) {
bankDO.setStatus(PaymentStatusEnum.SUCCESS.getCode());
String serialNumber = bodyElement.getElementsByTagName("ogl_serial_no").item(0).getTextContent();
bankDO.setSerialNumber(serialNumber);
} else {
bankDO.setStatus(PaymentStatusEnum.FAILED.getCode());
}
message = headElement.getElementsByTagName("particular_info").item(0).getTextContent();
bankDO.setMessage(message);
} catch (Exception e) {
e.printStackTrace();
}
return bankDO;
}
@ -114,43 +145,4 @@ public class BocomServiceImpl implements BaseBankService {
.append("</tr_time><atom_tr_count>1</atom_tr_count><channel>0</channel></head>");
return head.toString();
}
private String sendRequest(String head, String body) {
String message = "<ap>" + head + body + "</ap>";
logger.debug("发给银行的数据:" + XmlUtil.formatXML(message));
String response = "";
try {
int soTimeOut = CONNECT_TIMEOUT;
Socket socket = new Socket(ip, Integer.parseInt(port));
socket.setSoTimeout(soTimeOut);
byte[] messageByte = message.getBytes(DEFAULT_CHARSET);
// 7位头
String length = "0" + messageByte.length + " ";
length = length.substring(0, 7);
message = length + message;
messageByte = message.getBytes(DEFAULT_CHARSET);
BufferedOutputStream wr = new BufferedOutputStream(socket.getOutputStream());
wr.write(messageByte);
wr.flush();
BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream(), DEFAULT_CHARSET));
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = rd.readLine()) != null) {
sb.append(line);
}
response = new String(sb.toString().getBytes());
wr.close();
rd.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
if (StringUtils.isNotEmpty(response)) {
response = response.substring(response.indexOf("<"));
logger.debug("收到银行返回的数据:" + XmlUtil.formatXML(response));
return response;
}
return response;
}
}

81
src/main/java/com/win/bank/service/cmb/CmbServiceImpl.java

@ -1,19 +1,13 @@
package com.win.bank.service.cmb;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -26,6 +20,7 @@ import com.google.gson.JsonObject;
import com.win.bank.domain.BankDO;
import com.win.bank.enums.PaymentStatusEnum;
import com.win.bank.service.BaseBankService;
import com.win.bank.utils.HttpUtil;
import com.win.bank.utils.JsonUtil;
/**
@ -47,9 +42,6 @@ public class CmbServiceImpl implements BaseBankService {
// 算法,固定为国密算法
private static final String alg = "SM";
private static final int CONNECT_TIMEOUT = 15000;
private static final int READ_TIMEOUT = 60000;
private static final int STATUS_OK = 200;
private static final String SUCCESS_CODE = "SUC0000";
private static final Logger logger = LoggerFactory.getLogger(CmbServiceImpl.class);
@ -141,82 +133,17 @@ public class CmbServiceImpl implements BaseBankService {
map.put("ALG", alg);
map.put("DATA", URLEncoder.encode(data, StandardCharsets.UTF_8.displayName()));
map.put("FUNCODE", funcode);
String response = httpPost(url, map);
byte[] dataByteArray = createLinkString(map).getBytes();
String response = HttpUtil.httpPost(url, dataByteArray, "UTF-8");
if (response.startsWith("CDCServer:")) {
throw new IOException("访问目标地址 " + url + " 失败:" + response);
}
return response;
}
private static String httpPost(String httpUrl, Map<String, String> param) throws IOException, GeneralSecurityException {
HttpURLConnection connection = null;
String result;
try {
URL url = new URL(httpUrl);
SSLContext sslcontext;
sslcontext = SSLContext.getInstance("SSL");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore)null);
X509TrustManager defaultTm = null;
for (TrustManager tm : tmf.getTrustManagers()) {
if (tm instanceof X509TrustManager) {
defaultTm = (X509TrustManager)tm;
break;
}
}
sslcontext.init(null, new TrustManager[] {defaultTm}, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setConnectTimeout(CONNECT_TIMEOUT);
connection.setReadTimeout(READ_TIMEOUT);
connection.setInstanceFollowRedirects(true);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
try (OutputStream os = connection.getOutputStream()) {
os.write(createLinkString(param).getBytes());
if (connection.getResponseCode() != STATUS_OK) {
InputStream is = connection.getErrorStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
StringBuilder sbf = new StringBuilder();
String temp;
while ((temp = br.readLine()) != null) {
sbf.append(temp);
sbf.append("\r\n");
}
result = sbf.toString();
br.close();
is.close();
} else {
InputStream is = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
StringBuilder sbf = new StringBuilder();
String temp;
while ((temp = br.readLine()) != null) {
sbf.append(temp);
}
result = sbf.toString();
br.close();
is.close();
}
}
} finally {
if (connection != null) {
connection.disconnect();
}
}
return result;
}
private static String createLinkString(Map<String, String> params) {
ArrayList<String> keys = new ArrayList<>(params.keySet());
Collections.sort(keys);
StringBuilder prestr = new StringBuilder();
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);

78
src/main/java/com/win/bank/utils/HttpUtil.java

@ -0,0 +1,78 @@
package com.win.bank.utils;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import javax.net.ssl.*;
public class HttpUtil {
private static final int CONNECT_TIMEOUT = 15000;
private static final int READ_TIMEOUT = 60000;
private static final int STATUS_OK = 200;
public static String httpPost(String httpUrl, byte[] data, String charsetName) throws IOException, GeneralSecurityException {
HttpURLConnection connection = null;
String result;
try {
URL url = new URL(httpUrl);
SSLContext sslcontext;
sslcontext = SSLContext.getInstance("SSL");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore)null);
X509TrustManager defaultTm = null;
for (TrustManager tm : tmf.getTrustManagers()) {
if (tm instanceof X509TrustManager) {
defaultTm = (X509TrustManager)tm;
break;
}
}
sslcontext.init(null, new TrustManager[] {defaultTm}, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setConnectTimeout(CONNECT_TIMEOUT);
connection.setReadTimeout(READ_TIMEOUT);
connection.setInstanceFollowRedirects(true);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
try (OutputStream os = connection.getOutputStream()) {
os.write(data);
if (connection.getResponseCode() != STATUS_OK) {
InputStream is = connection.getErrorStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, charsetName));
StringBuilder sbf = new StringBuilder();
String temp;
while ((temp = br.readLine()) != null) {
sbf.append(temp);
sbf.append("\r\n");
}
result = sbf.toString();
br.close();
is.close();
} else {
InputStream is = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, charsetName));
StringBuilder sbf = new StringBuilder();
String temp;
while ((temp = br.readLine()) != null) {
sbf.append(temp);
}
result = sbf.toString();
br.close();
is.close();
}
}
} finally {
if (connection != null) {
connection.disconnect();
}
}
return result;
}
}

3
src/main/resources/application-dev.yml

@ -49,8 +49,7 @@ cmb:
# 交通银行
bocom:
ip: 192.168.0.142
port: 30010
url: http://192.168.0.142:8899
# 企业代码
corpNo: "0020005695"
# 企业用户号

Loading…
Cancel
Save