Skip to content

四、子域配置

FTK edited this page Jun 4, 2024 · 2 revisions

子域类型分为FIXEDUVUVASTLVTLV2TVULVULV2PAGE嵌套子域;其中TLVTLV2TV较为特殊,可以和其他子域类型组合使用。

  • FIXED 固定格式子域,例如银联F53、F54、F60、F90,JCB F28、F43等
  • UV usage-value子域,例如银联F59、F62,cup F47、F48、F62等
  • UVAS 多个UV通过usage=AS方式组合子域,例如银联F48、F57等
  • TLV tag-length-value子域,例如银联F55
  • TLV2 TLV变种,目前只与UV子域组合使用,例如cupF62
  • TV tag-value子域,目前只与UV子域组合使用,例如银联F62
  • ULV usage-length-value子域,例如银联F56、F63、F104、F113等
  • ULV2 ULV变种,例如JCB F48、F60
  • PAGE 分页子域,例如固定格式3886交易
  • 嵌套子域 以上类型子域的嵌套关系,例如银联F59 usage=QR、F60.11、F61.10等

子域分类:

  • 单独方式 每种子域类型独立存在,例如:FIXEDUVUVASTLVULVPAGE
  • 嵌套方式 子域下配置子域,即嵌套子域,例如:FIXED-UVFIXED-PAGEUV-FIXEDFIXED-FIXEDFIXED-PAGE
  • 组合方式 特殊的单独方式,两种子域类型组合成一种,例如:ULV-TLVUV-TVUV-TLV2

子域配置需额外增加两项参数:existSubdomain: truesubdomainType: [子域类型]

1.FIXED类型

FIXED类型子域,子域无特殊格式处理,以银联53域为例:

1.1.YAML配置

父域配置为:

payload:
  - { "domainNo": 53, "name": "secRelatdCtrlInfo", "fixed": true, "length": 16, "remark": "安全控制信息", "existSubdomain": true, "subdomainType": "FIXED" }

子域配置为F[子域号],后接子域字段:

F53:
  - { "domainNo": 1, "name": "keyType", "fixed": true, "length": 1, "remark": "重置密钥的类型/PIN格式", "clazz": "java.lang.String" }
  - { "domainNo": 2, "name": "encryptionMethodUsed", "fixed": true, "length": 1, "remark": "加密算法标志", "clazz": "java.lang.String" }
  - { "domainNo": 3, "name": "reserved", "fixed": true, "length": 14, "remark": "保留使用", "clazz": "java.lang.String" }

1.2.XML配置

父域配置为:

<payload>
    <field domainNo="53" name="secRelatdCtrlInfo" fixed="true" length="16" remark="安全控制信息" existSubdomain="true" subdomainType="FIXED"/>
</payload>

子域配置:

<subPayload domain="F53">
    <field domainNo="1" name="keyType" fixed="true" length="1" remark="重置密钥的类型/PIN格式" clazz="java.lang.String"/>
    <field domainNo="2" name="encryptionMethodUsed" fixed="true" length="1" remark="加密算法标志" clazz="java.lang.String"/>
    <field domainNo="3" name="reserved" fixed="true" length="14" remark="保留使用" clazz="java.lang.String"/>
</subPayload>

1.3.注解配置

通过引用子域类来映射父子域关系,父域配置为:

    @IsoFieldMeta(domainNo = 53, fixed = true, length = 16, remark = "安全控制信息", existSubdomain = true, subdomainType = FIXED)
    private Field53 secRelatdCtrlInfo;

子域配置:

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F53", remark = "银联8583 53域")
public class Field53 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 1, remark = "重置密钥的类型/PIN格式")
    private String keyType;
    @IsoFieldMeta(domainNo = 2, fixed = true, length = 1, remark = "加密算法标志")
    private String encryptionMethodUsed;
    @IsoFieldMeta(domainNo = 3, fixed = true, length = 14, remark = "保留使用")
    private String reserved;

    // getter setter
}

1.4.数据库配置

ALK_MESSAGE_DEFINITION表配置:

M_ID M_TYPE M_GROUP M_CODE M_KIND M_DOMAIN M_USAGE M_DOMAIN_TYPE M_HOLDER M_CHARSET M_REMARK
20 iso cups common subPayload F53 NONE GB18030 银联8583报文F53

ALK_FIELD_DEFINITION表配置:

M_ID F_ID F_DOMAIN_NO F_NAME F_ALIAS_NAME F_FIXED F_LENGTH F_MAX_LENGTH F_CLAZZ F_PATTERN F_REMARK F_STATUS F_PAGE_SIZE_NAME F_PARSE_TYPE F_EXIST_SUBDOMAIN F_SUBDOMAIN_TYPE F_NON_SUBDOMAIN_EXCEPTION
20 336 1 keyType 1 1 1 java.lang.String 重置密钥的类型/PIN格式 OPEN ASCII 0
20 337 2 encryptionMethodUsed 1 1 1 java.lang.String 加密算法标志 OPEN ASCII 0
20 338 3 reserved 1 14 14 java.lang.String 保留使用 OPEN ASCII 0

2.UV类型

UV(usage-value)类型子域,以银联59域为例:

2.1.YAML配置

父域配置为:

payload:
  - { "domainNo": 59, "name": "detailInqrng", "fixed": false, "length": 3,  "maxLength": 600, "remark": "明细查询数据", "existSubdomain": true, "subdomainType": "UV" }

子域配置为F[子域号]$[usage],后接子域字段;usage=QL/QD子域配置为:

F59$QL:
  - { "domainNo": 1, "name": "number", "fixed": true, "length": 3, "remark": "当前明细顺序号", "clazz": "java.lang.Integer" }
F59$QD:
  - { "domainNo": 1, "name": "number", "fixed": true, "length": 3, "remark": "当前明细顺序号", "clazz": "java.lang.Integer" }
  - { "domainNo": 2, "name": "beginDate", "fixed": true, "length": 8, "remark": "明细起始日期", "clazz": "java.time.LocalDate", "pattern": "yyyyMMdd" }
  - { "domainNo": 3, "name": "endDate", "fixed": true, "length": 8, "remark": "明细中止日期", "clazz": "java.time.LocalDate", "pattern": "yyyyMMdd" }

2.2.XML配置

父域配置为:

<payload>
    <field domainNo="59" name="detailInqrng" fixed="false" length="3" maxLength="600" remark="明细查询数据" existSubdomain="true" subdomainType="UV"/>
</payload>

子域配置:

<subPayload domain="F59" usage="QL">
    <field domainNo="1" name="number" fixed="true" length="3" remark="当前明细顺序号" clazz="java.lang.Integer"/>
</subPayload>
<subPayload domain="F59" usage="QD">
    <field domainNo="1" name="number" fixed="true" length="3" remark="当前明细顺序号" clazz="java.lang.Integer"/>
    <field domainNo="2" name="beginDate" fixed="true" length="8" remark="明细起始日期" clazz="java.time.LocalDate" pattern="yyyyMMdd"/>
    <field domainNo="3" name="endDate" fixed="true" length="8" remark="明细中止日期" clazz="java.time.LocalDate" pattern="yyyyMMdd"/>
</subPayload>

2.3.注解配置

UV类型父域通过com.alatka.messages.holder.UsageSubdomain引用子域接口,父域配置为:

    @IsoFieldMeta(domainNo = 59, fixed = false, length = 3, maxLength = 600, remark = "明细查询数据", existSubdomain = true, subdomainType = UV)
    private UsageSubdomain<Field59> detailInqrng;

子域配置:

public interface Field59 {
}

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F59", usage = "QL", remark = "银联8583 59域usage=QL")
public class Field59$QL implements Field59 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 3, remark = "当前明细顺序号")
    private Integer number;

    // getter setter
}

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F59", usage = "QD", remark = "银联8583 59域usage=QD")
public class Field59$QD implements Field59 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 3, remark = "当前明细顺序号")
    private Integer number;
    @IsoFieldMeta(domainNo = 2, fixed = true, length = 8, remark = "明细起始日期", pattern = "yyyyMMdd")
    private LocalDate beginDate;
    @IsoFieldMeta(domainNo = 3, fixed = true, length = 8, remark = "明细中止日期", pattern = "yyyyMMdd")
    private LocalDate endDate;

    // getter setter
}

3.UVAS类型

UVAS类型子域,为多个UV以usage=AS方式组合,配置方式与UV类型相同;UVAS类型会判断域中是否存在usage=AS及自动解析处理;以银联57域为例:

3.1.YAML配置

父域配置为:

payload:
  - { "domainNo": 57, "name": "addtnlData57", "fixed": false, "length": 3, "maxLength": 100, "remark": "附加交易信息", "existSubdomain": true, "subdomainType": "UVAS" }

子域配置为F[子域号]$[usage],后接子域字段;usage=AR/AB子域:

F57$AR:
  - { "domainNo": 1, "name": "f57f1", "fixed": true, "length": 3, "remark": "附加应答信息", "clazz": "java.lang.String" }
F57$AB:
  - { "domainNo": 1, "name": "addInfo", "fixed": true, "length": 20, "remark": "发卡方附加交易信息", "clazz": "java.lang.String" }
  - { "domainNo": 2, "name": "cupsAddInfo", "fixed": true, "length": 20, "remark": "CUPS附加交易信息", "clazz": "java.lang.String" }
  - { "domainNo": 3, "name": "reserved", "fixed": true, "length": 56, "remark": "保留使用", "clazz": "java.lang.String" }

3.2.XML配置

父域配置为:

<payload>
    <field domainNo="57" name="addtnlData57" fixed="false" length="3" maxLength="100" remark="附加交易信息" existSubdomain="true" subdomainType="UVAS"/>
</payload>

子域配置:

<subPayload domain="F57" usage="AR">
    <field domainNo="1" name="f57f1" fixed="true" length="3" remark="附加应答信息" clazz="java.lang.String"/>
</subPayload>
<subPayload domain="F57" usage="AB">
    <field domainNo="1" name="addInfo" fixed="true" length="20" remark="发卡方附加交易信息" clazz="java.lang.String"/>
    <field domainNo="2" name="cupsAddInfo" fixed="true" length="20" remark="CUPS附加交易信息" clazz="java.lang.String"/>
    <field domainNo="3" name="reserved" fixed="true" length="56" remark="保留使用" clazz="java.lang.String"/>
</subPayload>

3.3.注解配置

父域通过com.alatka.messages.holder.UsageSubdomain引用子域接口,父域配置为:

    @IsoFieldMeta(domainNo = 57, fixed = false, length = 3, maxLength = 100, remark = "附加交易信息", existSubdomain = true, subdomainType = UVAS)
    private UsageSubdomain<Field57> addtnlData57;

子域配置:

public interface Field57 {
}

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F57", usage = "AR", remark = "银联8583 57域usage=AR")
public class Field57$AR implements Field57 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 3, remark = "附加应答信息")
    private String f57f1;
}

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F57", usage = "AB", remark = "银联8583 57域usage=AB")
public class Field57$AB implements Field57 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 20, remark = "发卡方附加交易信息")
    private String addInfo;
    @IsoFieldMeta(domainNo = 2, fixed = true, length = 20, remark = "CUPS附加交易信息")
    private String cupsAddInfo;
    @IsoFieldMeta(domainNo = 3, fixed = true, length = 56, remark = "保留使用")
    private String reserved;

}

4.TLV类型

TLV(tag-length-value)类型子域,以银联55域为例:

4.1.YAML配置

父域配置为:

payload:
  - { "domainNo": 55, "name": "iccData", "fixed": false, "length": 3, "maxLength": 255, "remark": "IC卡数据域", "existSubdomain": true, "subdomainType": "TLV" }

子域配置为F[子域号]@TLV,后接子域字段:

F55@TLV:
  - { "domainNo": 1, "aliasName": "9F26", "name": "crypt", "fixed": true, "length": 8, "remark": "应用密文", "clazz": "[B" }
  - { "domainNo": 2, "aliasName": "9F27", "name": "cryptInfoData", "fixed": true, "length": 1, "remark": "密文信息数据", "clazz": "[B" }
  - { "domainNo": 3, "aliasName": "9F10", "name": "issuerAppData", "fixed": false, "maxLength": 32, "remark": "发卡行应用数据", "clazz": "[B" }
  - { "domainNo": 4, "aliasName": "9F37", "name": "unpredictableNumber", "fixed": true, "length": 4, "remark": "不可预知数", "clazz": "[B" }
  - { "domainNo": 5, "aliasName": "9F36", "name": "appTransCounter", "fixed": true, "length": 2, "remark": "应用交易计数器", "clazz": "[B" }
  - { "domainNo": 6, "aliasName": "95", "name": "termVerificationResult", "fixed": true, "length": 5, "remark": "终端验证结果", "clazz": "[B" }
  - { "domainNo": 7, "aliasName": "9A", "name": "transDate", "fixed": true, "length": 3, "remark": "交易日期", "clazz": "java.time.LocalDate", "pattern": "yyMMdd", "parseType": "BCD" }
  - { "domainNo": 8, "aliasName": "9C", "name": "transType", "fixed": true, "length": 1, "remark": "交易类型", "clazz": "java.lang.Integer", "parseType": "BCD" }
  - { "domainNo": 9, "aliasName": "9F02", "name": "transAmt", "fixed": true, "length": 6, "remark": "授权金额", "clazz": "java.math.BigDecimal", "parseType": "BCD" }
  - { "domainNo": 10, "aliasName": "5F2A", "name": "transCurrencyCode", "fixed": true, "length": 2, "remark": "交易货币代码", "clazz": "java.lang.Integer", "parseType": "BCD" }
  - { "domainNo": 11, "aliasName": "82", "name": "appInterchangeProfile", "fixed": true, "length": 2, "remark": "应用交互特征", "clazz": "[B" }
  - { "domainNo": 12, "aliasName": "9F1A", "name": "termCountryCode", "fixed": true, "length": 2, "remark": "终端国家代码", "clazz": "java.lang.Integer", "parseType": "BCD" }
  - { "domainNo": 13, "aliasName": "9F03", "name": "otherAmt", "fixed": true, "length": 6, "remark": "其它金额", "clazz": "java.math.BigDecimal", "parseType": "BCD" }
  - { "domainNo": 14, "aliasName": "9F33", "name": "termCap", "fixed": true, "length": 3, "remark": "终端性能", "clazz": "[B" }
  - { "domainNo": 15, "aliasName": "9F34", "name": "cardholderVerificationMethodResults", "fixed": true, "length": 3, "remark": "持卡人验证方法结果", "clazz": "[B" }
  - { "domainNo": 16, "aliasName": "9F35", "name": "termType", "fixed": true, "length": 1, "remark": "终端类型", "clazz": "java.lang.Integer", "parseType": "BCD" }
  - { "domainNo": 17, "aliasName": "9F1E", "name": "interfaceDeviceSerialNumber", "fixed": true, "length": 8, "remark": "接口设备序列号", "clazz": "java.lang.String" }
  - { "domainNo": 18, "aliasName": "84", "name": "dedicatedFileName", "fixed": false, "maxLength": 16, "remark": "专用文件名称", "clazz": "[B" }
  - { "domainNo": 19, "aliasName": "9F09", "name": "termAppVersionNumber", "fixed": true, "length": 2, "remark": "应用版本号", "clazz": "[B" }
  - { "domainNo": 20, "aliasName": "9F41", "name": "transSequenceCounter", "fixed": false, "maxLength": 4, "remark": "交易序列计数器", "clazz": "java.lang.Integer", "parseType": "BCD" }
  - { "domainNo": 21, "aliasName": "91", "name": "issuerAuthenticationData", "fixed": false, "maxLength": 16, "remark": "发卡行认证数据", "clazz": "[B" }
  - { "domainNo": 22, "aliasName": "71", "name": "issuerScriptTemplate1", "fixed": false, "maxLength": 128, "remark": "发卡行脚本1", "clazz": "[B" }
  - { "domainNo": 23, "aliasName": "72", "name": "issuerScriptTemplate2", "fixed": false, "maxLength": 128, "remark": "发卡行脚本2", "clazz": "[B" }
  - { "domainNo": 24, "aliasName": "DF31", "name": "issuerScriptResults", "fixed": false, "maxLength": 21, "remark": "发卡方脚本结果", "clazz": "[B" }
  - { "domainNo": 25, "aliasName": "9F74", "name": "issuerAuthorizationCode", "fixed": true, "length": 6, "remark": "电子现金发卡行授权码", "clazz": "java.lang.String" }
  - { "domainNo": 26, "aliasName": "9F63", "name": "cardProductIdentification", "fixed": true, "length": 16, "remark": "卡产品标识信息", "clazz": "[B" }
  - { "domainNo": 27, "aliasName": "8A", "name": "authorizationResponseCode", "fixed": true, "length": 2, "remark": "授权响应码", "clazz": "java.lang.String" }

4.2.XML配置

父域配置为:

<payload>
 <field domainNo="55" name="iccData" fixed="false" length="3" maxLength="255" remark="IC卡数据域" existSubdomain="true" subdomainType="TLV"/>
</payload>

子域配置:

<subPayload domain="F55" domainType="TLV">
    <field domainNo="1" aliasName="9F26" name="crypt" fixed="true" length="8" remark="应用密文" clazz="[B"/>
    <field domainNo="2" aliasName="9F27" name="cryptInfoData" fixed="true" length="1" remark="密文信息数据" clazz="[B"/>
    <field domainNo="3" aliasName="9F10" name="issuerAppData" fixed="false" maxLength="32" remark="发卡行应用数据" clazz="[B"/>
    <field domainNo="4" aliasName="9F37" name="unpredictableNumber" fixed="true" length="4" remark="不可预知数" clazz="[B"/>
    <field domainNo="5" aliasName="9F36" name="appTransCounter" fixed="true" length="2" remark="应用交易计数器" clazz="[B"/>
    <field domainNo="6" aliasName="95" name="termVerificationResult" fixed="true" length="5" remark="终端验证结果" clazz="[B"/>
    <field domainNo="7" aliasName="9A" name="transDate" fixed="true" length="3" remark="交易日期" clazz="java.time.LocalDate" pattern="yyMMdd" parseType="BCD"/>
    <field domainNo="8" aliasName="9C" name="transType" fixed="true" length="1" remark="交易类型" clazz="java.lang.Integer" parseType="BCD"/>
    <field domainNo="9" aliasName="9F02" name="transAmt" fixed="true" length="6" remark="授权金额" clazz="java.math.BigDecimal" parseType="BCD"/>
    <field domainNo="10" aliasName="5F2A" name="transCurrencyCode" fixed="true" length="2" remark="交易货币代码" clazz="java.lang.Integer" parseType="BCD"/>
    <field domainNo="11" aliasName="82" name="appInterchangeProfile" fixed="true" length="2" remark="应用交互特征" clazz="[B"/>
    <field domainNo="12" aliasName="9F1A" name="termCountryCode" fixed="true" length="2" remark="终端国家代码" clazz="java.lang.Integer" parseType="BCD"/>
    <field domainNo="13" aliasName="9F03" name="otherAmt" fixed="true" length="6" remark="其它金额" clazz="java.math.BigDecimal" parseType="BCD"/>
    <field domainNo="14" aliasName="9F33" name="termCap" fixed="true" length="3" remark="终端性能" clazz="[B"/>
    <field domainNo="15" aliasName="9F34" name="cardholderVerificationMethodResults" fixed="true" length="3" remark="持卡人验证方法结果" clazz="[B"/>
    <field domainNo="16" aliasName="9F35" name="termType" fixed="true" length="1" remark="终端类型" clazz="java.lang.Integer" parseType="BCD"/>
    <field domainNo="17" aliasName="9F1E" name="interfaceDeviceSerialNumber" fixed="true" length="8" remark="接口设备序列号" clazz="java.lang.String"/>
    <field domainNo="18" aliasName="84" name="dedicatedFileName" fixed="false" maxLength="16" remark="专用文件名称" clazz="[B"/>
    <field domainNo="19" aliasName="9F09" name="termAppVersionNumber" fixed="true" length="2" remark="应用版本号" clazz="[B"/>
    <field domainNo="20" aliasName="9F41" name="transSequenceCounter" fixed="false" maxLength="4" remark="交易序列计数器" clazz="java.lang.Integer" parseType="BCD"/>
    <field domainNo="21" aliasName="91" name="issuerAuthenticationData" fixed="false" maxLength="16" remark="发卡行认证数据" clazz="[B"/>
    <field domainNo="22" aliasName="71" name="issuerScriptTemplate1" fixed="false" maxLength="128" remark="发卡行脚本1" clazz="[B"/>
    <field domainNo="23" aliasName="72" name="issuerScriptTemplate2" fixed="false" maxLength="128" remark="发卡行脚本2" clazz="[B"/>
    <field domainNo="24" aliasName="DF31" name="issuerScriptResults" fixed="false" maxLength="21" remark="发卡方脚本结果" clazz="[B"/>
    <field domainNo="25" aliasName="9F74" name="issuerAuthorizationCode" fixed="true" length="6" remark="电子现金发卡行授权码" clazz="java.lang.String"/>
    <field domainNo="26" aliasName="9F63" name="cardProductIdentification" fixed="true" length="16" remark="卡产品标识信息" clazz="[B"/>
    <field domainNo="27" aliasName="8A" name="authorizationResponseCode" fixed="true" length="2" remark="授权响应码" clazz="java.lang.String"/>
</subPayload>

4.3.注解配置

父域通过引用子域类,父域配置为:

@IsoFieldMeta(domainNo = 55, fixed = false, length = 3, maxLength = 255, remark = "IC卡数据域", existSubdomain = true, subdomainType = TLV)
private Field55 iccData;

子域配置:

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F55", domainType = TLV, remark = "cups 55域")
public class Field55 {

    @IsoFieldMeta(domainNo = 1, aliasName = "9F26", fixed = true, length = 8, remark = "应用密文")
    private byte[] crypt;
    @IsoFieldMeta(domainNo = 2, aliasName = "9F27", fixed = true, length = 1, remark = "密文信息数据")
    private byte[] cryptInfoData;
    @IsoFieldMeta(domainNo = 3, aliasName = "9F10", fixed = false, maxLength = 32, remark = "发卡行应用数据")
    private byte[] issuerAppData;
    @IsoFieldMeta(domainNo = 4, aliasName = "9F37", fixed = true, length = 4, remark = "不可预知数")
    private byte[] unpredictableNumber;
    @IsoFieldMeta(domainNo = 5, aliasName = "9F36", fixed = true, length = 2, remark = "应用交易计数器")
    private byte[] appTransCounter;
    @IsoFieldMeta(domainNo = 6, aliasName = "95", fixed = true, length = 5, remark = "终端验证结果")
    private byte[] termVerificationResult;
    @IsoFieldMeta(domainNo = 7, aliasName = "9A", fixed = true, length = 3, remark = "交易日期", pattern = "yyMMdd", parseType = BCD)
    private LocalDate transDate;
    @IsoFieldMeta(domainNo = 8, aliasName = "9C", fixed = true, length = 1, remark = "交易类型", parseType = BCD)
    private Integer transType;
    @IsoFieldMeta(domainNo = 9, aliasName = "9F02", fixed = true, length = 6, remark = "授权金额", parseType = BCD)
    private BigDecimal transAmt;
    @IsoFieldMeta(domainNo = 10, aliasName = "5F2A", fixed = true, length = 2, remark = "交易货币代码", parseType = BCD)
    private Integer transCurrencyCode;
    @IsoFieldMeta(domainNo = 11, aliasName = "82", fixed = true, length = 2, remark = "应用交互特征")
    private byte[] appInterchangeProfile;
    @IsoFieldMeta(domainNo = 12, aliasName = "9F1A", fixed = true, length = 2, remark = "终端国家代码", parseType = BCD)
    private Integer termCountryCode;
    @IsoFieldMeta(domainNo = 13, aliasName = "9F03", fixed = true, length = 6, remark = "其它金额", parseType = BCD)
    private BigDecimal otherAmt;
    @IsoFieldMeta(domainNo = 14, aliasName = "9F34", fixed = true, length = 3, remark = "持卡人验证方法结果")
    private byte[] cardholderVerificationMethodResults;
    @IsoFieldMeta(domainNo = 15, aliasName = "9F35", fixed = true, length = 1, remark = "终端类型", parseType = BCD)
    private Integer termType;
    @IsoFieldMeta(domainNo = 16, aliasName = "9F09", fixed = true, length = 2, remark = "应用版本号")
    private byte[] termAppVersionNumber;
    @IsoFieldMeta(domainNo = 17, aliasName = "9F33", fixed = true, length = 3, remark = "终端性能")
    private byte[] termCap;
    @IsoFieldMeta(domainNo = 18, aliasName = "9F1E", fixed = true, length = 8, remark = "接口设备序列号")
    private String interfaceDeviceSerialNumber;
    @IsoFieldMeta(domainNo = 19, aliasName = "4F", fixed = false, maxLength = 16, remark = "icc application ID")
    private byte[] iccAppId;
    @IsoFieldMeta(domainNo = 20, aliasName = "9F41", fixed = false, maxLength = 4, remark = "交易序列计数器", parseType = BCD)
    private Integer transSequenceCounter;
    @IsoFieldMeta(domainNo = 21, aliasName = "9F7C", fixed = false, maxLength = 32, remark = "Partner Discretionary Data")
    private byte[] pdd;
    @IsoFieldMeta(domainNo = 22, aliasName = "84", fixed = false, maxLength = 16, remark = "专用文件名称")
    private byte[] dedicatedFileName;
    @IsoFieldMeta(domainNo = 23, aliasName = "91", fixed = false, maxLength = 16, remark = "发卡行认证数据")
    private byte[] issuerAuthenticationData;
    @IsoFieldMeta(domainNo = 24, aliasName = "71", fixed = false, maxLength = 128, remark = "发卡行脚本1")
    private byte[] issuerScriptTemplate1;
    @IsoFieldMeta(domainNo = 25, aliasName = "72", fixed = false, maxLength = 128, remark = "发卡行脚本2")
    private byte[] issuerScriptTemplate2;

    // getter setter
}

5.TLV2类型

TLV2(tag-length-value)类型子域,以cupd62域usage=DA为例:

5.1.YAML配置

父域配置为:

payload:
    - { "domainNo": 62, "name": "switchingData", "fixed": false, "length": 3, "maxLength": 200, "remark": "交换中心数据", "existSubdomain": true, "subdomainType": "UV" }

子域配置为F[子域号]@TLV2,后接子域字段:

F62$DA@TLV2:
    - { "domainNo": 1, "aliasName": "T00", "name": "f104f1", "fixed": false, "maxLength": 6, "remark": "渠道编码", "clazz": "java.lang.String" }
    - { "domainNo": 2, "aliasName": "T01", "name": "f104f2", "fixed": false, "maxLength": 4, "remark": "账务代码", "clazz": "java.lang.String" }
    - { "domainNo": 3, "aliasName": "T02", "name": "f104f3", "fixed": false, "maxLength": 32, "remark": "渠道流水号", "clazz": "java.lang.String" }
    - { "domainNo": 4, "aliasName": "T03", "name": "f104f4", "fixed": true, "length": 71, "remark": "反洗钱相关", "existSubdomain": true, "subdomainType": "FIXED" }
    - { "domainNo": 5, "aliasName": "T94", "name": "f104f5", "fixed": true, "length": 8, "remark": "原始交易信息", "clazz": "java.lang.String" }
    - { "domainNo": 6, "aliasName": "T95", "name": "f104f6", "fixed": true, "length": 15, "remark": "第三方支付信息", "existSubdomain": true, "subdomainType": "FIXED" }
    - { "domainNo": 7, "aliasName": "T96", "name": "f104f7", "fixed": true, "length": 67, "remark": "无卡平台信息", "clazz": "java.lang.String" }
    - { "domainNo": 8, "aliasName": "T97", "name": "f104f8", "fixed": true, "length": 51, "remark": "总帐系统配套会计平台", "existSubdomain": true, "subdomainType": "FIXED" }
    - { "domainNo": 9, "aliasName": "T98", "name": "f104f9", "fixed": false, "maxLength": 19, "remark": "联盟流水号", "clazz": "java.lang.String" }
    - { "domainNo": 10, "aliasName": "T99", "name": "f104f10", "fixed": true, "length": 134, "remark": "行内信息", "clazz": "java.lang.String" }
    

5.2.XML配置

父域配置为:

子域配置:

5.3.注解配置

父域通过引用子域类,父域配置为:

子域配置:

6.TV类型

TV(tag-value)类型子域,以银联62域为例:

6.1.YAML配置

父域配置为:

payload:
  - { "domainNo": 62, "name": "switchingData", "fixed": false, "length": 3, "maxLength": 200, "remark": "交换中心数据", "existSubdomain": true, "subdomainType": "UV" }

子域配置为F[子域号]@TV,后接子域字段:

F62$IO@TV:
  - { "domainNo": 1, "name": "f62f1", "aliasName": "T00", "fixed": true, "length": 3, "remark": "国际信用卡公司/外资银行标志", "clazz": "java.lang.String" }
  - { "domainNo": 2, "name": "f62f2", "aliasName": "T07", "fixed": true, "length": 10, "remark": "交易日期时间", "clazz": "java.time.LocalDateTime", "pattern": "MMddHHmmss" }
  - { "domainNo": 3, "name": "f62f3", "aliasName": "T11", "fixed": true, "length": 6, "remark": "系统跟踪号码", "clazz": "java.lang.String" }
  - { "domainNo": 4, "name": "f62f4", "aliasName": "T18", "fixed": true, "length": 4, "remark": "商户类型", "clazz": "java.lang.String" }
  - { "domainNo": 5, "name": "f62f5", "aliasName": "T32", "fixed": true, "length": 11, "remark": "受理机构代码", "clazz": "java.lang.String" }
  - { "domainNo": 6, "name": "f62f6", "aliasName": "T33", "fixed": true, "length": 11, "remark": "发送机构标识码", "clazz": "java.lang.String" }
  - { "domainNo": 7, "name": "f62f7", "aliasName": "T39", "fixed": true, "length": 2, "remark": "响应码", "clazz": "java.lang.String" }
  - { "domainNo": 8, "name": "f62f8", "aliasName": "T37", "fixed": true, "length": 12, "remark": "检索参考号码", "clazz": "java.lang.String" }
  - { "domainNo": 9, "name": "f62f9", "aliasName": "T41", "fixed": true, "length": 8, "remark": "终端代码", "clazz": "java.lang.String" }
  - { "domainNo": 10, "name": "f62f10", "aliasName": "T42", "fixed": true, "length": 15, "remark": "商户代码", "clazz": "java.lang.String" }
  - { "domainNo": 11, "name": "f62f11", "aliasName": "T43", "fixed": true, "length": 40, "remark": "商户名称、地址", "clazz": "java.lang.String" }
  - { "domainNo": 12, "name": "f62f12", "aliasName": "T60", "fixed": true, "length": 7, "remark": "报文原因码", "clazz": "java.lang.String" }

6.2.XML配置

父域配置为:

<payload>
    <field domainNo="62" name="switchingData" fixed="false" length="3" maxLength="200" remark="交换中心数据" existSubdomain="true" subdomainType="UV"/>
</payload>

子域配置:

<subPayload domain="F62" usage="IO" domainType="TV">
    <field domainNo="1" name="f62f1" aliasName="T00" fixed="true" length="3" remark="国际信用卡公司/外资银行标志" clazz="java.lang.String"/>
    <field domainNo="2" name="f62f2" aliasName="T07" fixed="true" length="10" remark="交易日期时间" clazz="java.time.LocalDateTime" pattern="MMddHHmmss"/>
    <field domainNo="3" name="f62f3" aliasName="T11" fixed="true" length="6" remark="系统跟踪号码" clazz="java.lang.String"/>
    <field domainNo="4" name="f62f4" aliasName="T18" fixed="true" length="4" remark="商户类型" clazz="java.lang.String"/>
    <field domainNo="5" name="f62f5" aliasName="T32" fixed="true" length="11" remark="受理机构代码" clazz="java.lang.String"/>
    <field domainNo="6" name="f62f6" aliasName="T33" fixed="true" length="11" remark="发送机构标识码" clazz="java.lang.String"/>
    <field domainNo="7" name="f62f7" aliasName="T39" fixed="true" length="2" remark="响应码" clazz="java.lang.String"/>
    <field domainNo="8" name="f62f8" aliasName="T37" fixed="true" length="12" remark="检索参考号码" clazz="java.lang.String"/>
    <field domainNo="9" name="f62f9" aliasName="T41" fixed="true" length="8" remark="终端代码" clazz="java.lang.String"/>
    <field domainNo="10" name="f62f10" aliasName="T42" fixed="true" length="15" remark="商户代码" clazz="java.lang.String"/>
    <field domainNo="11" name="f62f11" aliasName="T43" fixed="true" length="40" remark="商户名称、地址" clazz="java.lang.String"/>
    <field domainNo="12" name="f62f12" aliasName="T60" fixed="true" length="7" remark="报文原因码" clazz="java.lang.String"/>
</subPayload>

6.3.注解配置

父域通过引用子域类,父域配置为:

@IsoFieldMeta(domainNo = 62, fixed = false, length = 3, maxLength = 200, remark = "交换中心数据", existSubdomain = true, subdomainType = UV)
    private UsageSubdomain<Field62> switchingData;
    

子域配置:

public interface Field62 {
}

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F62", usage = "IO", domainType = TV, remark = "银联8583 62域usage=IO")
public class Field62$IO implements Field62 {

    @IsoFieldMeta(domainNo = 1, aliasName = "T00", fixed = true, length = 3, remark = "国际信用卡公司/外资银行标志")
    private String f62f1;
    @IsoFieldMeta(domainNo = 2, aliasName = "T07", fixed = true, length = 10, remark = "交易日期时间", pattern = "MMddHHmmss")
    private LocalDateTime f62f2;
    @IsoFieldMeta(domainNo = 3, aliasName = "T11", fixed = true, length = 6, remark = "系统跟踪号码")
    private String f62f3;
    @IsoFieldMeta(domainNo = 4, aliasName = "T18", fixed = true, length = 4, remark = "商户类型")
    private String f62f4;
    @IsoFieldMeta(domainNo = 5, aliasName = "T32", fixed = true, length = 11, remark = "受理机构代码")
    private String f62f5;
    @IsoFieldMeta(domainNo = 6, aliasName = "T33", fixed = true, length = 11, remark = "发送机构标识码")
    private String f62f6;
    @IsoFieldMeta(domainNo = 7, aliasName = "T39", fixed = true, length = 2, remark = "响应码")
    private String f62f7;
    @IsoFieldMeta(domainNo = 8, aliasName = "T37", fixed = true, length = 12, remark = "检索参考号码")
    private String f62f8;
    @IsoFieldMeta(domainNo = 9, aliasName = "T41", fixed = true, length = 8, remark = "终端代码")
    private String f62f9;
    @IsoFieldMeta(domainNo = 10, aliasName = "T42", fixed = true, length = 15, remark = "商户代码")
    private String f62f10;
    @IsoFieldMeta(domainNo = 11, aliasName = "T43", fixed = true, length = 40, remark = "商户名称、地址")
    private String f62f11;
    @IsoFieldMeta(domainNo = 12, aliasName = "T60", fixed = true, length = 7, remark = "报文原因码")
    private String f62f12;

    // getter setter
}

7.ULV类型

ULV(usage-length-value)类型子域,U(usage)2字节acsii编码,L(length)3字节acsii编码;以银联63域为例:

7.1.YAML配置

父域配置为:

payload:
  - { "domainNo": 63, "name": "finaclNetData", "fixed": false, "length": 3, "maxLength": 512, "remark": "金融网络数据", "existSubdomain": true, "subdomainType": "ULV" }

子域配置为F[子域号]$[usage],后接子域字段;usage=SM子域:

F63$SM:
  - { "domainNo": 1, "name": "pin", "fixed": true, "length": 16, "remark": "SM4算法加密的PIN数据", "clazz": "[B" }

usage=TK子域格式为TLV,配置为F[子域号]$[usage]@TLV,后接子域字段:

F63$TK@TLV:
  - { "domainNo": 1, "aliasName": "01", "name": "tag01", "fixed": true, "length": 1, "remark": "是否验证过Token相关信息", "clazz": "java.lang.String" }
  - { "domainNo": 2, "aliasName": "02", "name": "tag02", "fixed": false, "maxLength": 19, "remark": "Token", "clazz": "java.lang.String" }
  - { "domainNo": 3, "aliasName": "03", "name": "tag03", "fixed": true, "length": 4, "remark": "Token有效期", "clazz": "java.time.YearMonth", "pattern": "yyMM" }
  - { "domainNo": 4, "aliasName": "04", "name": "tag04", "fixed": false, "maxLength": 2, "remark": "Token担保级别", "clazz": "java.lang.String" }
  - { "domainNo": 5, "aliasName": "05", "name": "tag05", "fixed": true, "length": 2, "remark": "Token应用场景标识", "clazz": "java.lang.Integer" }
  - { "domainNo": 6, "aliasName": "06", "name": "tag06", "fixed": false, "maxLength": 11, "remark": "TRID", "clazz": "java.lang.String" }
  - { "domainNo": 7, "aliasName": "07", "name": "tag07", "fixed": false, "maxLength": 32, "remark": "保留使用", "clazz": "[B" }
  - { "domainNo": 8, "aliasName": "08", "name": "tag08", "fixed": true, "length": 4, "remark": "产品标识", "clazz": "[B" }

7.2.XML配置

父域配置为:

<payload>
    <field domainNo="63" name="finaclNetData" fixed="false" length="3" maxLength="512" remark="金融网络数据" existSubdomain="true" subdomainType="ULV"/>
</payload>

子域配置:

<subPayload domain="F63" usage="SM">
    <field domainNo="1" name="pin" fixed="true" length="16" remark="SM4算法加密的PIN数据" clazz="[B"/>
</subPayload>
<subPayload domain="F63" usage="TK" domainType="TLV">
    <field domainNo="1" aliasName="01" name="tag01" fixed="true" length="1" remark="是否验证过Token相关信息" clazz="java.lang.String"/>
    <field domainNo="2" aliasName="02" name="tag02" fixed="false" maxLength="19" remark="Token" clazz="java.lang.String"/>
    <field domainNo="3" aliasName="03" name="tag03" fixed="true" length="4" remark="Token有效期" clazz="java.time.YearMonth" pattern="yyMM"/>
    <field domainNo="4" aliasName="04" name="tag04" fixed="false" maxLength="2" remark="Token担保级别" clazz="java.lang.String"/>
    <field domainNo="5" aliasName="05" name="tag05" fixed="true" length="2" remark="Token应用场景标识" clazz="java.lang.Integer"/>
    <field domainNo="6" aliasName="06" name="tag06" fixed="false" maxLength="11" remark="TRID" clazz="java.lang.String"/>
    <field domainNo="7" aliasName="07" name="tag07" fixed="false" maxLength="32" remark="保留使用" clazz="[B"/>
    <field domainNo="8" aliasName="08" name="tag08" fixed="true" length="4" remark="产品标识" clazz="[B"/>
</subPayload>

7.3.注解配置

父域通过com.alatka.messages.holder.UsageSubdomain引用子域接口,父域配置为:

@IsoFieldMeta(domainNo = 63, fixed = false, length = 3, maxLength = 512, remark = "金融网络数据", existSubdomain = true, subdomainType = ULV)
    private UsageSubdomain<Field63> finaclNetData;
    

子域配置:

public interface Field63 {
}

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F63", usage = "SM", remark = "银联8583 63域usage=SM")
public class Field63$SM implements Field63 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 16, remark = "SM4算法加密的PIN数据")
    private byte[] pin;

    // getter setter
}

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F63", usage = "TK", domainType = TLV, remark = "银联8583 63域usage=TK")
public class Field63$TK implements Field63 {

    @IsoFieldMeta(domainNo = 1, aliasName = "01", fixed = true, length = 1, remark = "是否验证过Token相关信息")
    private String tag01;
    @IsoFieldMeta(domainNo = 2, aliasName = "02", fixed = false, maxLength = 19, remark = "Token")
    private String tag02;
    @IsoFieldMeta(domainNo = 3, aliasName = "03", fixed = true, length = 4, remark = "Token有效期", pattern = "yyMM")
    private YearMonth tag03;
    @IsoFieldMeta(domainNo = 4, aliasName = "04", fixed = false, maxLength = 2, remark = "Token担保级别")
    private String tag04;
    @IsoFieldMeta(domainNo = 5, aliasName = "05", fixed = true, length = 2, remark = "Token应用场景标识")
    private Integer tag05;
    @IsoFieldMeta(domainNo = 6, aliasName = "06", fixed = false, maxLength = 11, remark = "TRID")
    private String tag06;
    @IsoFieldMeta(domainNo = 7, aliasName = "07", fixed = false, maxLength = 32, remark = "保留使用")
    private byte[] tag07;
    @IsoFieldMeta(domainNo = 8, aliasName = "08", fixed = true, length = 4, remark = "产品标识")
    private byte[] tag08;

    // getter setter
}

8.ULV2类型

ULV2(usage-length-value)类型子域,U(usage)2字节ebcdic编码,L(length)2字节ebcdic编码;以jcb 60域为例:

8.1.YAML配置

父域配置为:

payload:
  - { "domainNo": 60, "name": "stipRelInfo", "fixed": false, "length": 1, "maxLength": 255, "remark": "STIP related information", "existSubdomain": true, "subdomainType": "ULV2", "parseType": "NONE_V2" }

子域配置为F[子域号]$[usage],后接子域字段,usage=01/02/03:

F60$01:
  - { "domainNo": 1, "name": "f60f1", "fixed": true, "length": 1, "remark": "STIP Institution", "clazz": "java.lang.String", "parseType": "EBCDIC" }
F60$02:
  - { "domainNo": 1, "name": "f60f1", "fixed": true, "length": 1, "remark": "STIP Reason", "clazz": "java.lang.String", "parseType": "EBCDIC" }
F60$03:
  - { "domainNo": 1, "name": "f60f1", "fixed": true, "length": 2, "remark": "STIP Rejected Reason", "clazz": "java.lang.String", "parseType": "EBCDIC" }

8.2.XML配置

父域配置为:

<payload>
    <field domainNo="60" name="stipRelInfo" fixed="false" length="1" maxLength="255" remark="STIP related information" existSubdomain="true" subdomainType="ULV2" parseType="NONE_V2"/>
</payload>

子域配置:

<subPayload domain="F60" usage="01">
    <field domainNo="1" name="f60f1" fixed="true" length="1" remark="STIP Institution" clazz="java.lang.String" parseType="EBCDIC"/>
</subPayload>
<subPayload domain="F60" usage="02">
    <field domainNo="1" name="f60f1" fixed="true" length="1" remark="STIP Reason" clazz="java.lang.String" parseType="EBCDIC"/>
</subPayload>
<subPayload domain="F60" usage="03">
    <field domainNo="1" name="f60f1" fixed="true" length="2" remark="STIP Rejected Reason" clazz="java.lang.String" parseType="EBCDIC"/>
</subPayload>

8.3.注解配置

父域通过com.alatka.messages.holder.UsageSubdomain引用子域接口,父域配置为:

    @IsoFieldMeta(domainNo = 60, fixed = false, length = 1, maxLength = 255, remark = "STIP related information", existSubdomain = true, subdomainType = ULV2, parseType = NONE_V2)
    private UsageSubdomain<Field60> stipRelInfo;
 

子域配置:

public interface Field60 {
}

@MessageMeta(type = iso, group = "jcb", code = "common", kind = subPayload, domain = "F60", usage = "01", remark = "jcb 60域usage=01")
public class Field60$01 implements Field60 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 1, remark = "STIP Institution", parseType = EBCDIC)
    private String f60f1;

    // getter setter
}

@MessageMeta(type = iso, group = "jcb", code = "common", kind = subPayload, domain = "F60", usage = "02", remark = "jcb 60域usage=02")
public class Field60$02 implements Field60 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 1, remark = "STIP Reason", parseType = EBCDIC)
    private String f60f1;
    // getter setter
}

@MessageMeta(type = iso, group = "jcb", code = "common", kind = subPayload, domain = "F60", usage = "03", remark = "jcb 60域usage=03")
public class Field60$03 implements Field60 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 2, remark = "STIP Rejected Reason", parseType = EBCDIC)
    private String f60f1;

    // getter setter
}

9.PAGE类型

PAGE类型子域,用于分页处理;以固定格式3886交易为例,F11 counts字段为记录数,需要在分页子域中通过"pageSizeName": "counts"进行关联:

9.1.YAML配置

response:
  - { "domainNo": 11, "name": "counts", "length": 2, "remark": "本次返回交易条数", "clazz": "java.lang.Integer" }
  - { "domainNo": 13, "name": "elements", "fixed": false, "length": 141, "remark": "集合", "clazz": "java.util.ArrayList", "pageSizeName": "counts", "existSubdomain": true, "subdomainType": "PAGE" }

子域配置为F[子域号]$[usage],后接子域字段:

F13:
  - { "domainNo": 1, "name": "monthNbr", "length": 3, "remark": "月份序号", "clazz": "java.lang.Integer" }
  - { "domainNo": 2, "name": "valDate", "length": 8, "remark": "入账日期", "clazz": "java.time.LocalDate", "pattern": "yyyyMMdd" }
  - { "domainNo": 3, "name": "purDate", "length": 8, "remark": "记录日期", "clazz": "java.time.LocalDate", "pattern": "yyyyMMdd" }
  - { "domainNo": 4, "name": "purTime", "length": 8, "remark": "消费时间", "clazz": "java.time.LocalTime", "pattern": "HHmmssSS" }
  - { "domainNo": 5, "name": "tranNo", "length": 6, "remark": "交易流水号", "clazz": "java.lang.Integer" }
  - { "domainNo": 6, "name": "tranType", "length": 4, "remark": "交易类型", "clazz": "java.lang.String" }
  - { "domainNo": 7, "name": "amount", "length": 12, "remark": "交易金额", "clazz": "java.math.BigDecimal" }
  - { "domainNo": 8, "name": "amountFl", "length": 1, "remark": "交易金额符号", "clazz": "java.lang.String" }
  - { "domainNo": 9, "name": "authCode", "length": 6, "remark": "授权代码", "clazz": "java.lang.String" }
  - { "domainNo": 10, "name": "desline1", "length": 42, "remark": "交易描述1", "clazz": "java.lang.String" }
  - { "domainNo": 11, "name": "desline2", "length": 25, "remark": "交易描述2", "clazz": "java.lang.String" }
  - { "domainNo": 12, "name": "cardEnd", "length": 4, "remark": "卡号后四位", "clazz": "java.lang.String" }
  - { "domainNo": 13, "name": "currNum", "length": 3, "remark": "货币代码", "clazz": "java.lang.String" }
  - { "domainNo": 14, "name": "mpFlag", "length": 1, "remark": "保留字段1", "clazz": "java.lang.String" }
  - { "domainNo": 15, "name": "purDate1", "length": 4, "remark": "消费日期", "clazz": "java.time.MonthDay", "pattern": "MMdd" }
  - { "domainNo": 16, "name": "revInd", "length": 1, "remark": "撤销冲正标志", "clazz": "java.lang.String" }
  - { "domainNo": 17, "name": "mcc", "length": 4, "remark": "商户类别", "clazz": "java.lang.String" }
  - { "domainNo": 18, "name": "facePayFlag", "length": 1, "remark": "人脸支付标志", "clazz": "java.lang.String" }

9.2.XML配置

父域配置为:

<response>
    <field domainNo="11" name="counts" length="2" remark="本次返回交易条数" clazz="java.lang.Integer"/>
    <field domainNo="13" name="elements" fixed="false" length="141" remark="集合" clazz="java.util.ArrayList" pageSizeName="counts" existSubdomain="true" subdomainType="PAGE"/>
</response>

子域配置:

<subPayload domain="F13">
    <field domainNo="1" name="monthNbr" length="3" remark="月份序号" clazz="java.lang.Integer"/>
    <field domainNo="2" name="valDate" length="8" remark="入账日期" clazz="java.time.LocalDate" pattern="yyyyMMdd"/>
    <field domainNo="3" name="purDate" length="8" remark="记录日期" clazz="java.time.LocalDate" pattern="yyyyMMdd"/>
    <field domainNo="4" name="purTime" length="8" remark="消费时间" clazz="java.time.LocalTime" pattern="HHmmssSS"/>
    <field domainNo="5" name="tranNo" length="6" remark="交易流水号" clazz="java.lang.Integer"/>
    <field domainNo="6" name="tranType" length="4" remark="交易类型" clazz="java.lang.String"/>
    <field domainNo="7" name="amount" length="12" remark="交易金额" clazz="java.math.BigDecimal"/>
    <field domainNo="8" name="amountFl" length="1" remark="交易金额符号" clazz="java.lang.String"/>
    <field domainNo="9" name="authCode" length="6" remark="授权代码" clazz="java.lang.String"/>
    <field domainNo="10" name="desline1" length="42" remark="交易描述1" clazz="java.lang.String"/>
    <field domainNo="11" name="desline2" length="25" remark="交易描述2" clazz="java.lang.String"/>
    <field domainNo="12" name="cardEnd" length="4" remark="卡号后四位" clazz="java.lang.String"/>
    <field domainNo="13" name="currNum" length="3" remark="货币代码" clazz="java.lang.String"/>
    <field domainNo="14" name="mpFlag" length="1" remark="保留字段1" clazz="java.lang.String"/>
    <field domainNo="15" name="purDate1" length="4" remark="消费日期" clazz="java.time.MonthDay" pattern="MMdd"/>
    <field domainNo="16" name="revInd" length="1" remark="撤销冲正标志" clazz="java.lang.String"/>
    <field domainNo="17" name="mcc" length="4" remark="商户类别" clazz="java.lang.String"/>
    <field domainNo="18" name="facePayFlag" length="1" remark="人脸支付标志" clazz="java.lang.String"/>
</subPayload>

9.3.注解配置

父域配置为:

@FixedFieldMeta(domainNo = 11, length = 2, remark = "本次返回交易条数")
private Integer counts;
@FixedFieldMeta(domainNo = 13, fixed = false, length = 141, remark = "集合", pageSizeName = "counts", existSubdomain = true, subdomainType = PAGE)
    private List<Fixed3886Page> elements;

子域配置:

@MessageMeta( type = fixed, group = "0305", code = "3886", kind = subPayload, remark = "账单明细查询")
public class Fixed3886Page {
    @FixedFieldMeta(domainNo = 1, length = 3, remark = "月份序号")
    private Integer monthNbr;
    @FixedFieldMeta(domainNo = 2, length = 8, remark = "入账日期", pattern = "yyyyMMdd")
    private LocalDate valDate;
    @FixedFieldMeta(domainNo = 3, length = 8, remark = "记录日期", pattern = "yyyyMMdd")
    private LocalDate purDate;
    @FixedFieldMeta(domainNo = 4, length = 8, remark = "消费时间", pattern = "HHmmssSS")
    private LocalTime purTime;
    @FixedFieldMeta(domainNo = 5, length = 6, remark = "交易流水号")
    private Integer tranNo;
    @FixedFieldMeta(domainNo = 6, length = 4, remark = "交易类型")
    private String tranType;
    @FixedFieldMeta(domainNo = 7, length = 12, remark = "交易金额")
    private BigDecimal amount;
    @FixedFieldMeta(domainNo = 8, length = 1, remark = "交易金额符号")
    private String amountFl;
    @FixedFieldMeta(domainNo = 9, length = 6, remark = "授权代码")
    private String authCode;
    @FixedFieldMeta(domainNo = 10, length = 42, remark = "交易描述1")
    private String desline1;
    @FixedFieldMeta(domainNo = 11, length = 25, remark = "交易描述2")
    private String desline2;
    @FixedFieldMeta(domainNo = 12, length = 4, remark = "卡号后四位")
    private String cardEnd;
    @FixedFieldMeta(domainNo = 13, length = 3, remark = "货币代码")
    private String currNum;
    @FixedFieldMeta(domainNo = 14, length = 1, remark = "保留字段1")
    private String mpFlag;
    @FixedFieldMeta(domainNo = 15, length = 4, remark = "消费日期", pattern = "MMdd")
    private MonthDay purDate1;
    @FixedFieldMeta(domainNo = 16, length = 1, remark = "撤销冲正标志")
    private String revInd;
    @FixedFieldMeta(domainNo = 17, length = 4, remark = "商户类别")
    private String mcc;
    @FixedFieldMeta(domainNo = 18, length = 1, remark = "人脸支付标志")
    private String facePayFlag;
    
    // getter setter
}

10.嵌套域类型

10.1.YAML配置

嵌套子域配置为F[域号]_F[子域号],以_连接

银联60子域中,第11域为嵌套子域:

F60:
  - { "domainNo": 1, "name": "f60f1", "fixed": true, "length": 4, "remark": "报文原因码", "clazz": "java.lang.String" }
  - { "domainNo": 2, "name": "f60f2", "fixed": true, "length": 1, "remark": "账户所有人类型", "clazz": "java.lang.String" }
  - { "domainNo": 3, "name": "f60f3", "fixed": true, "length": 1, "remark": "终端读取能力", "clazz": "java.lang.String" }
  - { "domainNo": 4, "name": "f60f4", "fixed": true, "length": 1, "remark": "IC卡条件代码", "clazz": "java.lang.String" }
  - { "domainNo": 5, "name": "f60f5", "fixed": true, "length": 1, "remark": "保留使用", "clazz": "java.lang.String" }
  - { "domainNo": 6, "name": "f60f6", "fixed": true, "length": 2, "remark": "终端类型", "clazz": "java.lang.String" }
  - { "domainNo": 7, "name": "f60f7", "fixed": true, "length": 1, "remark": "受理免验密码标志", "clazz": "java.lang.String" }
  - { "domainNo": 8, "name": "f60f8", "fixed": true, "length": 1, "remark": "IC卡验证可靠性标志", "clazz": "java.lang.String" }
  - { "domainNo": 9, "name": "f60f9", "fixed": true, "length": 2, "remark": "电子商务标志", "clazz": "java.lang.String" }
  - { "domainNo": 10, "name": "f60f10", "fixed": true, "length": 1, "remark": "交互方式标志", "clazz": "java.lang.String" }
  - { "domainNo": 11, "name": "f60f11", "fixed": false, "length": -1, "maxLength": 15, "remark": "交易发生附加信息", "existSubdomain": true, "subdomainType": "FIXED" }
F60_F11:
  - { "domainNo": 1, "name": "f60f11f1", "fixed": true, "length": 2, "remark": "特殊计费类型", "clazz": "java.lang.String" }
  - { "domainNo": 2, "name": "f60f11f2", "fixed": true, "length": 1, "remark": "特殊计费档次", "clazz": "java.lang.String" }
  - { "domainNo": 3, "name": "f60f11f3", "fixed": true, "length": 3, "remark": "保留使用(第3位为MAC算法标识)", "clazz": "java.lang.String" }
  - { "domainNo": 4, "name": "f60f11f4", "fixed": true, "length": 1, "remark": "支持部分承兑和返回余额标志", "clazz": "java.lang.String" }
  - { "domainNo": 5, "name": "f60f11f5", "fixed": true, "length": 1, "remark": "交易发起方式", "clazz": "java.lang.String" }
  - { "domainNo": 6, "name": "f60f11f6", "fixed": true, "length": 1, "remark": "交易介质", "clazz": "java.lang.String" }
  - { "domainNo": 7, "name": "f60f11f7", "fixed": true, "length": 1, "remark": "IC 卡的应用类型", "clazz": "java.lang.String" }
  - { "domainNo": 8, "name": "f60f11f8", "fixed": true, "length": 2, "remark": "账户结算类型", "clazz": "java.lang.String" }
  - { "domainNo": 9, "name": "f60f11f9", "fixed": true, "length": 1, "remark": "卡账户等级", "clazz": "java.lang.String" }
  - { "domainNo": 10, "name": "f60f11f10", "fixed": true, "length": 2, "remark": "卡产品", "clazz": "java.lang.String" }

银联59域usage=QR子域中,第3域为分页子域:

F59$QR:
  - { "domainNo": 1, "name": "currencyCode", "fixed": true, "length": 3, "remark": "卡账户货币代码", "clazz": "java.lang.String" }
  - { "domainNo": 2, "name": "counts", "fixed": true, "length": 3, "remark": "所有满足查询条件的记录数", "clazz": "java.lang.Integer" }
  - { "domainNo": 3, "name": "elements", "fixed": false, "length": 50, "maxLength": 5000, "remark": "查询结果", "clazz": "java.util.ArrayList", "pageSizeName": "counts", "existSubdomain": true, "subdomainType": "PAGE" }
F59$QR_F3:
  - { "domainNo": 1, "name": "number", "fixed": true, "length": 3, "remark": "明细顺序号", "clazz": "java.lang.Integer" }
  - { "domainNo": 2, "name": "transDate", "fixed": true, "length": 8, "remark": "交易日期", "clazz": "java.time.LocalDate", "pattern": "yyyyMMdd" }
  - { "domainNo": 3, "name": "currencyCode", "fixed": true, "length": 3, "remark": "交易货币代码", "clazz": "java.lang.String" }
  - { "domainNo": 4, "name": "transAmt", "fixed": true, "length": 13, "remark": "交易金额", "clazz": "java.lang.String" }
  - { "domainNo": 5, "name": "balanceAmt", "fixed": true, "length": 13, "remark": "余额", "clazz": "java.lang.String" }
  - { "domainNo": 6, "name": "memoCode", "fixed": true, "length": 10, "remark": "备注代码", "clazz": "java.lang.String" }

银联121子域中,第5域为UV子域:

F121:
  - { "domainNo": 1, "name": "f121f1", "fixed": true, "length": 1, "remark": "应答原因码", "clazz": "java.lang.String" }
  - { "domainNo": 2, "name": "f121f2", "fixed": true, "length": 1, "remark": "单/双或双/单转换码", "clazz": "java.lang.String" }
  - { "domainNo": 3, "name": "f121f3", "fixed": true, "length": 1, "remark": "卡性质", "clazz": "java.lang.String" }
  - { "domainNo": 4, "name": "f121f4", "fixed": true, "length": 40, "remark": "CUPS保留", "clazz": "java.lang.String" }
  - { "domainNo": 5, "name": "f121f5", "fixed": true, "length": 38, "remark": "转入和转出方标识代码/手续费信息", "existSubdomain": true, "subdomainType": "UV" }
F121_F5$FD:
  - { "domainNo": 1, "name": "f121f5f1", "fixed": true, "length": 36, "remark": "手续费信息", "clazz": "java.lang.String" }
F121_F5$ID:
  - { "domainNo": 1, "name": "f121f5f1", "fixed": true, "length": 8, "remark": "转出方标识代码", "clazz": "java.lang.String" }
  - { "domainNo": 2, "name": "f121f5f2", "fixed": true, "length": 8, "remark": "转入方标识代码", "clazz": "java.lang.String" }
  - { "domainNo": 3, "name": "f121f5f3", "fixed": true, "length": 20, "remark": "其余", "clazz": "java.lang.String" }

10.2.XML配置

银联60子域中,第11域为嵌套子域:

<subPayload domain="F60">
    <field domainNo="1" name="f60f1" fixed="true" length="4" remark="报文原因码" clazz="java.lang.String"/>
    <field domainNo="2" name="f60f2" fixed="true" length="1" remark="账户所有人类型" clazz="java.lang.String"/>
    <field domainNo="3" name="f60f3" fixed="true" length="1" remark="终端读取能力" clazz="java.lang.String"/>
    <field domainNo="4" name="f60f4" fixed="true" length="1" remark="IC卡条件代码" clazz="java.lang.String"/>
    <field domainNo="5" name="f60f5" fixed="true" length="1" remark="保留使用" clazz="java.lang.String"/>
    <field domainNo="6" name="f60f6" fixed="true" length="2" remark="终端类型" clazz="java.lang.String"/>
    <field domainNo="7" name="f60f7" fixed="true" length="1" remark="受理免验密码标志" clazz="java.lang.String"/>
    <field domainNo="8" name="f60f8" fixed="true" length="1" remark="IC卡验证可靠性标志" clazz="java.lang.String"/>
    <field domainNo="9" name="f60f9" fixed="true" length="2" remark="电子商务标志" clazz="java.lang.String"/>
    <field domainNo="10" name="f60f10" fixed="true" length="1" remark="交互方式标志" clazz="java.lang.String"/>
    <field domainNo="11" name="f60f11" fixed="false" length="-1" maxLength="15" remark="交易发生附加信息" existSubdomain="true" subdomainType="FIXED"/>
</subPayload>
<subPayload domain="F60_F11">
    <field domainNo="1" name="f60f11f1" fixed="true" length="2" remark="特殊计费类型" clazz="java.lang.String"/>
    <field domainNo="2" name="f60f11f2" fixed="true" length="1" remark="特殊计费档次" clazz="java.lang.String"/>
    <field domainNo="3" name="f60f11f3" fixed="true" length="3" remark="保留使用(第3位为MAC算法标识)" clazz="java.lang.String"/>
    <field domainNo="4" name="f60f11f4" fixed="true" length="1" remark="支持部分承兑和返回余额标志" clazz="java.lang.String"/>
    <field domainNo="5" name="f60f11f5" fixed="true" length="1" remark="交易发起方式" clazz="java.lang.String"/>
    <field domainNo="6" name="f60f11f6" fixed="true" length="1" remark="交易介质" clazz="java.lang.String"/>
    <field domainNo="7" name="f60f11f7" fixed="true" length="1" remark="IC 卡的应用类型" clazz="java.lang.String"/>
    <field domainNo="8" name="f60f11f8" fixed="true" length="2" remark="账户结算类型" clazz="java.lang.String"/>
    <field domainNo="9" name="f60f11f9" fixed="true" length="1" remark="卡账户等级" clazz="java.lang.String"/>
    <field domainNo="10" name="f60f11f10" fixed="true" length="2" remark="卡产品" clazz="java.lang.String"/>
</subPayload>

银联59域usage=QR子域中,第3域为分页子域:

<subPayload domain="F59" usage="QR">
    <field domainNo="1" name="currencyCode" fixed="true" length="3" remark="卡账户货币代码" clazz="java.lang.String"/>
    <field domainNo="2" name="counts" fixed="true" length="3" remark="所有满足查询条件的记录数" clazz="java.lang.Integer"/>
    <field domainNo="3" name="elements" fixed="false" length="50" maxLength="5000" remark="查询结果" clazz="java.util.ArrayList" pageSizeName="counts" existSubdomain="true" subdomainType="PAGE"/>
</subPayload>
<subPayload domain="F59$QR_F3">
    <field domainNo="1" name="number" fixed="true" length="3" remark="明细顺序号" clazz="java.lang.Integer"/>
    <field domainNo="2" name="transDate" fixed="true" length="8" remark="交易日期" clazz="java.time.LocalDate" pattern="yyyyMMdd"/>
    <field domainNo="3" name="currencyCode" fixed="true" length="3" remark="交易货币代码" clazz="java.lang.String"/>
    <field domainNo="4" name="transAmt" fixed="true" length="13" remark="交易金额" clazz="java.lang.String"/>
    <field domainNo="5" name="balanceAmt" fixed="true" length="13" remark="余额" clazz="java.lang.String"/>
    <field domainNo="6" name="memoCode" fixed="true" length="10" remark="备注代码" clazz="java.lang.String"/>
</subPayload>

银联121子域中,第5域为UV子域:

<subPayload domain="F121">
    <field domainNo="1" name="f121f1" fixed="true" length="1" remark="应答原因码" clazz="java.lang.String"/>
    <field domainNo="2" name="f121f2" fixed="true" length="1" remark="单/双或双/单转换码" clazz="java.lang.String"/>
    <field domainNo="3" name="f121f3" fixed="true" length="1" remark="卡性质" clazz="java.lang.String"/>
    <field domainNo="4" name="f121f4" fixed="true" length="40" remark="CUPS保留" clazz="java.lang.String"/>
    <field domainNo="5" name="f121f5" fixed="true" length="38" remark="转入和转出方标识代码/手续费信息" existSubdomain="true" subdomainType="UV"/>
</subPayload>
<subPayload domain="F121_F5" usage="FD">
    <field domainNo="1" name="f121f5f1" fixed="true" length="36" remark="手续费信息" clazz="java.lang.String"/>
</subPayload>
<subPayload domain="F121_F5" usage="ID">
    <field domainNo="1" name="f121f5f1" fixed="true" length="8" remark="转出方标识代码" clazz="java.lang.String"/>
    <field domainNo="2" name="f121f5f2" fixed="true" length="8" remark="转入方标识代码" clazz="java.lang.String"/>
    <field domainNo="3" name="f121f5f3" fixed="true" length="20" remark="其余" clazz="java.lang.String"/>
</subPayload>

10.3.注解配置

银联60子域中,第11域为嵌套子域:

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F60", remark = "银联8583 60域")
public class Field60 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 4, remark = "报文原因码")
    private String f60f1;
    @IsoFieldMeta(domainNo = 2, fixed = true, length = 1, remark = "账户所有人类型")
    private String f60f2;
    @IsoFieldMeta(domainNo = 3, fixed = true, length = 1, remark = "终端读取能力")
    private String f60f3;
    @IsoFieldMeta(domainNo = 4, fixed = true, length = 1, remark = "IC卡条件代码")
    private String f60f4;
    @IsoFieldMeta(domainNo = 5, fixed = true, length = 1, remark = "保留使用")
    private String f60f5;
    @IsoFieldMeta(domainNo = 6, fixed = true, length = 2, remark = "终端类型")
    private String f60f6;
    @IsoFieldMeta(domainNo = 7, fixed = true, length = 1, remark = "受理免验密码标志")
    private String f60f7;
    @IsoFieldMeta(domainNo = 8, fixed = true, length = 1, remark = "IC卡验证可靠性标志")
    private String f60f8;
    @IsoFieldMeta(domainNo = 9, fixed = true, length = 2, remark = "电子商务标志")
    private String f60f9;
    @IsoFieldMeta(domainNo = 10, fixed = true, length = 1, remark = "交互方式标志")
    private String f60f10;
    @IsoFieldMeta(domainNo = 11, fixed = true, length = -1, maxLength = 15, remark = "交易发生附加信息", existSubdomain = true, subdomainType = FIXED)
    private Field60_F11 f60f11;
   
    // getter setter
}

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F60_F11", remark = "银联8583 60.11域")
public class Field60_F11 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 2, remark = "特殊计费类型")
    private String f60f11f1;
    @IsoFieldMeta(domainNo = 2, fixed = true, length = 1, remark = "特殊计费档次")
    private String f60f11f2;
    @IsoFieldMeta(domainNo = 3, fixed = true, length = 3, remark = "保留使用(第3位为MAC算法标识)")
    private String f60f11f3;
    @IsoFieldMeta(domainNo = 4, fixed = true, length = 1, remark = "支持部分承兑和返回余额标志")
    private String f60f11f4;
    @IsoFieldMeta(domainNo = 5, fixed = true, length = 1, remark = "交易发起方式")
    private String f60f11f5;
    @IsoFieldMeta(domainNo = 6, fixed = true, length = 1, remark = "交易介质")
    private String f60f11f6;
    @IsoFieldMeta(domainNo = 7, fixed = true, length = 1, remark = "IC 卡的应用类型")
    private String f60f11f7;
    @IsoFieldMeta(domainNo = 8, fixed = true, length = 2, remark = "账户结算类型")
    private String f60f11f8;
    @IsoFieldMeta(domainNo = 9, fixed = true, length = 1, remark = "卡账户等级")
    private String f60f11f9;
    @IsoFieldMeta(domainNo = 10, fixed = true, length = 2, remark = "卡产品")
    private String f60f11f10;
   
    // getter setter
}

银联59域usage=QR子域中,第3域为分页子域:

public interface Field59 {
}

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F59", usage = "QR", remark = "银联8583 59域usage=QR")
public class Field59$QR implements Field59 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 3, remark = "卡账户货币代码")
    private String currencyCode;
    @IsoFieldMeta(domainNo = 2, fixed = true, length = 3, remark = "所有满足查询条件的记录数")
    private Integer counts;
    @IsoFieldMeta(domainNo = 3, fixed = false, length = 50, maxLength = 5000, remark = "查询结果", pageSizeName = "counts", existSubdomain = true, subdomainType = PAGE)
    private List<F59QRPage> elements;
    
    // getter setter
}

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F59@QR_F3", remark = "银联8583 59域usage=QR page")
public class Field59$QR_F3 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 3, remark = "明细顺序号")
    private Integer number;
    @IsoFieldMeta(domainNo = 2, fixed = true, length = 8, remark = "交易日期", pattern = "yyyyMMdd")
    private LocalDate transDate;
    @IsoFieldMeta(domainNo = 3, fixed = true, length = 3, remark = "交易货币代码")
    private String currencyCode;
    @IsoFieldMeta(domainNo = 4, fixed = true, length = 13, remark = "交易金额")
    private String transAmt;
    @IsoFieldMeta(domainNo = 5, fixed = true, length = 13, remark = "余额")
    private String balanceAmt;
    @IsoFieldMeta(domainNo = 6, fixed = true, length = 10, remark = "备注代码")
    private String memoCode;

    // getter setter
}

银联121子域中,第6域为UV子域:

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F121", remark = "银联8583 121域")
public class Field121 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 1, remark = "应答原因码")
    private String f121f1;
    @IsoFieldMeta(domainNo = 2, fixed = true, length = 1, remark = "单/双或双/单转换码")
    private String f121f2;
    @IsoFieldMeta(domainNo = 3, fixed = true, length = 1, remark = "卡性质")
    private String f121f3;
    @IsoFieldMeta(domainNo = 4, fixed = true, length = 40, remark = "CUPS保留")
    private String f121f4;
    @IsoFieldMeta(domainNo = 5, fixed = true, length = 38, remark = "转入和转出方标识代码/手续费信息", existSubdomain = true, subdomainType = UV)
    private UsageSubdomain<Field121_F5> f121f5;

    // getter setter
}

public interface Field121_F5 {
}

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F121_F5", usage = "FD", remark = "银联8583 121.5域usage=FD")
public class Field121_F5$FD implements Field121_F5 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 36, remark = "手续费信息")
    private String f121f5f1;

    // getter setter
}

@MessageMeta(type = iso, group = "cups", code = "common", kind = subPayload, domain = "F121_F5", usage = "ID", remark = "银联8583 121.5域usage=ID")
public class Field121_F5$ID implements Field121_F5 {

    @IsoFieldMeta(domainNo = 1, fixed = true, length = 8, remark = "转出方标识代码")
    private String f121f5f1;
    @IsoFieldMeta(domainNo = 2, fixed = true, length = 8, remark = "转入方标识代码")
    private String f121f5f2;
    @IsoFieldMeta(domainNo = 3, fixed = true, length = 20, remark = "其余")
    private String f121f5f3;

    // getter setter
}