6 changed files with 164 additions and 98 deletions
@ -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>"); |
|||
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; |
|||
} |
|||
|
|||
@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("<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