import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.*; import java.net.Socket; import java.text.ParseException; import java.util.Date; public class BankTest { private static String bank_address_ip = "中转服务器IP地址"; private static int bank_address_ip_port = 15999; private static String date = "20230601"; //yyyyMMdd private static String time = "162216"; //HHmmss private static String reqNo = ""+ new Date().getTime(); private static String corp_no = "客户号"; //16位客户号 private static String op_no = "0001"; //操作员 private static String db_acc_no = ""; // 15位 借贷方、付款账户 private static String db_acc_name = ""; // 付款方户名 private static String cr_acc_no = ""; // 15位 贷方 收款方账号 private static String cr_acc_name = ""; // 收款方户名 public static void main(String[] args) throws ParseException { getBankBalance(); // getTransferCallback("20230601133647392"); } private static String getXmlData(int type,String code) { String xmlData = ""; String publicData = " <CCTransCode>"+code+"</CCTransCode>\n" + " <ProductID>ICC</ProductID>\n" + " <CorpNo>"+corp_no+"</CorpNo>\n" + " <OpNo>"+op_no+"</OpNo>\n" + " <AuthNo></AuthNo>\n" + " <ReqSeqNo>"+reqNo+"</ReqSeqNo>\n" + " <ReqDate>"+date+"</ReqDate>\n" + " <ReqTime>"+time+"</ReqTime>\n" + " <Sign></Sign>\n" + " <ChannelType>ERP</ChannelType>\n"; switch (type){ case 1: xmlData = "<ap>\n" + publicData + " <Cmp>\n" + " <DbAccNo>"+db_acc_no+"</DbAccNo>\n" + " <DbProv>02</DbProv>\n" + " <DbCur>01</DbCur>\n" + " </Cmp>\n" + "</ap>"; break; case 2: xmlData = "<ap>\n" + publicData + " <Corp>\n" + " <StartDate>20230531</StartDate>\n" + " <EndDate>20230531</EndDate>\n" + " </Corp>\n" + " <Channel>\n" + " <LastJrnNo>0</LastJrnNo>\n" + " </Channel>\n" + " <Cmp>\n" + " <DbAccNo>"+db_acc_no+"</DbAccNo>\n" + " <DbProv>02</DbProv>\n" + " <DbCur>01</DbCur>\n" + " </Cmp>\n" + "</ap>"; break; case 3: xmlData = "<ap>\n" + publicData + " <Amt>15.00</Amt>\n" + " <Cmp>\n" + " <DbProv>02</DbProv>\n" + " <DbAccNo>"+db_acc_no+"</DbAccNo>\n" + " <DbCur>01</DbCur>\n" + " <CrProv>02</CrProv>\n" + " <CrAccNo>"+cr_acc_no+"</CrAccNo>\n" + " <CrCur>01</CrCur>\n" + " <ConFlag>0</ConFlag>\n" + " </Cmp>\n" + " <Corp>\n" + " <OthBankFlag>0</OthBankFlag>\n" + " <CrAccName>"+cr_acc_name+"</CrAccName>\n" + //他行开户行户名 " <CrBankName></CrBankName>\n" + // 他行开户行行名 本行不填写 " <CrBankNo></CrBankNo>\n" + // 他行开户行帐号 本行不填写 " <DbAccName>"+db_acc_name+"</DbAccName>\n" + " <WhyUse></WhyUse>\n" + " <Postscript></Postscript>\n" + " </Corp>\n" + "</ap>"; break; case 4: xmlData = "<ap>\n" + publicData + " <Cme>\n" + " <SerialNo>申请转账时提交的ReqSeqNo</SerialNo>\n" + " </Cme>\n" + "</ap>"; break; } return xmlData; } private static void getBankBalance(){ Socket socket = null; OutputStream outputStream = null; InputStream inputStream = null; BufferedReader bufferedReader = null; try { socket = new Socket(bank_address_ip, bank_address_ip_port); String xmlData = ""; /** * 查询银行账户余额 * */ int type = 1; xmlData = getXmlData(type,"CQRA06"); /** * 查询银行账户交易明显 * */ // type = 2; // xmlData = getXmlData(type,"CQRA10"); /** * 银行转账对公 * */ // type = 3; // xmlData = getXmlData(type,"CFRT02"); outputStream = socket.getOutputStream(); byte[] head = new byte[]{0,' ',' ',' ',' ',' ',' '}; byte[] gbks = xmlData.getBytes("gbk"); String l = gbks.length + ""; for(int i =0;i<l.length();i++){ head[i+1] = (byte) l.charAt(i); } System.out.println("请求报文:"+ "0" + String.format("%1$-6s",l) + xmlData); outputStream.write(head); outputStream.write(gbks); outputStream.flush(); inputStream = socket.getInputStream(); bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"GBK") ); String readData = null; System.out.println("响应报文:"); StringBuffer sb = new StringBuffer(); while ((readData = bufferedReader.readLine()) != null) { System.out.println(readData); sb.append(readData); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (outputStream != null) outputStream.close(); if (bufferedReader != null) bufferedReader.close(); if (inputStream != null) inputStream.close(); if (socket != null) socket.close(); } catch (IOException exception) { exception.printStackTrace(); } } } private static void getTransferCallback(String reqNo){ Socket socket = null; OutputStream outputStream = null; InputStream inputStream = null; BufferedReader bufferedReader = null; try { socket = new Socket(bank_address_ip, bank_address_ip_port); int type = 4; String xmlData = getXmlData(4,"CQRT71"); outputStream = socket.getOutputStream(); byte[] head = new byte[]{0,' ',' ',' ',' ',' ',' '}; byte[] gbks = xmlData.getBytes("gbk"); String l = gbks.length + ""; for(int i =0;i<l.length();i++){ head[i+1] = (byte) l.charAt(i); } System.out.println("请求报文:"+ "0" + String.format("%1$-6s",l) + xmlData); outputStream.write(head); outputStream.write(gbks); outputStream.flush(); inputStream = socket.getInputStream(); bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"GBK") ); String readData = null; System.out.println("响应报文:"); StringBuffer sb = new StringBuffer(); while ((readData = bufferedReader.readLine()) != null) { System.out.println(readData); sb.append(readData); } parseXmlString(sb.toString().substring(sb.indexOf("<"),sb.toString().length()),type,""); } catch (Exception e) { e.printStackTrace(); } finally { try { if (outputStream != null) outputStream.close(); if (bufferedReader != null) bufferedReader.close(); if (inputStream != null) inputStream.close(); if (socket != null) socket.close(); } catch (IOException exception) { exception.printStackTrace(); } } } public static void parseXmlString(String xmlString,int type,String reqNo) throws ParserConfigurationException, IOException, SAXException { //创建DOM解析器的工厂实例 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //从DOM工厂中获取解析器 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //使用解析器生成Document实例 Document document = documentBuilder.parse(new InputSource(new StringReader(xmlString))); //获取responsedata元素的节点列表 NodeList responsedata = document.getElementsByTagName("ap"); //遍历该节点列表 for (int i=0; i< responsedata.getLength();i++){ //获取具体的元素 org.w3c.dom.Element node = (org.w3c.dom.Element) responsedata.item(i); String respSource = node.getElementsByTagName("RespSource").item(0).getFirstChild().getNodeValue(); System.out.println("状态:"+node.getElementsByTagName("RespSource").item(0).getFirstChild().getNodeValue()); if("0".equals(respSource)) { if(type == 1) { //输出值 System.out.println("余额:" + node.getElementsByTagName("Bal").item(0).getFirstChild().getNodeValue()); System.out.println("账户可用余额:" + node.getElementsByTagName("AvailBal").item(0).getFirstChild().getNodeValue()); } } } } }
银企直联与前置机socket通信-Java代码通过Socket
最新推荐文章于 2023-11-10 13:38:33 发布