java农业银行-企业银行ERP接口开发(后续)(代码改造-4)

这篇文章算是重点核心吧,本次改动点如下: 

        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,传入农行请求对象。
  1. 调用setRequestBaseInfo方法设置请求基本信息,根据枚举AbcInterfaceType获取接口编码。
  2. 调用createRequestFile方法生成请求文件,如果有的话。
  3. 调用requestObjectToXml方法将请求对象转换成xml报文,再调用setRequestMessageBaotou方法生成请求包头。
  4. 调用SocketClientUtil.request的方法进行socket(农行erp接口)请求。
  5. 调用bytesToString方法将socket请求返回的字节数组转成应答报文。
  6. 调用responseMessageToObject方法将应答报文转成应答对象。
  7. 调用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】这篇文章开始看起吧,前提是你看过我之前写的老版的接口对接文章。


终于写完了

 


码字不易,于你有利,勿忘点赞

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
农业银行 ERP 接口开发是指开发适用于农业银行企业资源规划(ERP)系统的接口ERP 系统可以帮助银行实现信息的集成、业务流程的优化和效率的提升。接口开发主要是为了与其他系统进行数据的互通和交换。 在农业银行 ERP 接口开发过程中,首先需要进行需求分析和系统设计。根据银行的具体需求,确定需要开发接口功能、数据格式、传输方式等。接下来,开发人员根据设计方案进行编码和测试,确保接口的正确性和稳定性。 银行 ERP 接口开发的关键是与现有系统的对接。农业银行可能拥有多个系统,如核心银行系统、账户管理系统、风险管理系统等。在开发过程中,需要与这些系统进行数据的交换和同步。因此,开发人员需要熟悉银行系统的架构和接口规范,并与相关系统的开发人员进行紧密合作。 另外,农业银行 ERP 接口开发还需要考虑数据的安全性和稳定性。银行作为金融机构,对数据的保密和可靠性要求非常高。因此,在接口开发过程中,需要采取合适的安全措施,如身份验证、数据加密和防止数据篡改等。同时,开发人员还需要测试接口在各种情况下的稳定性和扩展性,以确保接口能够在高负载和异常情况下正常工作。 综上所述,农业银行 ERP 接口开发是一个复杂而重要的任务。它需要开发人员具备深入的银行业务和系统知识,同时还要有丰富的编码和测试经验。只有通过合理的需求分析、系统设计和与相关系统的对接,才能开发出满足农业银行需求的稳定、安全的接口

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值