From caaa1f7bcb66e0ef690c0e844efb623592fee3e1 Mon Sep 17 00:00:00 2001 From: zhaoyiran Date: Tue, 23 Apr 2024 11:07:28 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bank/service/bocom/BocomServiceImpl.java | 94 +++++++++---------- .../win/bank/service/cmb/CmbServiceImpl.java | 81 +--------------- .../java/com/win/bank/utils/HttpUtil.java | 78 +++++++++++++++ src/main/resources/application-dev.yml | 3 +- 4 files changed, 126 insertions(+), 130 deletions(-) create mode 100644 src/main/java/com/win/bank/utils/HttpUtil.java diff --git a/src/main/java/com/win/bank/service/bocom/BocomServiceImpl.java b/src/main/java/com/win/bank/service/bocom/BocomServiceImpl.java index f8c3812..61600d5 100644 --- a/src/main/java/com/win/bank/service/bocom/BocomServiceImpl.java +++ b/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("").append(bankFlag).append(""); body.append(""); - - String response = sendRequest(head, body.toString()); + String message = "" + head + body + ""; + 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.append("1"); + body.append("").append(bankDO.getId()).append(""); + body.append(""); + String message = "" + head + body + ""; + 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("10"); return head.toString(); } - - private String sendRequest(String head, String body) { - String message = "" + head + body + ""; - 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; - } - } diff --git a/src/main/java/com/win/bank/service/cmb/CmbServiceImpl.java b/src/main/java/com/win/bank/service/cmb/CmbServiceImpl.java index 2c1cc9d..c8fc8f6 100644 --- a/src/main/java/com/win/bank/service/cmb/CmbServiceImpl.java +++ b/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 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 params) { ArrayList 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); diff --git a/src/main/java/com/win/bank/utils/HttpUtil.java b/src/main/java/com/win/bank/utils/HttpUtil.java new file mode 100644 index 0000000..de7a75e --- /dev/null +++ b/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; + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index e2d6cae..1b87563 100644 --- a/src/main/resources/application-dev.yml +++ b/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" # 企业用户号