From 9bd451ac9379f5007cf9106a7c32274c188e7e2a Mon Sep 17 00:00:00 2001 From: zhaoyiran Date: Mon, 22 Apr 2024 14:34:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=A4=E9=80=9A=E9=93=B6=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/win/bank/domain/BankDO.java | 4 + .../bank/service/bocom/BocomServiceImpl.java | 132 +++++++++++++++++- .../com/win/bank/service/demo/Student.java | 56 -------- .../win/bank/service/demo/XStreamUtil.java | 20 --- .../demo/Test.java => utils/XmlUtil.java} | 35 +++-- src/main/resources/application-dev.yml | 15 +- 6 files changed, 164 insertions(+), 98 deletions(-) delete mode 100644 src/main/java/com/win/bank/service/demo/Student.java delete mode 100644 src/main/java/com/win/bank/service/demo/XStreamUtil.java rename src/main/java/com/win/bank/{service/demo/Test.java => utils/XmlUtil.java} (58%) diff --git a/src/main/java/com/win/bank/domain/BankDO.java b/src/main/java/com/win/bank/domain/BankDO.java index cd04e61..1046b5c 100644 --- a/src/main/java/com/win/bank/domain/BankDO.java +++ b/src/main/java/com/win/bank/domain/BankDO.java @@ -37,6 +37,10 @@ public class BankDO extends BaseDO { * 付款账号 */ private String payAccount; + /** + * 付款人户名 + */ + private String payUserName; /** * 收款账号 */ 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 6c6cf87..f8c3812 100644 --- a/src/main/java/com/win/bank/service/bocom/BocomServiceImpl.java +++ b/src/main/java/com/win/bank/service/bocom/BocomServiceImpl.java @@ -1,28 +1,156 @@ 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; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +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.XmlUtil; /** * 交通银行 */ @Service public class BocomServiceImpl implements BaseBankService { + @Value("${bocom.corpNo}") + private String corpNo; + + @Value("${bocom.userNo}") + private String userNo; + + @Value("${bocom.ip}") + private String ip; + + @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); @Override public BankDO payment(BankDO bankDO) { - logger.debug("交通银行 payment"); + String trCode = "210201"; + String head = generateHeadMessage(trCode, bankDO.getId().toString()); + StringBuilder body = new StringBuilder(); + + body.append(""); + body.append("").append(bankDO.getPayAccount().replaceAll("\\s+", "")).append(""); + body.append("").append(bankDO.getPayUserName()).append(""); + body.append("").append(bankDO.getRcvBankName()).append(""); + body.append("").append(bankDO.getRcvAccount().replaceAll("\\s+", "")).append(""); + body.append("").append(bankDO.getRcvUserName()).append(""); + if (StringUtils.isNotEmpty(bankDO.getRcvBankNumber())) { + body.append("").append(bankDO.getRcvBankNumber()).append(""); + } + body.append("CNY"); + body.append("").append(bankDO.getAmount()).append(""); + body.append("").append(bankDO.getId()).append(""); + if (StringUtils.isNotEmpty(bankDO.getPurpose())) { + body.append("").append(bankDO.getPurpose()).append(""); + } + String bankFlag = "0"; + if (StringUtils.isNotEmpty(bankDO.getRcvBankName()) && !bankDO.getRcvBankName().contains("交通银行")) { + bankFlag = "1"; + } + body.append("").append(bankFlag).append(""); + body.append(""); + + String response = sendRequest(head, body.toString()); + + try { + 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); + String particularCode = headElement.getElementsByTagName("particular_code").item(0).getTextContent(); + if (SUCCESS_CODE.equals(particularCode)) { + bankDO.setStatus(PaymentStatusEnum.SUCCESS.getCode()); + String serialNumber = headElement.getElementsByTagName("serial_no").item(0).getTextContent(); + bankDO.setSerialNumber(serialNumber); + } else { + bankDO.setStatus(PaymentStatusEnum.FAILED.getCode()); + } + String message = headElement.getElementsByTagName("particular_info").item(0).getTextContent(); + bankDO.setMessage(message); + + } catch (Exception e) { + e.printStackTrace(); + } + return bankDO; } @Override public BankDO queryPaymentResult(BankDO bankDO) { - logger.debug("交通银行 queryPaymentResult"); return bankDO; } + + private String generateHeadMessage(String trCode, String reqNo) { + SimpleDateFormat sdfd = new SimpleDateFormat("yyyyMMdd"); + SimpleDateFormat sdft = new SimpleDateFormat("HHmmss"); + Date date = new Date(); + StringBuilder head = new StringBuilder(); + head.append("").append(trCode).append("").append(corpNo).append("").append(userNo).append("").append(reqNo) + .append("").append(sdfd.format(date)).append("").append(sdft.format(date)) + .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/demo/Student.java b/src/main/java/com/win/bank/service/demo/Student.java deleted file mode 100644 index d7650ca..0000000 --- a/src/main/java/com/win/bank/service/demo/Student.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.win.bank.service.demo; - - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement -public class Student { - - private String name; // 姓名 - private String sex; // 性别 - private int number; // 学号 - private String className; // 班级 - - public Student(){} - - public Student(String string, String string2, int i, String string3) { - this.name = string; - this.sex = string2; - this.className = string3; - - } - - @XmlElement(name = "name") - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - - @XmlElement(name = "sex") - public String getSex() { - return sex; - } - public void setSex(String sex) { - this.sex = sex; - } - - @XmlElement(name = "number") - public int getNumber() { - return number; - } - public void setNumber(int number) { - this.number = number; - } - - @XmlElement(name = "className") - public String getClassName() { - return className; - } - public void setClassName(String className) { - this.className = className; - } - -} \ No newline at end of file diff --git a/src/main/java/com/win/bank/service/demo/XStreamUtil.java b/src/main/java/com/win/bank/service/demo/XStreamUtil.java deleted file mode 100644 index a81fd87..0000000 --- a/src/main/java/com/win/bank/service/demo/XStreamUtil.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.win.bank.service.demo; - -import java.io.StringWriter; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; - -public class XStreamUtil { - public static String marshal(Object object, Class clazz) throws JAXBException { - JAXBContext jaxbContext = JAXBContext.newInstance(clazz); - Marshaller marshaller = jaxbContext.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); - StringWriter writer = new StringWriter(); - marshaller.marshal(object, writer); - return writer.toString(); - } - -} diff --git a/src/main/java/com/win/bank/service/demo/Test.java b/src/main/java/com/win/bank/utils/XmlUtil.java similarity index 58% rename from src/main/java/com/win/bank/service/demo/Test.java rename to src/main/java/com/win/bank/utils/XmlUtil.java index 3be63fc..78cd4fc 100644 --- a/src/main/java/com/win/bank/service/demo/Test.java +++ b/src/main/java/com/win/bank/utils/XmlUtil.java @@ -1,28 +1,24 @@ -package com.win.bank.service.demo; +package com.win.bank.utils; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import org.dom4j.Document; +import org.dom4j.DocumentException; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; -/** - * @author admin - */ -public class Test { - public static void main(String[] args) throws Exception { - Student st = new Student("张三", "男", 10001, "尖"); - String xml = XStreamUtil.marshal(st, Student.class); - System.out.println(xml); - // System.out.println(formatXML(xml)); - } - - public static String formatXML(String inputXML) throws Exception { +public class XmlUtil { + public static String formatXML(String inputXML) { SAXReader reader = new SAXReader(); - Document document = reader.read(new StringReader(inputXML)); + Document document = null; + try { + document = reader.read(new StringReader(inputXML)); + } catch (DocumentException e) { + throw new RuntimeException(e); + } String requestXML = null; XMLWriter writer = null; if (document != null) { @@ -30,8 +26,12 @@ public class Test { StringWriter stringWriter = new StringWriter(); OutputFormat format = new OutputFormat(" ", true); writer = new XMLWriter(stringWriter, format); - writer.write(document); - writer.flush(); + try { + writer.write(document); + writer.flush(); + } catch (IOException e) { + throw new RuntimeException(e); + } requestXML = stringWriter.getBuffer().toString(); } finally { if (writer != null) { @@ -42,7 +42,6 @@ public class Test { } } } - return requestXML; + return requestXML.substring(requestXML.indexOf(">") + 1); } - } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 128deac..e2d6cae 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -41,6 +41,17 @@ logging: # 招商银行 cmb: + # 用户ID,前置机查看 uid: N002986522 - busMod: 00002 - url: http://192.168.0.142:8080/cdcserver/api/v2 \ No newline at end of file + # 业务模式,前置机查看 + busMod: "00002" + url: http://192.168.0.142:8080/cdcserver/api/v2 + +# 交通银行 +bocom: + ip: 192.168.0.142 + port: 30010 + # 企业代码 + corpNo: "0020005695" + # 企业用户号 + userNo: "00003"