在 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 = \"未签约\";
}