6 changed files with 164 additions and 98 deletions
@ -1,28 +1,156 @@ |
|||||
package com.win.bank.service.bocom; |
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.Logger; |
||||
import org.slf4j.LoggerFactory; |
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
import org.springframework.stereotype.Service; |
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.domain.BankDO; |
||||
|
import com.win.bank.enums.PaymentStatusEnum; |
||||
import com.win.bank.service.BaseBankService; |
import com.win.bank.service.BaseBankService; |
||||
|
import com.win.bank.utils.XmlUtil; |
||||
|
|
||||
/** |
/** |
||||
* 交通银行 |
* 交通银行 |
||||
*/ |
*/ |
||||
@Service |
@Service |
||||
public class BocomServiceImpl implements BaseBankService { |
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); |
private static final Logger logger = LoggerFactory.getLogger(BocomServiceImpl.class); |
||||
|
|
||||
@Override |
@Override |
||||
public BankDO payment(BankDO bankDO) { |
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>"); |
||||
|
body.append("<pay_acno>").append(bankDO.getPayAccount().replaceAll("\\s+", "")).append("</pay_acno>"); |
||||
|
body.append("<pay_acname>").append(bankDO.getPayUserName()).append("</pay_acname>"); |
||||
|
body.append("<rcv_bank_name>").append(bankDO.getRcvBankName()).append("</rcv_bank_name>"); |
||||
|
body.append("<rcv_acno>").append(bankDO.getRcvAccount().replaceAll("\\s+", "")).append("</rcv_acno>"); |
||||
|
body.append("<rcv_acname>").append(bankDO.getRcvUserName()).append("</rcv_acname>"); |
||||
|
if (StringUtils.isNotEmpty(bankDO.getRcvBankNumber())) { |
||||
|
body.append("<rcv_bank_no>").append(bankDO.getRcvBankNumber()).append("</rcv_bank_no>"); |
||||
|
} |
||||
|
body.append("<cur_code>CNY</cur_code>"); |
||||
|
body.append("<amt>").append(bankDO.getAmount()).append("</amt>"); |
||||
|
body.append("<cert_no>").append(bankDO.getId()).append("</cert_no>"); |
||||
|
if (StringUtils.isNotEmpty(bankDO.getPurpose())) { |
||||
|
body.append("<summary>").append(bankDO.getPurpose()).append("</summary>"); |
||||
|
} |
||||
|
String bankFlag = "0"; |
||||
|
if (StringUtils.isNotEmpty(bankDO.getRcvBankName()) && !bankDO.getRcvBankName().contains("交通银行")) { |
||||
|
bankFlag = "1"; |
||||
|
} |
||||
|
body.append("<bank_flag>").append(bankFlag).append("</bank_flag>"); |
||||
|
body.append("</body>"); |
||||
|
|
||||
|
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; |
return bankDO; |
||||
} |
} |
||||
|
|
||||
@Override |
@Override |
||||
public BankDO queryPaymentResult(BankDO bankDO) { |
public BankDO queryPaymentResult(BankDO bankDO) { |
||||
logger.debug("交通银行 queryPaymentResult"); |
|
||||
return bankDO; |
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("<head><tr_code>").append(trCode).append("</tr_code><corp_no>").append(corpNo).append("</corp_no><user_no>").append(userNo).append("</user_no><req_no>").append(reqNo) |
||||
|
.append("</req_no><tr_acdt>").append(sdfd.format(date)).append("</tr_acdt><tr_time>").append(sdft.format(date)) |
||||
|
.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; |
||||
|
} |
||||
|
|
||||
} |
} |
||||
|
@ -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; |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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(); |
|
||||
} |
|
||||
|
|
||||
} |
|
Loading…
Reference in new issue