这篇文章算是重点核心吧,本次改动点如下:
service: |
1: IAbcErpService: 农行交易接口,只有一个erpRequest方法 |
2: AbstractAbcErp: 农行请求抽象类,实现IAbcErpService,有关请求处理的方法都在这里,核心 |
3: AbcErpService: 农行交易接口实现类,继承AbstractAbcErp,实现IAbcErpService的erpRequest方法,所有农行交易请求都走这个方法 |
1: IAbcErpService: 农行交易接口,只有一个erpRequest方法
入参是农行请求对象都继承的AbstractRequest抽象类,返回值农行ERP接口响应DTO,里面包含请求报文,错误信息,响应报文等等,具体可以看前面的文章。后续所有农行接口请求都走这个方法。
import com.example.demo.dto.request.AbstractRequest;
import com.example.demo.dto.response.AbcErpRespDTO;
public interface IAbcErpService {
AbcErpRespDTO erpRequest(AbstractRequest abstractRequest);
}
2: AbstractAbcErp: 农行请求抽象类,实现IAbcErpService,有关请求处理的方法都在这里 (核心)
这个类方法比较多,几乎接口的请求和响应处理都在这里。
- 先引入AbcConfig,获取农行ICT配置信息(ip,端口等)。
- 主入口方法是:erpSocketClient,传入农行请求对象。
- 调用setRequestBaseInfo方法设置请求基本信息,根据枚举AbcInterfaceType获取接口编码。
- 调用createRequestFile方法生成请求文件,如果有的话。
- 调用requestObjectToXml方法将请求对象转换成xml报文,再调用setRequestMessageBaotou方法生成请求包头。
- 调用SocketClientUtil.request的方法进行socket(农行erp接口)请求。
- 调用bytesToString方法将socket请求返回的字节数组转成应答报文。
- 调用responseMessageToObject方法将应答报文转成应答对象。
- 调用handlerResponseFile方法读取应答文件,并转换成对应接口的应答文件对象,如果有的话。
import com.alibaba.fastjson.JSONObject;
import com.example.demo.config.AbcConfig;
import com.example.demo.constant.AbcInterfaceType;
import com.example.demo.dto.request.AbstractRequest;
import com.example.demo.dto.response.*;
import com.example.demo.utils.SocketClientUtil;
import com.example.demo.utils.XmlUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.xml.bind.JAXBException;
import java.io.*;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Component
public abstract class AbstractAbcErp implements IAbcErpService {
private static final Logger log = LoggerFactory.getLogger(AbstractAbcErp.class);
private AbcConfig abcConfig;
/**
* 农行erp请求
* @param abstractRequest 请求对象
* @return SocketRespDTO
*/
protected AbcErpRespDTO erpSocketClient(AbstractRequest abstractRequest) {
AbcErpRespDTO abcErpResp = new AbcErpRespDTO();
if (Objects.isNull(abstractRequest.getAbcInterfaceType())) {
String errorMsg = new StringBuffer("交易类型错误,").append(abstractRequest.getCctransCode()).toString();
log.error(errorMsg);
abcErpResp.setErrorMsg(errorMsg);
return abcErpResp;
}
try {
// 设置请求基本信息
this.setRequestBaseInfo(abstractRequest);
// 生成请求文件
this.createRequestFile(abstractRequest);
// 请求对象转换成报文,默认不加密
String requestMessage = this.setRequestMessageBaotou(this.requestObjectToXml(abstractRequest), false);
abcErpResp.setRequestMessage(requestMessage);
log.info("农行{}接口请求,请求报文: {}", abstractRequest.getCctransCode(), requestMessage);
// socket请求
SocketRespDTO socketResp = SocketClientUtil.request(this.abcConfig.getHost(), this.abcConfig.getPort(), this.stringToBytes(requestMessage, abcConfig.getMessageCharset()));
abcErpResp.setAlreadyResq(socketResp.isAlreadyResq());
abcErpResp.setErrorMsg(socketResp.getErrorMsg());
byte[] responseBytes = socketResp.getResponse();
if (Objects.nonNull(responseBytes)) {
// socket应答数据转成报文
String responseMessage = this.bytesToString(responseBytes, this.abcConfig.getMessageCharset());
log.info("农行{}接口请求,应答报文: {}", abstractRequest.getCctransCode(), responseMessage);
abcErpResp.setResponseMessage(responseMessage);
// 应答报文转成相应应答对象
AbstractResponse abstractResponse = this.responseMessageToObject(abstractRequest.getRespEntityClass(), responseMessage);
abcErpResp.setAbstractResponse(abstractResponse);
// 处理应答文件
this.handlerResponseFile(abstractRequest, abstractResponse);
}
} catch (Exception e) {
if (StringUtils.isBlank(abcErpResp.getErrorMsg())) {
abcErpResp.setErrorMsg("服务器发生错误");
log.error("服务器发生错误", e);
}
}
return abcErpResp;
}
/**
* 设置请求基本信息
* @param abstractRequest 请求对象
* */
protected void setRequestBaseInfo(AbstractRequest abstractRequest) {
// 交易代码
abstractRequest.setCctransCode(abstractRequest.getAbcInterfaceTypeCode());
abstractRequest.setProductID("ICC");
abstractRequest.setChannelType("ERP");
abstractRequest.setOpNo("");
abstractRequest.setCorpNo("");
abstractRequest.setAuthNo("");
// 请求流水号
if (StringUtils.isBlank(abstractRequest.getReqSeqNo())) {
String uuid = UUID.randomUUID().toString().replaceAll("-","").toUpperCase();
abstractRequest.setReqSeqNo(uuid);
}
LocalDateTime localDateTime = LocalDateTime.now();
abstractRequest.setReqDate(localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
abstractRequest.setReqTime(localDateTime.format(DateTimeFormatter.ofPattern("HHmmss")));
if (abstractRequest.getSign() == null) {
abstractRequest.setSign("");
}
}
/**
* 生成请求文件
* @param abstractRequest 请求对象
* */
protected void createRequestFile(AbstractRequest abstractRequest) throws IllegalAccessException, IOException {
// 请求文件对象集合
List requestFileObjectList = abstractRequest.getRequestFileObjectList();
// 获取请求文件类型
AbcInterfaceType abcInterfaceType = abstractRequest.getAbcInterfaceType();
// 请求文件对象class
Class requestFileClass = abcInterfaceType.getRequestFileClass();
// 文件内容间隔符
String requestFileDelimiter = abcInterfaceType.getRequestFileDelimiter();
if (CollectionUtils.isEmpty(requestFileObjectList) || Objects.isNull(requestFileClass) || StringUtils.isBlank(requestFileDelimiter)) {
return;
}
// 文件存放路径
String fileUploadPath = this.abcConfig.getFileUploadPath();
// 文件名
String fileName = this.getFileName();
File dirFile = new File(fileUploadPath);
// 创建文件路径
if (dirFile.exists() || dirFile.mkdirs()) {
try(
FileOutputStream fos = new FileOutputStream(new StringBuffer(fileUploadPath).append(File.separator).append(fileName).toString());
OutputStreamWriter osw = new OutputStreamWriter(fos, this.abcConfig.getFileCharset());
BufferedWriter bw = new BufferedWriter(osw);
) {
// 取出文件类所有字段名
Field[] fields = requestFileClass.getDeclaredFields();
// 遍历数据集合
StringBuffer content = new StringBuffer();
for (int index = 0; index < requestFileObjectList.size(); index++) {
// 根据字段名,取出对应的值,并记录
for(int y = 0; y < fields.length; y++) {
fields[y].setAccessible(true);
Object fieldValue = fields[y].get(requestFileObjectList.get(index));
if (Objects.nonNull(fieldValue)) {
content.append(fieldValue);
}
content.append(requestFileDelimiter);
}
// 数据写入文件
bw.write(content.toString());
// 写入换行
bw.newLine();
content.setLength(0);
}
abstractRequest.setRequestFileName(fileName);
} catch (IllegalAccessException e) {
log.error("生成请求文件对象失败, 获取字段值出错", e);
throw e;
} catch (IOException e) {
log.error("将文件对象集合数据写入文件失败", e);
throw e;
}
} else {
log.error("生成请求文件失败,无法创建文件路径: {}", fileUploadPath);
}
}
/**
* 生成文件名
* yyyyMMddHHmmssSSS + 五位随机数 + 后缀bal
* */
private String getFileName() {
LocalDateTime localDateTime = LocalDateTime.now();
StringBuffer fileName = new StringBuffer(localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")));
fileName.append((int)(Math.random() * 89999 + 10000));
fileName.append(".bal");
return fileName.toString();
}
/**
* 请求对象转换xml报文
* @param abstractRequest 请求对象
* @return xml报文
*/
protected String requestObjectToXml(AbstractRequest abstractRequest) throws JAXBException {
try {
// 对象转成xml字符串
return XmlUtil.objectToXml(abstractRequest, false, true);
} catch (JAXBException e) {
log.error("请求报文对象转xml报文出错, abstractRequest: {}", JSONObject.toJSONString(abstractRequest));
throw e;
}
}
/**
* 设置请求报文包头
* @param requestMessage 请求报文
* @param isEncryption 是否加密
* @return 新的报文
*/
protected String setRequestMessageBaotou(String requestMessage, boolean isEncryption) throws UnsupportedEncodingException {
String responseMessage = new StringBuffer(isEncryption ? "1" : "0")
.append(String.format("%-6s", this.stringToBytes(requestMessage, abcConfig.getMessageCharset()).length))
.append(requestMessage)
.toString();
return responseMessage;
}
/**
* 字符串转byte[]
* @param value 值
* @param charsetName 字符编码
* @return byte[]
*/
protected byte[] stringToBytes(String value, String charsetName) throws UnsupportedEncodingException {
try {
return value.getBytes(charsetName);
} catch (UnsupportedEncodingException e) {
log.error("字符串转byte[]错误, charsetName: {}, value: {}", charsetName, value);
throw e;
}
}
/**
* byte[]转字符串
* @param bytes 值
* @param charsetName 字符编码
* @return String
*/
protected String bytesToString(byte[] bytes, String charsetName) throws UnsupportedEncodingException {
try {
return new String(bytes, charsetName).replaceAll("\\r\\n|\\r|\\n", "");
} catch (UnsupportedEncodingException e) {
log.error("byte[]转字符串错误, charsetName: {}", charsetName);
throw e;
}
}
/**
* 响应报文转成对象
* @param responseMessage
* @return R
*/
protected <R extends AbstractResponse> R responseMessageToObject(Class<R> respEntityClass, String responseMessage) throws Exception {
// 报文结果xml转成实体对象
try {
// 去掉前面的包头
String newResponseMessage = responseMessage.substring(responseMessage.indexOf("<ap>"), responseMessage.lastIndexOf("</ap>") + 5);
return (R) XmlUtil.convertXmlStrToObject(respEntityClass, newResponseMessage);
} catch (Exception e) {
log.error("应答报文转对象失败, respClass: {}, responseMessage: {}", respEntityClass.toString(), responseMessage);
throw e;
}
}
/**
* 处理应答报文文件
* @param abstractRequest 请求对象
* @param abstractResponse 应答对象
* */
protected void handlerResponseFile(AbstractRequest abstractRequest, AbstractResponse abstractResponse) {
if (Objects.isNull(abstractResponse) || Optional.ofNullable(abstractResponse.getFileFlag()).orElse(0) != 1
|| Objects.isNull(abstractResponse.getCmp()) || StringUtils.isBlank(abstractResponse.getCmp().getBatchFileName())) {
return;
}
AbcInterfaceType abcInterfaceType = abstractRequest.getAbcInterfaceType();
// 应答文件对象class
Class<? extends ResponseBaseFile> responseFileClass = abcInterfaceType.getResponseFileClass(abstractRequest.getTransType());
// 文件间隔符
String responseFileDelimiter = abcInterfaceType.getResponseFileDelimiter();
if (Objects.isNull(responseFileClass) || StringUtils.isBlank(responseFileDelimiter)) {
log.error("获取responseFileClass或responseFileDelimiter为空, transType: {}", abstractRequest.getTransType());
return;
}
// 文件名
String batchFileName = abstractResponse.getCmp().getBatchFileName();
// 取出文件类所有字段名,注意:getDeclaredFields方法拿不到父类的属性, 如果需要拿取父类的属性,需要getDeclaredFields配合getFields使用,但字段会重复,得去重
List<String> fieldList = Stream.of(responseFileClass.getDeclaredFields()).map(f -> f.getName()).collect(Collectors.toList());
if (StringUtils.isNotBlank(batchFileName)) {
// 文件全路径
String fileFullPath = new StringBuffer(this.abcConfig.getFileDownloadPath()).append(File.separator).append(batchFileName).toString();
File file = new File(fileFullPath);
if (file.exists()) {
try(
FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, this.abcConfig.getFileCharset());
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
) {
// 读取文件
String content;
JSONObject jsonObject = new JSONObject();
// 文件对象集合
List<ResponseBaseFile> responseFileList = new ArrayList<>();
while(Objects.nonNull(content = bufferedReader.readLine())) {
if (StringUtils.isNotBlank(content)) {
// 把每一行的值转成数组,后面拼一个空格,避免等会转换成数组的时候,如果后面都是|||,会丢失后面的几个空字符串
List<String> fieldValueList = Arrays.asList(new StringBuffer(content).append(" ").toString().split(responseFileDelimiter));
for (int index = 0; index < fieldList.size(); index++) {
jsonObject.put(StringUtils.uncapitalize(fieldList.get(index)), fieldValueList.get(index));
}
responseFileList.add(jsonObject.toJavaObject(responseFileClass));
jsonObject.clear();
}
}
abstractResponse.setResponseFileObjectList(abstractRequest.getTransType(), responseFileList);
} catch (Exception e) {
log.error("应答报文MFS文本文件解析失败", e);
}
} else {
log.error("应答报文文件不存在, {}", fileFullPath);
}
}
}
@Autowired
public void setAbcConfig(AbcConfig abcConfig) {
this.abcConfig = abcConfig;
}
}
3: AbcErpService: 农行交易接口实现类,继承AbstractAbcErp,实现IAbcErpService的erpRequest方法,所有农行交易请求都走这个方法
import com.example.demo.dto.request.AbstractRequest;
import com.example.demo.dto.response.AbcErpRespDTO;
import org.springframework.stereotype.Service;
@Service
public class AbcErpService extends AbstractAbcErp{
@Override
public AbcErpRespDTO erpRequest(AbstractRequest abstractRequest) {
return this.erpSocketClient(abstractRequest);
}
}
最后创建测试方法,进行接口测试
里面的方法不要直接拿来粘贴用,里面的接口对应的请求对象值,看看有没有需要改的,比如:付款账号,收款账号,省份,币种之类的,省份币种枚举在之前的文章(2-接口对接,汇兑单笔对公|对私)。
import com.example.demo.config.AbcConfig;
import com.example.demo.constant.*;
import com.example.demo.dto.request.*;
import com.example.demo.dto.response.*;
import com.example.demo.service.IAbcErpService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@SpringBootTest
public class AbcErpTest {
private IAbcErpService abcErpService;
private AbcConfig abcConfig;
/**
* 查询单账户余额
*/
@Test
public void cqra06Test() {
CQRA06ReqDTO.Cmp cmp = new CQRA06ReqDTO.Cmp();
cmp.setDbProv(ProvinceCode.Guangdong.code());
cmp.setDbAccNo("你的企业银行卡号");
cmp.setDbCur(Currency.CNY.code());
CQRA06ReqDTO cqra06Req = new CQRA06ReqDTO();
cqra06Req.setCmp(cmp);
AbcErpRespDTO abcErpResp = abcErpService.erpRequest(cqra06Req);
CQRA06RespDTO respEntity = abcErpResp.getResponseEntity(cqra06Req.getRespEntityClass());
}
/**
* 查询账户明细(新全量)
*/
@Test
public void cqrc09Test() {
CQRC09ReqDTO cqrc09Req = new CQRC09ReqDTO();
CQRC09ReqDTO.Cmp cmp = new CQRC09ReqDTO.Cmp();
cmp.setDbProv(ProvinceCode.Guangdong.code());
cmp.setDbAccNo("你的企业银行卡号");
cmp.setDbCur(Currency.CNY.code());
cmp.setStartTime(String.valueOf(new Date().getTime()));
cqrc09Req.setCmp(cmp);
CQRC09ReqDTO.Corp corp = new CQRC09ReqDTO.Corp();
// 查询开始日期:yyyyMMdd
corp.setStartDate("20200901");
// 查询结束日期:yyyyMMdd
corp.setEndDate("20230926");
cqrc09Req.setCorp(corp);
AbcErpRespDTO abcErpResp = abcErpService.erpRequest(cqrc09Req);
CQRC09RespDTO responseEntity = abcErpResp.getResponseEntity(cqrc09Req.getRespEntityClass());
}
/**
* 汇兑-单笔对公|对私
*/
@Test
public void cfrt02Test() {
CFRT02ReqDTO cfrt02Request = new CFRT02ReqDTO();
cfrt02Request.setAmt(new BigDecimal("3.28"));
CFRT02ReqDTO.Corp corp = new CFRT02ReqDTO.Corp();
// corp.setBookingDate(DateFormatUtil.format("yyyyMMdd", new Date()));
// Calendar calendar = Calendar.getInstance();
// calendar.add(Calendar.HOUR, 1);
// corp.setBookingTime(DateFormatUtil.format("HHmmss", calendar.getTime()));
// corp.setBookingFlag("0");
corp.setPostscript("测试CFRT02单笔汇兑");
corp.setOthBankFlag("0");
corp.setCrAccName("收款方户名");
corp.setCrBankNo("收款方卡号");
corp.setCrBankName("收款方银行名称还是支行名称来着,忘记了,具体看接口请求报文文档");
corp.setDbAccName("付款方户名");
corp.setWhyUse("用途:测试CFRT02单笔汇兑");
cfrt02Request.setCorp(corp);
CFRT02ReqDTO.Cmp cmp = new CFRT02ReqDTO.Cmp();
cmp.setDbAccNo("付款方账号");
cmp.setDbProv(ProvinceCode.Guangdong.code());
cmp.setDbCur(Currency.CNY.code());
cmp.setCrProv("收款方省区代码");
cmp.setCrAccNo("收款方账号");
cmp.setCrCur(Currency.CNY.code());
cmp.setConFlag("1");
cfrt02Request.setCmp(cmp);
AbcErpRespDTO abcErpResp = abcErpService.erpRequest(cfrt02Request);
CFRT02RespDTO responseEntity = abcErpResp.getResponseEntity(cfrt02Request.getRespEntityClass());
System.out.println(cfrt02Request.getReqSeqNo());
}
/**
* 查询金融交易处理状态
*/
@Test
public void cqrt71Test() {
CQRT71ReqDTO cqrt71Request = new CQRT71ReqDTO();
CQRT71ReqDTO.Cme cme = new CQRT71ReqDTO.Cme();
cme.setSerialNo("cfrt02接口请求的reqSeqNo参数");
cqrt71Request.setCme(cme);
AbcErpRespDTO abcErpResp = abcErpService.erpRequest(cqrt71Request);
CQRT71RespDTO responseEntity = abcErpResp.getResponseEntity(cqrt71Request.getRespEntityClass());
}
/**
* 本行汇总批量代发(实时)
*/
@Test
public void ibafo4Test() {
List<IBAF04ReqDTO.FileObject> list = new ArrayList<>();
for(int i=0; i < 1; i++) {
IBAF04ReqDTO.FileObject fileObject = new IBAF04ReqDTO.FileObject();
fileObject.setCustomerCode("cust" + i);
fileObject.setCrAccName("收款方户名");
fileObject.setCrBankNo("收款方账号");
fileObject.setCur(Currency.CNY.code());
fileObject.setAccountBookCode("accountBookCode" + i);
fileObject.setAmt(new BigDecimal(i));
fileObject.setExcerpt("excerpt" + i);
fileObject.setContractFlag("02");
fileObject.setAccountFlag("0");
fileObject.setPhoneFlag("0");
fileObject.setPhone("phone" + i);
fileObject.setIdCardType(IdCardType.Type_110001.code());
fileObject.setIdCardCode("idCardCode" + i);
list.add(fileObject);
}
IBAF04ReqDTO ibaf04Request = new IBAF04ReqDTO();
ibaf04Request.setFileObjectList(list);
// 总金额
BigDecimal sumAmt = list.stream().map(e -> e.getAmt()).reduce(BigDecimal.ZERO, BigDecimal::add);
ibaf04Request.setAmt(sumAmt);
IBAF04ReqDTO.Cmp cmp = new IBAF04ReqDTO.Cmp();
cmp.setDbProv(ProvinceCode.Guangdong.code());
cmp.setDbCur(Currency.CNY.code());
cmp.setDbAccNo("付款方账号");
cmp.setSumNum(list.size());
ibaf04Request.setCmp(cmp);
IBAF04ReqDTO.Corp corp = new IBAF04ReqDTO.Corp();
corp.setDbAccName("付款方户名");
corp.setDbLogAccNo("");
// 94合约号
corp.setNfAccNo(this.abcConfig.getNvContractNo());
// 94合约类型
corp.setNvOucherType(this.abcConfig.getNvOucherType());
ibaf04Request.setCorp(corp);
AbcErpRespDTO abcErpResp = abcErpService.erpRequest(ibaf04Request);
IBAF04RespDTO responseEntity = abcErpResp.getResponseEntity(ibaf04Request.getRespEntityClass());
System.out.println(ibaf04Request.getReqSeqNo());
}
/**
* 他行汇总批量代发
*/
@Test
public void ibbf23Test() {
List<IBBF23ReqDTO.FileObject> list = new ArrayList<>();
for(int i=0; i < 1; i++) {
IBBF23ReqDTO.FileObject fileObject = new IBBF23ReqDTO.FileObject();
fileObject.setCustomerCode("cust" + i);
fileObject.setCrAccName("收款方户名");
fileObject.setCrBankNo("收款方账号");
fileObject.setCur(Currency.CNY.code());
fileObject.setAmt(new BigDecimal(i));
fileObject.setExcerpt("excerpt" + i);
fileObject.setUrgentSign("0");
fileObject.setCrBankBranchName("crBankBranchName" + i);
fileObject.setCrBankBranchNo("crBankBranchNo" + i);
list.add(fileObject);
}
IBBF23ReqDTO ibbf23Request = new IBBF23ReqDTO();
ibbf23Request.setFileObjectList(list);
// 总金额
BigDecimal amtSum = list.stream().map(e -> e.getAmt()).reduce(BigDecimal.ZERO, BigDecimal::add);
ibbf23Request.setAmt(amtSum);
IBBF23ReqDTO.Cmp cmp = new IBBF23ReqDTO.Cmp();
cmp.setDbProv(ProvinceCode.Guangdong.code());
cmp.setDbCur(Currency.CNY.code());
cmp.setDbAccNo("付款方账号");
cmp.setSumNum(list.size());
cmp.setDbLogAccNo("账簿号,似乎不用填");
ibbf23Request.setCmp(cmp);
IBBF23ReqDTO.Corp corp = new IBBF23ReqDTO.Corp();
corp.setDbAccName("付款方户名");
corp.setPostscript("附言。。。。。");
// 94合约号
corp.setNfAccNo(this.abcConfig.getNvContractNo());
// 94合约类型
corp.setNvOucherType(this.abcConfig.getNvOucherType());
ibbf23Request.setCorp(corp);
AbcErpRespDTO abcErpResp = abcErpService.erpRequest(ibbf23Request);
IBBF23RespDTO responseEntity = abcErpResp.getResponseEntity(ibbf23Request.getRespEntityClass());
System.out.println(ibbf23Request.getReqSeqNo());
}
/**
* 批平台处理结果查询
*/
@Test
public void ibaqo6Test() {
IBAQ06ReqDTO ibaq06Request = new IBAQ06ReqDTO();
IBAQ06ReqDTO.Corp corp = new IBAQ06ReqDTO.Corp();
corp.setCustomNo("IBAF04接口或IBBF23接口的reqSeqNo");
ibaq06Request.setCorp(corp);
AbcErpRespDTO abcErpResp = abcErpService.erpRequest(ibaq06Request);
IBAQ06RespDTO responseEntity = abcErpResp.getResponseEntity(ibaq06Request.getRespEntityClass());
}
@Autowired
public void setAbcErpService(IAbcErpService abcErpService) {
this.abcErpService = abcErpService;
}
@Autowired
public void setAbcConfig(AbcConfig abcConfig) {
this.abcConfig = abcConfig;
}
}
如果你的项目启动时间很久,我劝你建个demo,搞好了再移植到你的项目去,不然测试老是得启动服务。
好了!这次的农行接口代码改造完成了,码字真累,最好从【代码改造-1】这篇文章开始看起吧,前提是你看过我之前写的老版的接口对接文章。
终于写完了
码字不易,于你有利,勿忘点赞