在 https://blog.csdn.net/weixin_41564440/article/details/85100825 中发起了签约请求,农行会进行处理;

查询签约结果时处理较为简单:

1.组装请求报文:建立实体类转为 格式的字符串;

2.根据报文长度生成需要的包头;

3.通过socket短连接将报文发送到农行ICT;

4.获取到农行响应的 字符串,截取,转为实体类,得到想要的请求结果;

 

查询签约结果时只需要两个请求参数:银行卡号,对公标志(1-个人,2-对公);

1.生成请求报文时需要使用到的实体类(三个请求实体类,三个响应实体类):

import javax. .bind.annotation. Element;
import javax. .bind.annotation. RootElement;

/**
 * 查询签约结果报文 请求字段 
 */

@ RootElement(name = \"ap\")
public class RequestSignedResultFieldDto {
    //交易代码    查询签约结果:CQRB80
    private String                          cCTransCode;

    //企业技监局代码 /客户号
    private String                          corpNo;

    //请求渠道流水号
    private String                          reqSeqNo;

    //企业操作员编号 ICT会根据 UsbKey 里的信息自动补充内容
    private String                          opNo;

    //认证码 ICT会根据 UsbKey 里的信息自动补充内容
    private String                          authNo;

    //渠道标识 固定为 ERP 0:ERP 1:ICC 可为空
    private String                          channelType;

    //产品标识 固定为 ICC
    private String                          productID;

    //请求日期 可为空
    private String                          reqDate;

    //请求时间 可为空
    private String                          reqTime;

    //数字签名 ICT会根据 UsbKey 里的信息自动补充内容
    private String                          sign;

    private RequestSignedResultFieldCmpDto  cmp;

    private RequestSignedResultFieldCorpDto corp;

    //业务类型
    private String                          qryFlag;
    @ Element(name = \"qryflag\")
    public String getQryFlag() {
        return qryFlag;
    }
    public void setQryFlag(String qryFlag) {
        this.qryFlag = qryFlag;
    }
    @ Element(name = \"CCTransCode\")
    public String getCCTransCode() {
        return cCTransCode;
    }
    public void setCCTransCode(String cCTransCode) {
        this.cCTransCode = cCTransCode;
    }
    @ Element(name = \"CorpNo\")
    public String getCorpNo() {
        return corpNo;
    }
    public void setCorpNo(String corpNo) {
        this.corpNo = corpNo;
    }
    @ Element(name = \"ReqSeqNo\")
    public String getReqSeqNo() {
        return reqSeqNo;
    }
    public void setReqSeqNo(String reqSeqNo) {
        this.reqSeqNo = reqSeqNo;
    }
    @ Element(name = \"OpNo\")
    public String getOpNo() {
        return opNo;
    }
    public void setOpNo(String opNo) {
        this.opNo = opNo;
    }
    @ Element(name = \"AuthNo\")
    public String getAuthNo() {
        return authNo;
    }
    public void setAuthNo(String authNo) {
        this.authNo = authNo;
    }
    @ Element(name = \"ChannelType\")
    public String getChannelType() {
        return channelType;
    }
    public void setChannelType(String channelType) {
        this.channelType = channelType;
    }
    @ Element(name = \"ProductID\")
    public String getProductID() {
        return productID;
    }
    public void setProductID(String productID) {
        this.productID = productID;
    }
    @ Element(name = \"ReqDate\")
    public String getReqDate() {
        return reqDate;
    }


    public void setReqDate(String reqDate) {
        this.reqDate = reqDate;
    }
    @ Element(name = \"ReqTime\")
    public String getReqTime() {
        return reqTime;
    }
    public void setReqTime(String reqTime) {
        this.reqTime = reqTime;
    }
    @ Element(name = \"Sign\")
    public String getSign() {
        return sign;
    }
    public void setSign(String sign) {
        this.sign = sign;
    }
    @ Element(name = \"Cmp\")
    public RequestSignedResultFieldCmpDto getCmp() {
        return cmp;
    }
    public void setCmp(RequestSignedResultFieldCmpDto cmp) {
        this.cmp = cmp;
    }
    @ Element(name = \"Corp\")
    public RequestSignedResultFieldCorpDto getCorp() {
        return corp;
    }
    public void setCorp(RequestSignedResultFieldCorpDto corp) {
        this.corp = corp;
    }

}

import javax. .bind.annotation. Element;
import javax. .bind.annotation. RootElement;

/**
 * 查询签约结果 响应报文 字段
 */
@ RootElement(name = \"ap\")
public class ResponseSingedResultFieldDto {
    // 内部交易代码
    private String                          cCTransCode;

    // 请求方流水号
    private String                          reqSeqNo;

    // 返回来源
    private String                          respSource;

    // 应答流水号
    private String                          respSeqNo;

    // 返回日期
    private String                          respDate;

    // 返回日期
    private String                          respTime;

    // 返回码
    private String                          respCode;

    // 返回信息
    private String                          respInfo;

    // 返回扩展信息
    private String                          rxtInfo;

    // 数据文件标识
    private String                          fileFlag;

    private ResponseSingedResultFieldCmeDto cme;

    private ResponseSingedResultFieldCmpDto cmp;
    @ Element(name = \"CCTransCode\")
    public String getCCTransCode() {
        return cCTransCode;
    }
    public void setCCTransCode(String cCTransCode) {
        this.cCTransCode = cCTransCode;
    }
    @ Element(name = \"ReqSeqNo\")
    public String getReqSeqNo() {
        return reqSeqNo;
    }
    public void setReqSeqNo(String reqSeqNo) {
        this.reqSeqNo = reqSeqNo;
    }
    @ Element(name = \"RespSource\")
    public String getRespSource() {
        return respSource;
    }
    public void setRespSource(String respSource) {
        this.respSource = respSource;
    }
    @ Element(name = \"RespSeqNo\")
    public String getRespSeqNo() {
        return respSeqNo;
    }
    public void setRespSeqNo(String respSeqNo) {
        this.respSeqNo = respSeqNo;
    }
    @ Element(name = \"RespDate\")
    public String getRespDate() {
        return respDate;
    }
    public void setRespDate(String respDate) {
        this.respDate = respDate;
    }
    @ Element(name = \"RespTime\")
    public String getRespTime() {
        return respTime;
    }
    public void setRespTime(String respTime) {
        this.respTime = respTime;
    }
    @ Element(name = \"RespCode\")
    public String getRespCode() {
        return respCode;
    }
    public void setRespCode(String respCode) {
        this.respCode = respCode;
    }
    @ Element(name = \"RespInfo\")
    public String getRespInfo() {
        return respInfo;
    }
    public void setRespInfo(String respInfo) {
        this.respInfo = respInfo;
    }
    @ Element(name = \"RxtInfo\")
    public String getRxtInfo() {
        return rxtInfo;
    }
    public void setRxtInfo(String rxtInfo) {
        this.rxtInfo = rxtInfo;
    }
    @ Element(name = \"FileFlag\")
    public String getFileFlag() {
        return fileFlag;
    }
    public void setFileFlag(String fileFlag) {
        this.fileFlag = fileFlag;
    }
    @ Element(name = \"Cme\")
    public ResponseSingedResultFieldCmeDto getCme() {
        return cme;
    }
    public void setCme(ResponseSingedResultFieldCmeDto cme) {
        this.cme = cme;
    }
    @ Element(name = \"Cmp\")
    public ResponseSingedResultFieldCmpDto getCmp() {
        return cmp;
    }
    public void setCmp(ResponseSingedResultFieldCmpDto cmp) {
        this.cmp = cmp;
    }

}
 

import javax. .bind.annotation. Element;
import javax. .bind.annotation. RootElement;

/**
 * 查询签约结果报文 请求字段 
 */

@ RootElement(name = \"Corp\")
public class RequestSignedResultFieldCorpDto {
    //合约号(94账号)
    private String nFAccNo;

    //业务类型
    private String nVoucherType;
    @ Element(name = \"NFAccNo\")
    public String getNFAccNo() {
        return nFAccNo;
    }
    public void setNFAccNo(String nFAccNo) {
        this.nFAccNo = nFAccNo;
    }
    @ Element(name = \"NVoucherType\")
    public String getNVoucherType() {
        return nVoucherType;
    }
    public void setNVoucherType(String nVoucherType) {
        this.nVoucherType = nVoucherType;
    }
}

import javax. .bind.annotation. Element;
import javax. .bind.annotation. RootElement;

/**
 * 查询签约结果 响应报文 字段
 */
@ RootElement(name = \"Cmp\")
public class ResponseSingedResultFieldCmpDto {

    // 私有数据区
    private String respPrvData;

    // 批量文件名
    private String batchFileName;

    //签约标志(1-已签约、2未签约)
    private String conFlag;
    @ Element(name = \"RespPrvData\")
    public String getRespPrvData() {
        return respPrvData;
    }
    public void setRespPrvData(String respPrvData) {
        this.respPrvData = respPrvData;
    }
    @ Element(name = \"BatchFileName\")
    public String getBatchFileName() {
        return batchFileName;
    }
    public void setBatchFileName(String batchFileName) {
        this.batchFileName = batchFileName;
    }
    @ Element(name = \"ConFlag\")
    public String getConFlag() {
        return conFlag;
    }
    public void setConFlag(String conFlag) {
        this.conFlag = conFlag;
    }

}
 

import javax. .bind.annotation. Element;
import javax. .bind.annotation. RootElement;

/**
 * 查询签约结果报文 请求字段 
 */

@ RootElement(name = \"Cmp\")
public class RequestSignedResultFieldCmpDto {
    //账簿号
    private String dbLogAccNo;

    //目标方账号
    private String crAccNo;

    //目标方省市代码
    private String crProv;

    //目标方币种 (01:人民币)
    private String crCur;

    //委托方账号
    private String dbAccNo;

    //委托方省市代码
    private String dbProv;

    //委托方币种
    private String dbCur;
    @ Element(name = \"DbLogAccNo\")
    public String getDbLogAccNo() {
        return dbLogAccNo;
    }
    public void setDbLogAccNo(String dbLogAccNo) {
        this.dbLogAccNo = dbLogAccNo;
    }
    @ Element(name = \"CrAccNo\")
    public String getCrAccNo() {
        return crAccNo;
    }
    public void setCrAccNo(String crAccNo) {
        this.crAccNo = crAccNo;
    }
    @ Element(name = \"CrProv\")
    public String getCrProv() {
        return crProv;
    }
    public void setCrProv(String crProv) {
        this.crProv = crProv;
    }
    @ Element(name = \"CrCur\")
    public String getCrCur() {
        return crCur;
    }
    public void setCrCur(String crCur) {
        this.crCur = crCur;
    }
    @ Element(name = \"DbAccNo\")
    public String getDbAccNo() {
        return dbAccNo;
    }
    public void setDbAccNo(String dbAccNo) {
        this.dbAccNo = dbAccNo;
    }
    @ Element(name = \"DbProv\")
    public String getDbProv() {
        return dbProv;
    }
    public void setDbProv(String dbProv) {
        this.dbProv = dbProv;
    }
    @ Element(name = \"DbCur\")
    public String getDbCur() {
        return dbCur;
    }
    public void setDbCur(String dbCur) {
        this.dbCur = dbCur;
    }

}

 

import javax. .bind.annotation. Element;
import javax. .bind.annotation. RootElement;

/**
 * 查询签约结果 响应报文 字段 
 */
@ RootElement(name = \"Cme\")
public class ResponseSingedResultFieldCmeDto {

    // 记录数
    private String recordNum;

    // 字段数
    private String fieldNum;
    @ Element(name = \"RecordNum\")
    public String getRecordNum() {
        return recordNum;
    }
    public void setRecordNum(String recordNum) {
        this.recordNum = recordNum;
    }
    @ Element(name = \"FieldNum\")
    public String getFieldNum() {
        return fieldNum;
    }
    public void setFieldNum(String fieldNum) {
        this.fieldNum = fieldNum;
    }

}
 

生成请求报文实体类的代码:

/**
     * 构建解约dto
     *
     * @param crAccNo 银行卡账号
     * @param qryFlag 个人对公标志 1-个人 2-对公
     * @param dbAccNo 委托方账号
     * @param dbProv 委托方省市代码
     * @param nfAccNo 94合约账号
     * @param nvoucherType 合约类型
     * @return RequestSelectSignedResultFieldDto 查询是否签约请求报文
     */
    public static RequestSignedResultFieldDto createRequestSelectSignedResultFieldDto(String crAccNo, String qryFlag,
                                                                                      String dbAccNo, String dbProv,
                                                                                      String nfAccNo,
                                                                                      String nvoucherType) {
        RequestSignedResultFieldDto requestSignedFieldDto = new RequestSignedResultFieldDto();
        RequestSignedResultFieldCmpDto cmp = new RequestSignedResultFieldCmpDto();
        RequestSignedResultFieldCorpDto corp = new RequestSignedResultFieldCorpDto();
        cmp.setCrCur(BankConstant.CRCUR_RMB);
        cmp.setDbCur(BankConstant.DBCUR_RMB);
        cmp.setCrAccNo(crAccNo);
        cmp.setDbLogAccNo(\"\");
        cmp.setDbAccNo(dbAccNo);
        cmp.setDbProv(dbProv);
        requestSignedFieldDto.setCmp(cmp);
        corp.setNFAccNo(nfAccNo);
        corp.setNVoucherType(nvoucherType);
        requestSignedFieldDto.setCorp(corp);
        String transCode = BankConstant.SELECT_SINGED_RESULT_CCTRANSCODE;
        requestSignedFieldDto.setCCTransCode(transCode);
        requestSignedFieldDto.setQryFlag(qryFlag);
        requestSignedFieldDto.setReqDate(BankUtils.getCurrentDate());
        requestSignedFieldDto.setReqTime(BankUtils.getCurrentTime());
        requestSignedFieldDto.setProductID(BankConstant.PRODUCT_ID);
        requestSignedFieldDto.setChannelType(BankConstant.CHANNEL_TYPE);
        String reqSeqNo = String.format(BankConstant.FILE_FORMAT_3, transCode, BankConstant.FILE_NAME_INTERVAL,
                BankUtils.getCurrentDateTime());
        requestSignedFieldDto.setReqSeqNo(reqSeqNo);
        return requestSignedFieldDto;
    }

然后转为 格式的字符串:String message = JXABUtils.convertObjTo Str(requestDto, true);

2.生成包头的方法与签约请求时一致:  

String message = String.format(BankConstant.MESSAGE_HEAD_FMT, \"0\", StringUtils.rightPad(
                    String.valueOf(message.getBytes(BankConstant.GBK).length), 6, \" \"));

3.发起请求的方法与签约请求时一致:  

String messageReceive = SocketClient.request(abcConfig.getTransIp(), Integer.parseInt(abcConfig.getTransPort()),
                socketHead + message);

4.得到响应:

messageReceive = messageReceive.substring(messageReceive.indexOf(\"<\"));

ResponseSingedResultFieldDto response = (ResponseSingedResultFieldDto) JXABUtils
                .convertStrToObj(ResponseSingedResultFieldDto.class, messageReceive);

response.getRespSource()为0则请求成功,然后:

String conFlag = \"\";
if (\"1\".equals(response.getCmp().getConFlag())) {
        conFlag = \"已签约\";
} else {
        conFlag = \"未签约\";
}

收藏 打印