├── AField.java ├── ASCIIField.java ├── ASCIIGroupField.java ├── ArrayUtil.java ├── BCDField.java ├── BCDGroupField.java ├── BinaryField.java ├── BinaryGroupField.java ├── Des.java ├── EFTMessage.java ├── Encrypt.java ├── EncryptionMachineUtil.java ├── GroupField.java ├── ISO8583Message.java ├── ISO8583Parser.java ├── ISO8583Util.java ├── MessageStructure.java ├── MutableASCIIField.java ├── MutableBCDField.java ├── MutableBinaryField.java ├── MutableField.java └── README.md /AField.java: -------------------------------------------------------------------------------- 1 | 2 | import java.io.InputStream; 3 | import java.io.OutputStream; 4 | import java.lang.reflect.Field; 5 | import java.util.List; 6 | 7 | 8 | /** 9 | * @brief 10 | *
11 | * 字段抽象类 12 | *
13 | * 14 | * iso域抽象 15 | * 16 | *17 | *
18 | * @author wangl 19 | * @see 20 | * @since 2007-9-6 21 | */ 22 | 23 | public abstract class AField { 24 | 25 | /** 26 | *bit
所在位
27 | */
28 | protected int bit;
29 |
30 | protected String fieldName; /* 域名 */
31 |
32 | protected int length; /* 数据域长度 */
33 |
34 | protected boolean required; /* 是否可选 */
35 |
36 | /**
37 | * msgAttributeName
对应的Message对象的属性值
38 | */
39 | protected String msgAttributeName;
40 |
41 | protected boolean isMac;
42 |
43 | /**
44 | * align
对齐方式
45 | */
46 | protected int align;
47 | /**
48 | * bcd类型字段数据是否为压缩式
49 | */
50 | protected boolean isCompressed = true;
51 |
52 | protected AField(int bit, String data_name, int length, boolean optional,
53 | String msgAttributeName,boolean isMac) {
54 | this(bit,data_name,length,optional,msgAttributeName,ISO8583Util.SUFFIX,isMac);
55 | }
56 |
57 | protected AField(int bit, String data_name, int length, boolean optional,String msgAttributeName, int align,boolean isMac) {
58 | this.bit = bit;
59 | this.fieldName = data_name;
60 | this.length = length;
61 | this.required = optional;
62 | this.msgAttributeName = msgAttributeName;
63 | this.align = align;
64 | this.isMac = isMac;
65 | }
66 |
67 | public int getBit() {
68 | return bit;
69 | }
70 |
71 | public String getFieldName() {
72 | return fieldName;
73 | }
74 |
75 | public int getLength() {
76 | return length;
77 | }
78 |
79 | public boolean isRequired() {
80 | return required;
81 | }
82 |
83 | public String getMsgAttributeName() {
84 | return msgAttributeName;
85 | }
86 |
87 | public int getAlign() {
88 | return align;
89 | }
90 |
91 |
92 |
93 | public boolean isMac() {
94 | return isMac;
95 | }
96 |
97 | public void setMac(boolean isMac) {
98 | this.isMac = isMac;
99 | }
100 |
101 | /**
102 | * @brief 封包过程
103 | *
104 | * @param msg
105 | * 需要封包的金融消息
106 | * @param out
107 | * 要输出的打包后的流
108 | * @return
109 | */
110 | abstract public boolean pack(EFTMessage msg, OutputStream out,List29 | * 字符字段的处理 30 | *
31 | * 32 | * 字符域 33 | * 34 | * @author wangl 35 | * @see 36 | * @since 2007-9-6 37 | */ 38 | 39 | public class ASCIIField extends AField { 40 | 41 | private static final char STUFF = ' '; 42 | private static final char STUFF0 = '0'; 43 | 44 | public ASCIIField(int bit, String data_name, int length, boolean optional,String msgAttributeName,boolean isMac) { 45 | this(bit, data_name, length, optional, msgAttributeName,ISO8583Util.SUFFIX,isMac); 46 | // TODO 自动生成构造函数存根 47 | } 48 | 49 | public ASCIIField(int bit, String data_name, int length, boolean optional,String msgAttributeName,int align,boolean isMac) { 50 | super(bit, data_name, length, optional, msgAttributeName,align,isMac); 51 | // TODO 自动生成构造函数存根 52 | } 53 | 54 | public boolean pack(EFTMessage msg, OutputStream out,List字符组字段处理
24 | * 25 | * 处理字符组字段 26 | * 27 | * @author wangl 28 | * @version eJPos SDK1.0 29 | * @see 30 | * @since 2007-11-9 31 | */ 32 | public class ASCIIGroupField extends GroupField { 33 | 34 | public ASCIIGroupField(int bit, int length, int wide, AField[] fields,boolean isMac) { 35 | super(bit, length, wide, fields,isMac); 36 | // TODO 自动生成构造函数存根 37 | } 38 | 39 | 40 | public void unpack(InputStream in, EFTMessage msg,StringBuffer retLog) { 41 | readLengthValue(in); 42 | AField[] fields = getFields(); 43 | 44 | byte[] b = new byte[this.length]; 45 | try { 46 | in.read(b); 47 | } catch (IOException e) { 48 | // TODO 自动生成 catch 块 49 | e.printStackTrace(); 50 | } 51 | ByteArrayInputStream inInner = new ByteArrayInputStream(b); 52 | for (int i = 0; i < fields.length; i++) { 53 | AField f = fields[i]; 54 | f.unpack(inInner, msg,retLog); 55 | } 56 | } 57 | 58 | 59 | } 60 | -------------------------------------------------------------------------------- /ArrayUtil.java: -------------------------------------------------------------------------------- 1 | 2 | import java.io.ByteArrayOutputStream; 3 | import java.util.Random; 4 | 5 | /** 6 | *7 | * 数据转换器 8 | *
9 | * 10 | * 将各种数据互相转换 11 | * 12 | *13 | *
14 | * 15 | */ 16 | public class ArrayUtil { 17 | int i; 18 | 19 | /** 20 | * 检查传入数据的最后一个字节是否是正确的校验位 21 | * 22 | * @param data 23 | * 进行校验的数组 24 | * @return 校验是否正确 25 | * @throws null 26 | */ 27 | public static boolean isCheckRight(byte[] data) { 28 | // 现在由于同本地接口有问题,暂不实现 29 | return true; 30 | } 31 | 32 | /** 33 | * 在传入的数组后加上校验位 34 | * 35 | * @param data 36 | * 传入的数组 37 | * @return 加入校验位的数组 38 | * @throws null 39 | */ 40 | public static byte[] checkSum(byte[] data) { 41 | byte[] ret = new byte[data.length + 1]; 42 | System.arraycopy(data, 0, ret, 0, data.length); 43 | ret[data.length] = checkSum(data, data.length); 44 | return ret; 45 | } 46 | 47 | /** 48 | * 取得奇偶校验位 49 | * 50 | * @param data 51 | * @return 52 | */ 53 | public static byte getParityBit(byte[] data, int length) { 54 | return checkSum(data, length); 55 | } 56 | 57 | /** 58 | * 测试剪切数组的一部分。 59 | * 60 | * @param null 61 | * @return null 62 | * @throws null 63 | */ 64 | public static void testCutArray() { 65 | byte[] test = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 66 | byte[] a; 67 | int offset = 0; 68 | int maxLength = test.length; 69 | for (; offset < maxLength; offset++) { 70 | int length = 0; 71 | for (; offset + length <= maxLength; length++) { 72 | a = cutArray(test, offset, length); 73 | list(a, "contents"); 74 | } 75 | } 76 | } 77 | 78 | /** 79 | * 指定偏移量处的两个字节组成整数。 80 | * 81 | * @param datas 82 | * 进行转换的缓冲 83 | * @param offset 84 | * 缓冲的偏移点 85 | * @return 转换后的int型 86 | * @throws null 87 | */ 88 | public static int TwoByteToInt(byte[] datas, int offset) { 89 | int i1 = datas[offset], i2 = datas[offset + 1]; 90 | if (i1 < 0) 91 | i1 += 256; 92 | i1 = i1 << 8; 93 | if (i2 < 0) 94 | i2 += 256; 95 | return i1 + i2; 96 | } 97 | 98 | /** 99 | * 把字节数组指定偏移处的连续四个字节组成整数,对于单个字节,没有符号。 100 | * 101 | * @param datas 102 | * 进行转换的缓冲 103 | * @param offset 104 | * 缓冲的偏移点 105 | * @return 转换后的int型 106 | * @throws null 107 | */ 108 | public static int ByteArrayToInt(byte[] datas, int offset) { 109 | int i1 = datas[offset], i2 = datas[offset + 1], i3 = datas[offset + 2], i4 = datas[offset + 3]; 110 | if (i1 < 0) 111 | i1 += 256; 112 | i1 = i1 << 24; 113 | if (i2 < 0) 114 | i2 += 256; 115 | i2 = i2 << 16; 116 | if (i3 < 0) 117 | i3 += 256; 118 | i3 = i3 << 8; 119 | if (i4 < 0) 120 | i4 += 256; 121 | return (i1 + i2 + i3 + i4); 122 | } 123 | 124 | /** 125 | * 4个字节组成的日期,由于可预见的日期不可能造成符号问题。所以单独列出来。 126 | * 127 | * @param datas 128 | * 进行转换的缓冲 129 | * @param offset 130 | * 缓冲的偏移点 131 | * @return 转换后的int型 132 | * @throws null 133 | */ 134 | public static int ByteArrayToBCDDate(byte[] datas, int offset) { 135 | return ByteArrayToInt(datas, offset); 136 | } 137 | 138 | /** 139 | * 将指定的一个字节转化为无符号int 140 | * 141 | * @param datas 142 | * 进行转换的缓冲 143 | * @param offset 144 | * 缓冲的偏移点 145 | * @return 转换后的int型 146 | * @throws null 147 | */ 148 | public static int oneByteToUnsignedInt(byte[] datas, int offset) { 149 | int i3 = datas[offset]; 150 | if (i3 < 0) { 151 | i3 += 256; 152 | } 153 | return i3; 154 | } 155 | 156 | /** 157 | * 158 | * 把字节数组指定偏移处的连续两个字节组成short,对于单个字节,没有符号。 159 | * 160 | * @param datas 161 | * 进行转换的缓冲 162 | * @param offset 163 | * 缓冲的偏移点 164 | * @return 转换后的short型 165 | * @throws null 166 | */ 167 | public static short ByteArrayToShort(byte[] datas, int offset) { 168 | int i3 = datas[offset], i4 = datas[offset + 1]; 169 | if (i3 < 0) 170 | i3 += 256; 171 | i3 = i3 << 8; 172 | if (i4 < 0) 173 | i4 += 256; 174 | return (short) (i3 + i4); 175 | } 176 | 177 | /** 178 | * 将指定偏移处的两个字节转化为int 179 | * 180 | * @param datas 181 | * 进行转换的缓冲 182 | * @param offset 183 | * 缓冲的偏移点 184 | * @return 转换后的int型 185 | * @throws null 186 | */ 187 | public static int ByteArrayToUnsignedShort(byte[] datas, int offset) { 188 | int i3 = datas[offset], i4 = datas[offset + 1]; 189 | if (i3 < 0) 190 | i3 += 256; 191 | i3 = i3 << 8; 192 | if (i4 < 0) 193 | i4 += 256; 194 | return (i3 + i4); 195 | } 196 | 197 | /** 198 | * 199 | * 把整数转换成字节数组中指定偏移量处的连续四个字节。没有符号限制。 200 | * 201 | * @param num 202 | * 进行转换int类型 203 | * @param datas 204 | * 转换后放入的缓冲 205 | * @param offset 206 | * 缓冲的偏移点 207 | * @return null 208 | * @throws null 209 | */ 210 | public static void IntToByteArray(int num, byte[] datas, int offset) { 211 | datas[offset] = (byte) (num >> 24); 212 | datas[offset + 1] = (byte) (num >> 16); 213 | datas[offset + 2] = (byte) (num >> 8); 214 | datas[offset + 3] = (byte) (num); 215 | } 216 | 217 | /** 218 | * 把short整数转换成字节数组中指定偏移量处的连续2个字节。没有符号限制。 219 | * 220 | * @param num 221 | * 进行转换short类型 222 | * @param datas 223 | * 转换后放入的缓冲 224 | * @param offset 225 | * 缓冲的偏移点 226 | * @return null 227 | * @throws null 228 | */ 229 | public static void ShortToByteArray(short num, byte[] datas, int offset) { 230 | datas[offset] = (byte) (num >> 8); 231 | datas[offset + 1] = (byte) (num); 232 | } 233 | 234 | /** 235 | * 把long整数转换成字节数组中指定偏移量处的连续4个字节。没有符号限制。 236 | * 237 | * @param num 238 | * 进行转换long类型 239 | * @param datas 240 | * 转换后放入的缓冲 241 | * @param offset 242 | * 缓冲的偏移点 243 | * @return null 244 | * @throws null 245 | */ 246 | public static void LongToByteArray(long num, byte[] datas, int offset) { 247 | IntToByteArray((int) (num >> 32), datas, offset); 248 | IntToByteArray((int) num, datas, offset + 4); 249 | } 250 | 251 | /** 252 | * 比较两个字节数组在指定偏移位置上,制定长度范围内是否一样。 253 | * 254 | * 鉴于使用的地方都是判断是否相等,而且在税控盒中得到第一个不等的位置没有意义,所以把返回值更改为相等返回0,不等返回-1 255 | * 256 | * @param src 257 | * 源缓冲 258 | * @param srcoffset 259 | * 源缓冲的偏移 260 | * @param des 261 | * 目的缓冲 262 | * @param dstoffset 263 | * 目的缓冲的偏移 264 | * @param length 265 | * 比较的数据长度 266 | * @return 返回 0 说明一致,否则返回-1 267 | * @throws null 268 | */ 269 | public static int ByteArrayCmp(byte[] src, int srcoffset, byte[] dst, 270 | int dstoffset, int length) { 271 | if (src == null || dst == null) 272 | return -1; 273 | if (srcoffset + length > src.length) 274 | return -1; 275 | if (dstoffset + length > dst.length) 276 | return -1; 277 | int looper; 278 | for (looper = 0; looper < length; looper++) { 279 | if (src[srcoffset + looper] != dst[dstoffset + looper]) 280 | return -1; 281 | } 282 | return 0; 283 | } 284 | 285 | /** 286 | * 比较两个无符号字节数组,指定长度范围内是否一样。相当于C中的 memcmp 287 | * 288 | * @param src 289 | * 源缓冲 290 | * @param des 291 | * 目的缓冲 292 | * @param length 293 | * 比较的数据长度 294 | * @return 返回 0 说明一致, > 0 说明src 大于 des < 0 说明src 濒于 des 295 | * @throws null 296 | */ 297 | 298 | public static int ByteArrayCmp(byte[] src, byte[] dst, int length) { 299 | 300 | if (src == null || dst == null) 301 | 302 | return -1; 303 | 304 | int looper; 305 | int source, target; 306 | 307 | for (looper = 0; looper < length; looper++) { 308 | 309 | source = src[looper]; 310 | target = dst[looper]; 311 | source &= 0xff; 312 | target &= 0xff; 313 | 314 | if (source > target) 315 | return 1; 316 | else if (source < target) 317 | return -1; 318 | 319 | } 320 | 321 | return 0; 322 | 323 | } 324 | 325 | public static void ZeroByteArray(byte[] datas, int offset, int length) { 326 | for (int looper = 0; looper < length; looper++) 327 | datas[offset + looper] = 0x0; 328 | } 329 | 330 | /** 331 | * 显示一个数组的内容 用16进制显示,无符号 332 | * 333 | * @param src 334 | * 进行显示的数组 335 | * @param name 336 | * 显示名称 337 | * @return null 338 | * @throws null 339 | */ 340 | public static void list(byte[] src, String name) { 341 | // TODO 342 | } 343 | 344 | /** 345 | * 将源数组中的指定offset开始的length个字节去掉,返回新的数组 346 | * 347 | * @param source 348 | * 数据缓冲 349 | * @param offset 350 | * 缓冲偏移 351 | * @param length 352 | * 处理数据长度 353 | * @return 处理后的数组 354 | * @throws null 355 | */ 356 | public static byte[] cutArray(byte[] source, int offset, int length) { 357 | // 测试参数 358 | if (length == 0) { 359 | byte[] ret = new byte[source.length]; 360 | System.arraycopy(source, 0, ret, 0, source.length); 361 | return ret; 362 | } 363 | int i = source[offset] + source[length - 1] 364 | + source[offset + length - 1]; 365 | int l = source.length; 366 | byte[] ret = new byte[l - length]; 367 | System.arraycopy(source, 0, ret, 0, offset); // 拷贝前offset个字节,测试offset为0的情况! 368 | if ((offset + length) <= l - 1) { 369 | System.arraycopy(source, offset + length, ret, offset, l - length 370 | - offset); // 拷贝余下的字符 371 | } 372 | return ret; 373 | } 374 | 375 | /** 376 | * HEX编码 将形如0x12 0x2A 0x01 转换为122A01 377 | * @param data 378 | * @return 379 | */ 380 | public static String hexEncode(byte[] data) { 381 | StringBuffer buffer = new StringBuffer(); 382 | for (int i = 0; i < data.length; i++) { 383 | String tmp = Integer.toHexString(data[i]&0xff); 384 | if (tmp.length() < 2) { 385 | buffer.append('0'); 386 | } 387 | buffer.append(tmp); 388 | } 389 | String retStr = buffer.toString().toUpperCase(); 390 | return retStr; 391 | } 392 | 393 | /** 394 | * HEX解码 将形如122A01 转换为0x12 0x2A 0x01 395 | * @param data 396 | * @return 397 | */ 398 | public static byte[] hexDecode(String data) { 399 | ByteArrayOutputStream out = new ByteArrayOutputStream(); 400 | for (int i = 0; i < data.length(); i+=2) { 401 | String onebyte = data.substring(i,i+2); 402 | int b = Integer.parseInt(onebyte,16) & 0xff; 403 | out.write(b); 404 | } 405 | return out.toByteArray(); 406 | } 407 | 408 | /** 409 | * 判断给定的数组是否全为给定的字节 410 | * 411 | * @param src 412 | * 进行比较的缓冲 413 | * @param toCompare 414 | * 进行比较的字符 415 | * @return true: 全是 false:不是 416 | * @throws null 417 | */ 418 | public static boolean ifArrayEqual(byte[] src, byte toCompare) { 419 | for (int i = 0; i < src.length; i++) { 420 | if (src[i] != toCompare) { 421 | return false; 422 | } 423 | } 424 | return true; 425 | } 426 | 427 | /** 428 | * 判断给定数组的指定范围内数据是否等于给定的字节 429 | * 430 | * @param src 431 | * 进行比较的缓冲 432 | * @param offset 433 | * 缓冲偏移 434 | * @param length 435 | * 比较长度 436 | * @param toCompare 437 | * 进行比较的字符 438 | * @return 是否相同 439 | * @throws null 440 | */ 441 | public static boolean ifArrayEqual(byte[] src, int offset, int length, 442 | byte toCompare) { 443 | for (int i = 0; i < length; i++) { 444 | if (src[offset + i] != toCompare) { 445 | return false; 446 | } 447 | } 448 | return true; 449 | } 450 | 451 | // /** 452 | // * 将Unicode码转换成byte数组 453 | // * 454 | // * @param chineseName 要进行转换的文件名称 455 | // * @return 转换后的byte数组 456 | // * @throws null 457 | // */ 458 | // public static byte[] UnicodeToByteArray(String chineseName) { 459 | // return Native.UnicodeToByteArray(chineseName); 460 | // } 461 | // /** 462 | // * 将传入的字节数组转化为最大行字节数j的多个字符串数组 463 | // * 464 | // * @param electronicSign 465 | // * 进行转换的数据缓冲 466 | // * @param j 467 | // * 转换后的每个数组最大字符个数 468 | // * @return 转换后的数组 469 | // * @throws null 470 | // */ 471 | // public static String[] toMultipleString(byte[] electronicSign, int j) { 472 | // int totalLength = electronicSign.length; 473 | // int completeRow = totalLength / j; // 整行的行数 474 | // int left = totalLength % j; // 余下不足一行的字节数 475 | // int totalRow = completeRow; 476 | // if (left != 0) { 477 | // totalRow++; 478 | // } 479 | // if (totalRow == 0) { 480 | // return new String[0]; 481 | // } 482 | // String[] ret = new String[totalRow]; 483 | // for (int i = 0; i < completeRow; i++) { 484 | // ret[i] = ArrayUtil.byteArrayToStringWithSpace(electronicSign, 485 | // i * j, j); 486 | // } 487 | // if (left != 0) { 488 | // ret[completeRow] = ArrayUtil.byteArrayToStringWithSpace( 489 | // electronicSign, completeRow * j, left); 490 | // } 491 | // return ret; 492 | // } 493 | 494 | /** 495 | * 将两个字节数组合并为新的字节数组 496 | * 497 | * @param bs 498 | * 进行合并的数组1 499 | * @param bs2 500 | * 进行合并的数组2 501 | * @return 合并后的数组 502 | * @throws null 503 | */ 504 | public static byte[] merg(byte[] bs, byte[] bs2) { 505 | byte[] ret = new byte[bs.length + bs2.length]; 506 | System.arraycopy(bs, 0, ret, 0, bs.length); 507 | System.arraycopy(bs2, 0, ret, bs.length, bs2.length); 508 | return ret; 509 | } 510 | 511 | /** 512 | * 将src数组的数转化为BCD码数组des.des的长度是src的一半.且src必须为偶数个数 比如123456转化为0x123456; 513 | * 514 | * @param src 515 | * 进行转换的数组 516 | * @return 转换后的BCD码数组 517 | * @throws null 518 | * 519 | */ 520 | public static byte[] getBCDArray(byte[] src) { 521 | if (src.length % 2 != 0) 522 | throw new IllegalArgumentException("the length of src is wrong:" 523 | + src.length); 524 | int desLength = src.length / 2; 525 | byte[] des = new byte[desLength]; 526 | for (int i = 0; i < desLength; i++) { 527 | des[i] = (byte) (src[2 * i] << 4 | src[2 * i + 1]); 528 | } 529 | return des; 530 | } 531 | 532 | /** 533 | * 构造bcd形式的字节数组,如"123456"会转化为一个字节数组,0x12,0x34,0x56 534 | * 535 | * @param pin 536 | * 进行转换的数组 537 | * @return 转换后的BCD数组 538 | * @throws null 539 | */ 540 | public static byte[] createBCDByteArray(String pin) { 541 | if (pin.length() % 2 == 1) { 542 | pin = "0" + pin; 543 | } 544 | byte[] pinArray = pin.getBytes(); 545 | for (int i = 0; i < pinArray.length; i++) { 546 | pinArray[i] -= '0'; 547 | } 548 | byte[] bcdPin = ArrayUtil.getBCDArray(pinArray); 549 | return bcdPin; 550 | } 551 | 552 | /** 553 | * @brief 将两个压缩式BCD码转换为int 554 | * 555 | * @param a 556 | * @param b 557 | * @return 558 | */ 559 | public static int BCD2Integer(byte a, byte b) { 560 | return (((a >> 4) & 0x0f) * 1000) + (((a) & 0x0f) * 100) 561 | + (((b >> 4) & 0x0f) * 10) + ((b) & 0x0f); 562 | } 563 | 564 | /** 565 | * 将压缩式BCD数组转换为int 566 | * 567 | * @param b 568 | * @return 569 | */ 570 | public static int BCDArray2Integer(byte[] b) { 571 | int wei = b.length * 2 - 1; 572 | int ret = 0; 573 | for (int i = 0; i < b.length; i++) { 574 | int jie = 1; 575 | for (int j = 0; j < wei - 1; j++) { 576 | jie *= 10; 577 | } 578 | ret += (((b[i]>> 4) & 0x0f) * jie *10) + (((b[i]) & 0x0f) * (jie)); 579 | wei -= 2; 580 | } 581 | return ret; 582 | } 583 | 584 | /** 585 | * 将int转换为压缩式BCD数组 586 | * 587 | */ 588 | public static byte[] Integer2BCDArray(int i,int retLength) { 589 | StringBuffer buffer = new StringBuffer(); 590 | buffer.append(i); 591 | int tmp = retLength * 2; 592 | while (buffer.length() < tmp) { 593 | buffer.insert(0,'0'); 594 | } 595 | 596 | return createBCDByteArray(buffer.toString()); 597 | } 598 | 599 | /** 600 | * 601 | * @brief 返回源数组的clone 602 | * 603 | * @param src 604 | * @return 605 | */ 606 | public static byte[] cloneBytes(byte[] src) { 607 | byte[] ret = new byte[src.length]; 608 | System.arraycopy(src, 0, ret, 0, src.length); 609 | return ret; 610 | } 611 | 612 | // private static native String GBByteArrayToUnicodeString(byte[] datas,int 613 | // offset, int length); 614 | public static byte checkSum(byte[] data, int length) { 615 | byte sumBit = 0; 616 | for (int i = 0; i < length; i++) { 617 | sumBit ^= data[i]; 618 | } 619 | return sumBit; 620 | } 621 | 622 | /** 623 | * 624 | * @brief 在传入的数组中填充上随机数 625 | * 626 | * @param toFill 627 | */ 628 | public static void fillWithRandom(byte[] toFill) { 629 | Random random = new Random(); 630 | for (int i = 0; i < toFill.length; i++) { 631 | toFill[i] = (byte) random.nextInt(); 632 | } 633 | } 634 | } 635 | -------------------------------------------------------------------------------- /BCDField.java: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * $Log: BCDField.java,v $ 4 | * Revision 1.4 2007/11/29 08:27:49 wangl 5 | * ISO8583解析错误修改 6 | * 7 | * Revision 1.3 2007/11/29 08:04:08 wangl 8 | * ISO8583解析错误修改 9 | * 10 | * Revision 1.2 2007/11/13 06:36:54 wangl 11 | * 同步代码 12 | * 13 | * Revision 1.5 2007/11/09 07:10:49 wangl 14 | * 加入适当的注释 15 | * 16 | * Revision 1.4 2007/11/09 02:40:14 wangl 17 | * 修改BCDGroupField处理方式 18 | * 19 | * Revision 1.3 2007/11/08 07:13:58 wangl 20 | * 修改错误 21 | * 22 | * Revision 1.2 2007/11/06 09:26:48 wangl 23 | * 修改对齐方式写错的地方 24 | * 25 | * Revision 1.1 2007/11/02 07:16:55 wangl 26 | * 添加新的重构後的代码 27 | * 28 | */ 29 | 30 | 31 | import java.io.IOException; 32 | import java.io.InputStream; 33 | import java.io.OutputStream; 34 | import java.util.List; 35 | 36 | 37 | 38 | /** 39 | * @brief 40 | *41 | * 定长BCD类型的数字字段的处理 42 | *
43 | * 44 | * 数字型域(0-9) 45 | * 46 | * @author wangl 47 | * @see 48 | * @since 2007-9-6 49 | */ 50 | 51 | public class BCDField extends AField { 52 | /** 53 | * 补齐数字 54 | */ 55 | private static final char STUFF = '0'; 56 | 57 | /** 58 | * 59 | * 60 | * 61 | * 基本构造方法 62 | * 63 | * @param bit 64 | * @param data_name 65 | * @param length 66 | * @param optional 67 | * @param msgAttributeName 68 | */ 69 | public BCDField(int bit, String data_name, int length, boolean optional, 70 | String msgAttributeName,boolean isMac) { 71 | this(bit, data_name, length, optional, msgAttributeName, 72 | ISO8583Util.PREFIX,isMac); 73 | 74 | } 75 | 76 | /** 77 | * 78 | * 79 | * 是否压缩式BCD字段构造方法 80 | * 81 | * @param bit 82 | * @param data_name 83 | * @param length 84 | * @param optional 85 | * @param msgAttributeName 86 | * @param isCompressed 87 | */ 88 | public BCDField(int bit, String data_name, int length, boolean optional, 89 | String msgAttributeName, int align, boolean isCompressed,boolean isMac) { 90 | super(bit, data_name, length, optional, msgAttributeName, align, isMac); 91 | this.isCompressed = isCompressed; 92 | } 93 | 94 | /** 95 | * 96 | * 97 | * 对齐方式构造方法 98 | * 99 | * @param bit 100 | * @param data_name 101 | * @param length 102 | * @param optional 103 | * @param msgAttributeName 104 | * @param align 105 | */ 106 | public BCDField(int bit, String data_name, int length, boolean optional, 107 | String msgAttributeName, int align,boolean isMac) { 108 | super(bit, data_name, length, optional, msgAttributeName, align,isMac); 109 | } 110 | 111 | 112 | public boolean pack(EFTMessage msg, OutputStream out,ListBCD类型的数字字段数组的处理
32 | * 33 | * BCD类型的数字字段数组的处理 34 | * 35 | * @author wangl 36 | * @version eJPos SDK1.0 37 | * @see 38 | * @since 2007-11-9 39 | */ 40 | public class BCDGroupField extends GroupField { 41 | 42 | public BCDGroupField(int bit, int length, int wide, AField[] fields,boolean isMac) { 43 | super(bit, length, wide, fields,isMac); 44 | // TODO 自动生成构造函数存根 45 | } 46 | 47 | 48 | public void unpack(InputStream in, EFTMessage msg,StringBuffer retLog) { 49 | readLengthValue(in); 50 | AField[] fields = getFields(); 51 | 52 | byte[] b = new byte[this.lengthInByte]; 53 | try { 54 | in.read(b); 55 | } catch (IOException e) { 56 | // TODO 自动生成 catch 块 57 | e.printStackTrace(); 58 | } 59 | byte[] notCompressedByteArray = ISO8583Util.getNotCompressedBCDArray(b); 60 | ByteArrayInputStream inInner = new ByteArrayInputStream(notCompressedByteArray); 61 | for (int i = 0; i < fields.length; i++) { 62 | AField f = fields[i]; 63 | f.isCompressed = false; 64 | f.unpack(inInner, msg,retLog); 65 | } 66 | } 67 | 68 | 69 | public boolean pack(EFTMessage msg, OutputStream out,List25 | * 二进制域 26 | *
27 | * 28 | * 二进制域 29 | * 30 | *31 | *
32 | * @author wangl 33 | * @version eJPos SDK1.0 34 | * @see 35 | * @since 2007-9-18 36 | */ 37 | 38 | public class BinaryField extends AField { 39 | 40 | private static final byte STUFF = (byte)0x00; 41 | 42 | public BinaryField(int bit, String data_name, int length, boolean optional, 43 | String msgAttributeName,boolean isMac) { 44 | this(bit, data_name, length, optional, msgAttributeName,ISO8583Util.SUFFIX,isMac); 45 | } 46 | 47 | public BinaryField(int bit, String data_name, int length, boolean optional, 48 | String msgAttributeName, int align,boolean isMac) { 49 | super(bit, data_name, length, optional, msgAttributeName, align,isMac); 50 | } 51 | 52 | 53 | public boolean pack(EFTMessage msg, OutputStream out,List二进制直接字段数组处理
21 | * 22 | * 二进制直接字段数组处理 23 | * @author wangl 24 | * @version eJPos SDK1.0 25 | * @see 26 | * @since 2007-11-9 27 | */ 28 | public class BinaryGroupField extends GroupField { 29 | 30 | public BinaryGroupField(int bit, int length, int wide, AField[] fields,boolean isMac) { 31 | super(bit, length, wide, fields,isMac); 32 | // TODO 自动生成构造函数存根 33 | } 34 | 35 | 36 | public void unpack(InputStream in, EFTMessage msg,StringBuffer retLog) { 37 | readLengthValue(in); 38 | AField[] fields = getFields(); 39 | 40 | byte[] b = new byte[this.length]; 41 | try { 42 | in.read(b); 43 | } catch (IOException e) { 44 | // TODO 自动生成 catch 块 45 | e.printStackTrace(); 46 | } 47 | ByteArrayInputStream inInner = new ByteArrayInputStream(b); 48 | for (int i = 0; i < fields.length; i++) { 49 | AField f = fields[i]; 50 | f.unpack(inInner, msg,retLog); 51 | } 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /Des.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 1997 by The Open Group, Cambridge, MA, USA. All Rights 3 | * Reserved. 4 | * 5 | * This software is being provided to you, the LICENSEE, by The Open Group 6 | * (T.O.G.) under the following license. By obtaining, using and/or 7 | * copying this software, you agree that you have read, understood, and 8 | * will comply with these terms and conditions: 9 | * 10 | * Export of this software from the United States of America may 11 | * require a specific license from the United States Government. 12 | * It is the responsibility of any person or organization contemplating 13 | * export to obtain such a license before exporting. 14 | * 15 | * WITHIN THAT CONSTRAINT, permission to use, copy, modify and distribute 16 | * this software and its documentation for any purpose and without fee or 17 | * royalty is hereby granted, provided that you agree to comply with the 18 | * following copyright notice and statements, including the disclaimer, and 19 | * that the same appear on ALL copies of the software and documentation, 20 | * including modifications that you make for internal use or for 21 | * distribution: 22 | * 23 | * THIS SOFTWARE IS PROVIDED "AS IS", AND T.O.G. MAKES NO REPRESENTATIONS 24 | * OR WARRANTIES, EXPRESS OR IMPLIED. By way of example, but not 25 | * limitation, T.O.G. MAKES NO REPRESENTATIONS OR WARRANTIES OF 26 | * MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF 27 | * THE LICENSED SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY 28 | * PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. 29 | * 30 | * The name of The Open Group, or T.O.G., or TOG may NOT be used in 31 | * advertising or publicity pertaining to distribution of the software. 32 | * Title to copyright in this software and any associated documentation 33 | * shall at all times remain with T.O.G., and USER agrees to preserve same. 34 | */ 35 | 36 | package com.zj.qcup.util.iso8583; 37 | 38 | /** 39 | * Provides des algorithm 40 | */ 41 | class Des { 42 | 43 | /** 44 | * Defines the initial permutation 45 | */ 46 | private static final byte[] initial_permutation = { 47 | 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 48 | 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 49 | 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 50 | 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 51 | }; 52 | 53 | /** 54 | * Defines the final permutation 55 | */ 56 | private static final byte[] final_permutation = { 57 | 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 58 | 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 59 | 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 60 | 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 61 | }; 62 | 63 | /** 64 | * Defines the key permutation 65 | */ 66 | private static final byte[] key_permutation = { 67 | 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 68 | 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 69 | 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 70 | 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 71 | }; 72 | 73 | /** 74 | * Defines the compression permutation 75 | */ 76 | private static final byte[] compression_permutation = { 77 | 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 78 | 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 79 | 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 80 | 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32 81 | }; 82 | 83 | /** 84 | * Defines the expansion permutation 85 | */ 86 | private static final byte[] expansion_permutation = { 87 | 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 88 | 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 89 | 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 90 | 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1 91 | }; 92 | 93 | /** 94 | * Defines the p_box permutation 95 | */ 96 | private static final byte[] p_box_permutation = { 97 | 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 98 | 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 99 | }; 100 | 101 | /** 102 | * Defines the rotation number 103 | */ 104 | private static final byte[] rot_num = { 105 | 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 106 | }; 107 | 108 | /** 109 | * Defines the chunk mask 110 | */ 111 | private static final long[] chunk_mask = { 112 | 0xfc00000000000000L, 113 | 0x03f0000000000000L, 114 | 0x000fc00000000000L, 115 | 0x00003f0000000000L, 116 | 0x000000fc00000000L, 117 | 0x00000003f0000000L, 118 | 0x000000000fc00000L, 119 | 0x00000000003f0000L 120 | }; 121 | 122 | /** 123 | * List of bad keys 124 | */ 125 | private static final long[] bad_keys = { 126 | 0x0101010101010101L, 0xfefefefefefefefeL, 127 | 0x1f1f1f1f1f1f1f1fL, 0xe0e0e0e0e0e0e0e0L, 128 | 0x01fe01fe01fe01feL, 0xfe01fe01fe01fe01L, 129 | 0x1fe01fe00ef10ef1L, 0xe01fe01ff10ef10eL, 130 | 0x01e001e001f101f1L, 0xe001e001f101f101L, 131 | 0x1ffe1ffe0efe0efeL, 0xfe1ffe1ffe0efe0eL, 132 | 0x011f011f010e010eL, 0x1f011f010e010e01L, 133 | 0xe0fee0fef1fef1feL, 0xfee0fee0fef1fef1L 134 | }; 135 | 136 | /** 137 | * List of good parity 138 | */ 139 | private static final byte[] good_parity = { 140 | 1, 1, 2, 2, 4, 4, 7, 7, 141 | 8, 8, 11, 11, 13, 13, 14, 14, 142 | 16, 16, 19, 19, 21, 21, 22, 22, 143 | 25, 25, 26, 26, 28, 28, 31, 31, 144 | 32, 32, 35, 35, 37, 37, 38, 38, 145 | 41, 41, 42, 42, 44, 44, 47, 47, 146 | 49, 49, 50, 50, 52, 52, 55, 55, 147 | 56, 56, 59, 59, 61, 61, 62, 62, 148 | 64, 64, 67, 67, 69, 69, 70, 70, 149 | 73, 73, 74, 74, 76, 76, 79, 79, 150 | 81, 81, 82, 82, 84, 84, 87, 87, 151 | 88, 88, 91, 91, 93, 93, 94, 94, 152 | 97, 97, 98, 98, 100, 100, 103, 103, 153 | 104, 104, 107, 107, 109, 109, 110, 110, 154 | 112, 112, 115, 115, 117, 117, 118, 118, 155 | 121, 121, 122, 122, 124, 124, 127, 127, 156 | (byte)128, (byte)128, (byte)131, (byte)131, 157 | (byte)133, (byte)133, (byte)134, (byte)134, 158 | (byte)137, (byte)137, (byte)138, (byte)138, 159 | (byte)140, (byte)140, (byte)143, (byte)143, 160 | (byte)145, (byte)145, (byte)146, (byte)146, 161 | (byte)148, (byte)148, (byte)151, (byte)151, 162 | (byte)152, (byte)152, (byte)155, (byte)155, 163 | (byte)157, (byte)157, (byte)158, (byte)158, 164 | (byte)161, (byte)161, (byte)162, (byte)162, 165 | (byte)164, (byte)164, (byte)167, (byte)167, 166 | (byte)168, (byte)168, (byte)171, (byte)171, 167 | (byte)173, (byte)173, (byte)174, (byte)174, 168 | (byte)176, (byte)176, (byte)179, (byte)179, 169 | (byte)181, (byte)181, (byte)182, (byte)182, 170 | (byte)185, (byte)185, (byte)186, (byte)186, 171 | (byte)188, (byte)188, (byte)191, (byte)191, 172 | (byte)193, (byte)193, (byte)194, (byte)194, 173 | (byte)196, (byte)196, (byte)199, (byte)199, 174 | (byte)200, (byte)200, (byte)203, (byte)203, 175 | (byte)205, (byte)205, (byte)206, (byte)206, 176 | (byte)208, (byte)208, (byte)211, (byte)211, 177 | (byte)213, (byte)213, (byte)214, (byte)214, 178 | (byte)217, (byte)217, (byte)218, (byte)218, 179 | (byte)220, (byte)220, (byte)223, (byte)223, 180 | (byte)224, (byte)224, (byte)227, (byte)227, 181 | (byte)229, (byte)229, (byte)230, (byte)230, 182 | (byte)233, (byte)233, (byte)234, (byte)234, 183 | (byte)236, (byte)236, (byte)239, (byte)239, 184 | (byte)241, (byte)241, (byte)242, (byte)242, 185 | (byte)244, (byte)244, (byte)247, (byte)247, 186 | (byte)248, (byte)248, (byte)251, (byte)251, 187 | (byte)253, (byte)253, (byte)254, (byte)254 188 | }; 189 | 190 | /** 191 | * List of sbox 192 | */ 193 | private static final byte [][] sbox = { 194 | { 195 | 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 196 | 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 197 | 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 198 | 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 199 | }, 200 | { 201 | 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 202 | 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 203 | 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 204 | 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 205 | }, 206 | { 207 | 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 208 | 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 209 | 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 210 | 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 211 | }, 212 | { 213 | 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 214 | 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 215 | 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 216 | 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 217 | }, 218 | { 219 | 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 220 | 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 221 | 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, 222 | 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 223 | }, 224 | { 225 | 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 226 | 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 227 | 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, 228 | 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 229 | }, 230 | { 231 | 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 232 | 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 233 | 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, 234 | 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 235 | }, 236 | { 237 | 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 238 | 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 239 | 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, 240 | 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 241 | } 242 | }; 243 | 244 | /** 245 | * Permutes des 246 | * 247 | * @return long is a result 248 | * @param p is of type byte[] 249 | * @param x is of type long 250 | */ 251 | public static final long permute_des(byte[] p, long x) { 252 | long y = 0; 253 | for (int i = 0; i < p.length; i++) { 254 | y |= ((x & (0x8000000000000000L >>> (p[i] - 1))) << (p[i] - 1)) >>> i; 255 | } 256 | return y; 257 | } 258 | 259 | /** 260 | * Checks parity 261 | * 262 | * @return boolean is a result 263 | * @param key is of type long 264 | */ 265 | public static final boolean check_parity(long key) { 266 | byte[] octet = long2octet(key); 267 | return check_parity(octet); 268 | } 269 | 270 | /** 271 | * Checks parity for a given key 272 | * 273 | * @return boolean is a result 274 | * @param key is of type byte[] 275 | */ 276 | public static final boolean check_parity(byte[] key) { 277 | for (int i=0; i < 8; i++) { 278 | if (key[i] != good_parity[key[i] & 0xff]) 279 | return false; 280 | } 281 | return true; 282 | } 283 | 284 | /** 285 | * Sets parity 286 | * 287 | * @return byte[] is a result 288 | * @param key is of type byte[] 289 | */ 290 | public static final byte[] set_parity(byte[] key) { 291 | for (int i=0; i < 8; i++) { 292 | key[i] = good_parity[key[i] & 0xff]; 293 | } 294 | return key; 295 | } 296 | 297 | /** 298 | * Sets parity for a given key 299 | * 300 | * @return long is a result 301 | * @param key is of type long 302 | */ 303 | public static final long set_parity(long key) { 304 | return octet2long(set_parity(long2octet(key))); 305 | } 306 | 307 | /** 308 | * Checks to see whether the given key is bad or not 309 | * 310 | * @return boolean is a result 311 | * @param key is of type long 312 | */ 313 | public static final boolean bad_key(long key) { 314 | for (int i = 0; i < bad_keys.length; i++) { 315 | if (bad_keys[i] == key) { 316 | return true; 317 | } 318 | } 319 | return false; 320 | } 321 | 322 | /** 323 | * Checks to see whether the given key is bad or not 324 | * 325 | * @return boolean is a result 326 | * @param key is of type byte[] 327 | */ 328 | public static final boolean bad_key(byte[] key) { 329 | return bad_key(octet2long(key)); 330 | } 331 | 332 | /** 333 | * Sets the des key 334 | * 335 | * @return boolean is a result 336 | * @param key is of type long 337 | * @param key_sched is of type long[] 338 | */ 339 | public static boolean des_set_key(long key, long[] key_sched) { 340 | long x = permute_des(key_permutation, key); 341 | for (int i = 0; i < 16; i++) { 342 | if (rot_num[i] == 1) 343 | x = (x & 0x7ffffff7ffffff00L) << 1 | 344 | (x & 0x8000000800000000L) >>> 27; 345 | else 346 | x = (x & 0x3ffffff3ffffff00L) << 2 | 347 | (x & 0xc000000c00000000L) >>> 26; 348 | key_sched[i] = permute_des(compression_permutation, x); 349 | } 350 | return check_parity(key); 351 | } 352 | 353 | /** 354 | * Sets the des key 355 | * 356 | * @return boolean is a result 357 | * @param key is of type byte[] 358 | * @param key_sched is of type long[] 359 | */ 360 | public static boolean des_set_key(byte[] key, long[] key_sched) { 361 | return des_set_key(octet2long(key), key_sched); 362 | } 363 | 364 | /** 365 | * Mangles 366 | * 367 | * @return long is a result 368 | * @param R is of type long 369 | * @param key is of type long 370 | */ 371 | public static long mangle(long R, long key) { 372 | long output = 0; 373 | int chunk, nibble; 374 | long expanded_R = permute_des(expansion_permutation, R); 375 | 376 | for (int i = 0; i < 8; i++) { 377 | chunk = (int)(((expanded_R & chunk_mask[i]) ^ 378 | (key & chunk_mask[i])) >>> ((6 * (7 - i)) + 16)); 379 | 380 | chunk = ((chunk & 0x00000001) << 4) | (chunk & 0x00000020) | 381 | ((chunk & 0x0000001e) >>> 1); 382 | 383 | //chunk -> nibble 384 | nibble = (int)sbox[i][chunk]; 385 | 386 | output |= ((long)nibble) << (((7 - i) * 4) + 32); 387 | } 388 | return permute_des(p_box_permutation, output); 389 | } 390 | 391 | /** 392 | * Encrypts with des 393 | * 394 | * @return long is a result 395 | * @param data is of type long 396 | * @param key_sched is of type long[] 397 | * @param encrypt is of type boolean 398 | */ 399 | public static long des_encrypt(long data, long[] key_sched, boolean encrypt) { 400 | long input, output; 401 | long L, R, R1 = 0; 402 | input = permute_des(initial_permutation, data); 403 | L = (input & 0xffffffff00000000L); 404 | R = (input & 0x00000000ffffffffL) << 32; 405 | for (int i = 0; i < 16; i++) { 406 | if (encrypt) 407 | R1 = L ^ mangle(R, key_sched[i]); 408 | else 409 | R1 = L ^ mangle(R, key_sched[15 - i]); 410 | L = R; 411 | R = R1; 412 | } 413 | output = R | (L >>> 32); 414 | output = permute_des(final_permutation, output); 415 | return output; 416 | } 417 | 418 | /** 419 | * Encrypts with des 420 | * 421 | * @return long is a result 422 | * @param data is of type byte[] 423 | * @param key_sched is of type long[] 424 | * @param encrypt is of type boolean 425 | */ 426 | public static long des_encrypt(byte[] data, long[] key_sched, boolean encrypt) { 427 | return des_encrypt(octet2long(data), key_sched, encrypt); 428 | } 429 | 430 | /** 431 | * Converts octet to long 432 | * 433 | * @return long is a result 434 | * @param input is of type byte[] 435 | */ 436 | public static long octet2long(byte[] input) { 437 | return octet2long(input, 0); 438 | } 439 | 440 | /** 441 | * Converts octet to long with offset 442 | * 443 | * @return long is a result 444 | * @param input is of type byte[] 445 | * @param offset is of type int 446 | */ 447 | public static long octet2long(byte[] input, int offset) { 448 | long result = 0; 449 | for (int i = 0; i < 8; i++) { 450 | if (i + offset < input.length) { 451 | result |= (((long)input[i + offset]) & 0xffL) << ((7 - i) * 8); 452 | } 453 | } 454 | return result; 455 | } 456 | 457 | /** 458 | * Converts long to octet 459 | * 460 | * @return byte[] is a result 461 | * @param input is of type long 462 | */ 463 | public static byte[] long2octet(long input) { 464 | byte[] output = new byte[8]; 465 | for (int i = 0; i < 8; i++) { 466 | output[i] = (byte)((input >>> ((7 - i) * 8)) & 0xffL); 467 | } 468 | return output; 469 | } 470 | 471 | /** 472 | * Converts long to octet 473 | * 474 | * @param input is of type long 475 | * @param output is of type byte[] 476 | */ 477 | public static void long2octet(long input, byte[] output) { 478 | long2octet(input, output, 0); 479 | } 480 | 481 | /** 482 | * Converts long to octet with offset 483 | * 484 | * @param input is of type long 485 | * @param output is of type byte[] 486 | * @param offset is of type int 487 | */ 488 | public static void long2octet(long input, byte[] output, int offset) { 489 | for (int i = 0; i < 8; i++) { 490 | if (i + offset < output.length) { 491 | output[i + offset] = 492 | (byte)((input >>> ((7 - i) * 8)) & 0xffL); 493 | } 494 | } 495 | } 496 | 497 | /** 498 | * Converts string to byte 499 | * 500 | * @return byte[] is a result 501 | * @param str is of type String 502 | * @see java.lang.String 503 | */ 504 | public static byte[] string2byte(String str) { 505 | /* byte[] result = new byte[str.length()]; 506 | getBytes(0, str.length(), result, 0); 507 | return result;*/ 508 | return str.getBytes(); 509 | } 510 | 511 | 512 | /** 513 | * ECB encryption 514 | * 515 | * @param input is of type byte[] 516 | * @param output is of type byte[] 517 | * @param schedule is of type long[] 518 | * @param encrypt is of type boolean 519 | */ 520 | public static void ecb_encrypt( 521 | byte[] input, 522 | byte[] output, 523 | long[] schedule, 524 | boolean encrypt) { 525 | long2octet(des_encrypt(octet2long(input), schedule, encrypt), output); 526 | } 527 | 528 | /** 529 | * ECB encryption 530 | * 531 | * @param input is of type byte[] 532 | * @param input_offset is of type int 533 | * @param output is of type byte[] 534 | * @param output_offset is of type int 535 | * @param schedule is of type long[] 536 | * @param encrypt is of type boolean 537 | */ 538 | public static void ecb_encrypt( 539 | byte[] input, 540 | int input_offset, 541 | byte[] output, 542 | int output_offset, 543 | long[] schedule, 544 | boolean encrypt) { 545 | long2octet(des_encrypt(octet2long(input, input_offset), schedule, 546 | encrypt), output, output_offset); 547 | } 548 | 549 | /** 550 | * CBC encryption 551 | * 552 | * @param input is of type byte[] 553 | * @param output is of type byte[] 554 | * @param schedule is of type long[] 555 | * @param ivec is of type long 556 | * @param encrypt is of type boolean 557 | */ 558 | public static void cbc_encrypt( 559 | byte[] input, 560 | byte[] output, 561 | long[] schedule, 562 | long ivec, 563 | boolean encrypt) { 564 | cbc_encrypt(input, 0, output, 0, input.length, schedule, ivec, encrypt); 565 | } 566 | 567 | /** 568 | * CBC encryption 569 | * 570 | * @param input is of type byte[] 571 | * @param output is of type byte[] 572 | * @param schedule is of type long[] 573 | * @param ivec is of type byte[] 574 | * @param encrypt is of type boolean 575 | */ 576 | public static void cbc_encrypt( 577 | byte[] input, 578 | byte[] output, 579 | long[] schedule, 580 | byte[] ivec, 581 | boolean encrypt) { 582 | cbc_encrypt(input, 0, output, 0, input.length, schedule, octet2long(ivec), encrypt); 583 | } 584 | 585 | /** 586 | * CBC encryption 587 | * 588 | * @param input is of type byte[] 589 | * @param input_offset is of type int 590 | * @param output is of type byte[] 591 | * @param output_offset is of type int 592 | * @param length is of type int 593 | * @param schedule is of type long[] 594 | * @param ivec is of type byte[] 595 | * @param encrypt is of type boolean 596 | */ 597 | public static void cbc_encrypt( 598 | byte[] input, 599 | int input_offset, 600 | byte[] output, 601 | int output_offset, 602 | int length, 603 | long[] schedule, 604 | byte[] ivec, 605 | boolean encrypt) { 606 | cbc_encrypt(input, input_offset, output, output_offset, length, schedule, octet2long(ivec), encrypt); 607 | } 608 | 609 | /** 610 | * CBC encryption 611 | * 612 | * @param input is of type byte[] 613 | * @param input_offset is of type int 614 | * @param output is of type byte[] 615 | * @param output_offset is of type int 616 | * @param length is of type int 617 | * @param schedule is of type long[] 618 | * @param ivec is of type long 619 | * @param encrypt is of type boolean 620 | */ 621 | public static void cbc_encrypt( 622 | byte[] input, 623 | int input_offset, 624 | byte[] output, 625 | int output_offset, 626 | int length, 627 | long[] schedule, 628 | long ivec, 629 | boolean encrypt) { 630 | long m; 631 | long c = ivec; 632 | for (int i = 0; i < (length / 8) + (length % 8 == 0 ? 0 : 1); i++) { 633 | m = octet2long(input, (i * 8) + input_offset); 634 | if (encrypt) { 635 | c = des_encrypt(m ^ c, schedule, encrypt); 636 | long2octet(c, output, (i * 8) + output_offset); 637 | } 638 | else { 639 | c = c ^ des_encrypt(m, schedule, encrypt); 640 | long2octet(c, output, (i * 8) + output_offset); 641 | c = m; 642 | } 643 | } 644 | } 645 | 646 | /** 647 | * CBC checksum 648 | * 649 | * @return long is a result 650 | * @param input is of type byte[] 651 | * @param schedule is of type long[] 652 | * @param ivec is of type long 653 | */ 654 | public static long cbc_cksum( 655 | byte[] input, 656 | long[] schedule, 657 | long ivec) { 658 | return cbc_cksum(input, 0, input.length, schedule, ivec); 659 | } 660 | 661 | /** 662 | * CBC checksum 663 | * 664 | * @return long is a result 665 | * @param input is of type byte[] 666 | * @param schedule is of type long[] 667 | * @param ivec is of type byte[] 668 | */ 669 | public static long cbc_cksum( 670 | byte[] input, 671 | long[] schedule, 672 | byte[] ivec) { 673 | return cbc_cksum(input, 0, input.length, schedule, ivec); 674 | } 675 | 676 | /** 677 | * CBC checksum 678 | * 679 | * @return long is a result 680 | * @param input is of type byte[] 681 | * @param input_offset is of type int 682 | * @param length is of type int 683 | * @param schedule is of type long[] 684 | * @param ivec is of type long 685 | */ 686 | public static long cbc_cksum( 687 | byte[] input, 688 | int input_offset, 689 | int length, 690 | long[] schedule, 691 | long ivec) { 692 | long m; 693 | long c = ivec; 694 | for (int i = 0; i < (length / 8) + (length % 8 == 0 ? 0 : 1); i++) { 695 | m = octet2long(input, (i * 8) + input_offset); 696 | c = des_encrypt(m ^ c, schedule, true); 697 | } 698 | return c; 699 | } 700 | 701 | /** 702 | * CBC checksum 703 | * 704 | * @return long is a result 705 | * @param input is of type byte[] 706 | * @param input_offset is of type int 707 | * @param length is of type int 708 | * @param schedule is of type long[] 709 | * @param ivec is of type byte[] 710 | */ 711 | public static long cbc_cksum( 712 | byte[] input, 713 | int input_offset, 714 | int length, 715 | long[] schedule, 716 | byte[] ivec) { 717 | return cbc_cksum(input, input_offset, length, schedule, octet2long(ivec)); 718 | } 719 | 720 | /** 721 | * Converts string to key 722 | * 723 | * @return long is a result 724 | * @param str is of type String 725 | * @see java.lang.String 726 | */ 727 | public static long string_to_key(String str) { 728 | byte[] bytes = string2byte(str); 729 | long[] key_sched = new long[16]; 730 | long key = 0; 731 | long octet = 0; 732 | long octet1 = 0; 733 | 734 | int length = (bytes.length / 8) + (bytes.length % 8 == 0 ? 0 : 1); 735 | 736 | for (int i = 0; i < length; i++) { 737 | octet = octet2long(bytes, i * 8) & 0x7f7f7f7f7f7f7f7fL; 738 | if (i % 2 == 1) { 739 | octet1 = 0; 740 | for (int j = 0; j < 64; j++) { 741 | octet1 |= ((octet & (1L << j)) >>> j) << (63 - j); 742 | } 743 | octet = octet1 >>> 1; 744 | } 745 | key ^= (octet << 1); 746 | } 747 | 748 | key = set_parity(key); 749 | if (bad_key(key)) { 750 | byte [] temp = long2octet(key); 751 | temp[7] ^= 0xf0; 752 | key = octet2long(temp); 753 | } 754 | des_set_key(key, key_sched); 755 | key = cbc_cksum(bytes, key_sched, key); 756 | 757 | key = set_parity(key); 758 | if (bad_key(key)) { 759 | byte [] temp = long2octet(key); 760 | temp[7] ^= 0xf0; 761 | key = octet2long(temp); 762 | } 763 | 764 | return key; 765 | } 766 | 767 | /** 768 | * Converts string to key bytes 769 | * 770 | * @return byte[] is a result 771 | * @param str is of type String 772 | * @see java.lang.String 773 | */ 774 | public static byte[] string_to_key_bytes(String str) { 775 | return long2octet(string_to_key(str)); 776 | } 777 | 778 | } 779 | 780 | 781 | -------------------------------------------------------------------------------- /EFTMessage.java: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * $Log: EFTMessage.java,v $ 4 | * Revision 1.10 2008/02/27 02:00:33 liaok 5 | * 增加商户名称域 6 | * 7 | * Revision 1.9 2008/01/16 07:09:48 liaok 8 | * 更新EFTmessage的注释,为文档做准备 9 | * 10 | * Revision 1.8 2007/12/11 06:28:16 wangl 11 | * 修改uniquid为整型 12 | * 13 | * Revision 1.7 2007/12/06 07:29:34 wangl 14 | * 加入交易类型判断 15 | * 16 | * Revision 1.6 2007/11/28 07:04:57 liaok 17 | * 修正网络管理码的赋值问题 18 | * 19 | * Revision 1.5 2007/11/22 06:05:21 liaok 20 | * 增加TPDU字段并实现对其的赋值 21 | * 22 | * Revision 1.4 2007/11/20 10:54:11 liaok 23 | * 修改交易类型的getter为int型 24 | * 25 | * Revision 1.3 2007/11/16 06:31:31 liaok 26 | * 将部分get/set的内容从字符串变为int,方面逻辑使用 27 | * 28 | * Revision 1.2 2007/11/13 06:45:29 wangl 29 | * 同步代码 30 | * 31 | * Revision 1.4 2007/11/09 07:22:49 wangl 32 | * 加入域注释 33 | * 34 | * Revision 1.3 2007/11/01 02:33:53 wangl 35 | * 修改字段属性 36 | * 37 | * Revision 1.2 2007/10/26 07:39:44 wangl 38 | * 修改为保护类型 39 | * 40 | * Revision 1.1.1.1 2007/10/09 02:17:40 ndscm 41 | * 重新提交TPLATFORM的内容,将*.h、*.java、*.c、*.cpp以文本形式进行提交 42 | * 43 | * Revision 1.10 2007/09/29 07:28:51 wangl 44 | * 修改錯誤代碼 45 | * 46 | * Revision 1.9 2007/09/28 03:27:01 wangl 47 | * 添加结算部分 48 | * 49 | * Revision 1.8 2007/09/25 06:51:36 wangl 50 | * 添加交易部分代码 51 | * 52 | * Revision 1.7 2007/09/24 07:06:58 zhaol 53 | * 更改框架注册和处理方式,简化开发过程 54 | * 55 | * Revision 1.6 2007/09/20 03:23:11 wangl 56 | * 修改错误 57 | * 58 | * 59 | */ 60 | 61 | 62 | 63 | 64 | /** 65 | * @brief 66 | *金融消息接口 符合ISO8583定义的数据包
67 | * 68 | * 金融消息接口 符合ISO8583定义的数据包 69 | * 70 | * @author wangl 71 | * @version eJPos SDK1.0 72 | * @see 73 | * @since 2007-9-5 74 | */ 75 | 76 | 77 | public class EFTMessage { 78 | 79 | /** 80 | * 交易标识 81 | */ 82 | private int uniqueID; 83 | 84 | /** 85 | * @brief 86 | * 消息类型 87 | * 88 | */ 89 | public String msgTypeID; 90 | 91 | 92 | /** 93 | * 交易类型 FIELD_60_1 94 | */ 95 | public String transactionType; 96 | 97 | /** 98 | * 批次号 FIELD_60_2 99 | */ 100 | public String batchNumber; 101 | 102 | /** 103 | * 应答码 FIELD_39 104 | */ 105 | public String responseCode = "00"; 106 | 107 | /** 108 | * 本地时间 12域 109 | */ 110 | public String localTransTime; 111 | 112 | /** 113 | * 本地日期 13域 114 | */ 115 | public String localTransDate; 116 | 117 | /** 118 | * 受卡方标识码 42域 119 | */ 120 | public String cardAcptIdenCode; 121 | 122 | /** 123 | * 受卡方名称地址 43域 124 | */ 125 | public String cardAcptAddress; 126 | 127 | /** 128 | * 受卡机终端标识码 FIELD_41 129 | */ 130 | public String serviceCode; 131 | 132 | /** 133 | * 受卡方系统跟踪号 11域 134 | */ 135 | public String traceNumber; 136 | 137 | /** 138 | * 主账号 2域 139 | */ 140 | public String priAccountNumber; 141 | 142 | /** 143 | * 交易处理码 3域 144 | */ 145 | public String process; 146 | 147 | /** 148 | * 交易金额 4域 149 | */ 150 | public String transactionAmount; 151 | 152 | /** 153 | * 卡有效期 14域 154 | */ 155 | public String cardValidate; 156 | 157 | /** 158 | * 服务点输入方式码 22域 159 | */ 160 | public String pointServiceInputMode; 161 | 162 | /** 163 | * 服务点条件码 25域 164 | */ 165 | public String pointServiceCode; 166 | 167 | /** 168 | * 服务点PIN获取码 26域 169 | */ 170 | public String pointServicePINCode; 171 | 172 | /** 173 | * 2磁道数据 35域 174 | */ 175 | public String track2Data; 176 | 177 | /** 178 | * 3磁道数据 36域 179 | */ 180 | public String track3Data; 181 | 182 | /** 183 | * 交易货币代码 49域 184 | */ 185 | public String currencyTransactionCode; 186 | 187 | /** 188 | * 个人标识码数据 52域 189 | */ 190 | public byte[] pinData; 191 | 192 | /** 193 | * 安全控制信息 53域 194 | */ 195 | public String securityControlInfo; 196 | 197 | /** 198 | *mac
64域
199 | */
200 | public byte[] mac;
201 |
202 | /**
203 | * 原批号FIELD_61_1
204 | */
205 | public String originalBatchNumber;
206 |
207 | /**
208 | * 原流水号FIELD_61_2
209 | */
210 | public String originalTraceNumber;
211 |
212 | /**
213 | * 原交易日期FIELD_61_3
214 | */
215 | public String originalTransactionDate;
216 |
217 | /**
218 | * 受理方标识码 32域
219 | */
220 | public String acceptorSign;
221 |
222 | /**
223 | * 检索参考号 37域
224 | */
225 | public String retrievalRefNum;
226 |
227 | /**
228 | * 终端密钥 62域
229 | */
230 | public byte[] clientKey;
231 |
232 | /**
233 | * 参数信息 2域
234 | */
235 | public byte[] parameterInfo;
236 |
237 | /**
238 | * 清算日期 15域
239 | */
240 | public String settlementdate;
241 |
242 | /**
243 | * 授权标识应答码 38域
244 | */
245 | public String authorizationIdentifyResCode;
246 |
247 | /**
248 | * 附加响应数据 44域
249 | */
250 | public String extInfo;
251 |
252 | /**
253 | * 发卡行(定长8个字节) 63.2域
254 | */
255 | public String publishBank;
256 |
257 | /**
258 | * 收单行号(定长8个字节) 63.4域
259 | */
260 | public String receiveBank;
261 |
262 |
263 | /**
264 | * 国际组织代码(定长3个字节) 国际组织中文 国际组织英文 3位代码 人民币卡 China Union Pay CUP 威士卡 VISA VIS
265 | * 万事达卡 Master Card MCC 万事达卡 Maestro Card MAE JCB卡 JCB JCB 大来卡 Dinner Club
266 | * DCC 运通卡 American Express AEX 63.1域
267 | *
268 | */
269 | public String internationalOrganizationCode;
270 |
271 | /**
272 | * 银联信息 63.3域
273 | */
274 | public String chinaUnionPayInfo;
275 |
276 |
277 | /**
278 | * 操作员代码 63.1域
279 | */
280 | public String operatorCode;
281 |
282 |
283 | /**
284 | * 网络管理码 60.3域
285 | */
286 | public String netManageCode;
287 |
288 |
289 | /**
290 | * 附加金额 54
291 | */
292 | public String balanceAmount;
293 |
294 |
295 | /**
296 | * 60.3域 内卡借记总金额
297 | */
298 | public String localCardLoanTotalAmount; //48
299 | /**
300 | * 60.3域 内卡借记总次数
301 | */
302 | public String localCardLoanTotalCount;//48
303 | /**
304 | * 60.3域 内卡贷记总金额
305 | */
306 | public String localCardCreditTotalAmount;//48
307 | /**
308 | * 60.3域 内卡贷记总次数
309 | */
310 | public String localCardCreditTotalCount;//48
311 | /**
312 | * 60.3域 内卡状态
313 | */
314 | public String localCardCheckAccountCode;//48
315 | /**
316 | * 60.3域 外卡借记总金额
317 | */
318 | public String foreignCardLoanTotalAmount;//48
319 | /**
320 | * 60.3域 外卡借记总次数
321 | */
322 | public String foreignCardLoanTotalCount;//48
323 | /**
324 | * 60.3域 外卡贷记总金额
325 | */
326 | public String foreignCardCreditTotalAmount;//48
327 | /**
328 | * 60.3域 外卡贷记总次数
329 | */
330 | public String foreignCardCreditTotalCount;//48
331 | /**
332 | * 60.3域 外卡状态
333 | */
334 | public String foreignCardCheckAccountCode;//48
335 |
336 | /**
337 | * 原授权方式 61.4
338 | */
339 | public String authorizationType;
340 |
341 | /**
342 | * 原授权机构 61.5
343 | */
344 | public String authorizationOrganization;
345 |
346 | /**
347 | * 交易明细 48
348 | */
349 | public String transactionDetial;
350 |
351 | /**
352 | * 数据包TPDU信息
353 | */
354 | public String TPDU;
355 |
356 | /**
357 | * 商户名称
358 | */
359 | public String merchantName;
360 |
361 | public byte[] serviceScript;
362 |
363 | public String serviceResponse;
364 |
365 | public byte[] serviceRequestCode;
366 |
367 | public byte[] serviceRequestPara;
368 |
369 | public byte[] serviceRequestSign;
370 |
371 | public String reserved;
372 |
373 | //-----------------------------------------------------------------------------------------------------------------------------------------//
374 | //QCUP银联多渠道平台数据域
375 | /**
376 | * 域2 主账号
377 | */
378 | public String qcup_PrimaryAccountNumber;
379 |
380 | /**
381 | * 域3 交易处理码
382 | */
383 | public String qcup_ProcessingCode;
384 |
385 | /**
386 | * 域4 交易金额
387 | */
388 | public String qcup_TransactionsAmount;
389 |
390 | /**
391 | * 域7 交易传输时间
392 | */
393 | public String qcup_TransmissionDateAndTime;
394 |
395 | /**
396 | * 域11 系统跟踪号
397 | */
398 | public String qcup_SystemTraceAuditNumber;
399 |
400 | /**
401 | * 域12 受卡方所在地时间
402 | */
403 | public String qcup_LocalTransactionTime;
404 |
405 | /**
406 | * 域13 受卡方所在地日期
407 | */
408 | public String qcup_LocalTransactionDate;
409 |
410 | /**
411 | * 域14 卡有效期
412 | */
413 | public String qcup_ExpirationDate;
414 |
415 | /**
416 | * 域15 清算日期
417 | */
418 | public String qcup_SettlementDate;
419 |
420 | /**
421 | * 域18 商户类型
422 | */
423 | public String qcup_MerchantType;
424 |
425 | /**
426 | * 域22 服务点输入方式码
427 | */
428 | public String qcup_PointOfServiceEntryModeCode;
429 |
430 | /**
431 | * 域23 卡序列号
432 | */
433 | public String qcup_CardSequenceNumber;
434 |
435 | /**
436 | * 域25 服务点条件码
437 | */
438 | public String qcup_PointOfServiceConditionMode;
439 |
440 | /**
441 | * 域26服务点PIN 获取码
442 | */
443 | public String qcup_PointofServicePinCaptureCode;
444 |
445 | /**
446 | * 域32 受理机构标识码
447 | */
448 | public String qcup_AcquiringInstitutionIdentificationCode;
449 |
450 | /**
451 | * 域33 发送机构标识码
452 | */
453 | public String qcup_ForwardingInstitutionIdentificationCode;
454 |
455 | /**
456 | * 域35第二磁道数据
457 | */
458 | public String qcup_Track2Data;
459 |
460 | /**
461 | * 域36第三磁道数据
462 | */
463 | public String qcup_Track3Data;
464 |
465 | /**
466 | * 域37 检索参考号
467 | */
468 | public String qcup_RetrievalReferenceNumber;
469 |
470 | /**
471 | * 域38 授权标识应答码
472 | */
473 | public String qcup_AuthorizationIdentificationResponse;
474 |
475 | /**
476 | * 域39 应答码
477 | */
478 | public String qcup_ResponseCode;
479 |
480 | /**
481 | * 域41 受卡机终端标识码
482 | */
483 | public String qcup_CardAcceptorTerminalIdentification;
484 |
485 | /**
486 | * 域42 受卡方标识码
487 | */
488 | public String qcup_CardAcceptorIdentificationCode;
489 |
490 | /**
491 | * 域43 受卡方名称地址
492 | */
493 | public String qcup_CardAcceptorNameLocation;
494 |
495 | /**
496 | * 域48 自定义域
497 | */
498 | public String qcup_AdditionalDataPrivate;
499 |
500 | /**
501 | * 域49交易货币代码
502 | */
503 | public String qcup_CurrencyCodeTransaction;
504 |
505 | /**
506 | * 域52 个人标识码数据
507 | */
508 | public byte[] qcup_pinData;
509 |
510 | /**
511 | * 域53 安全控制信息
512 | */
513 | public String qcup_SecurityRelatedControlInformation;
514 |
515 | /**
516 | * 域54 实际余额
517 | */
518 | public String qcup_AdditionalAmounts;
519 |
520 | /**
521 | * 域55基于PBOC借贷记标准的IC卡数据域
522 | */
523 | public byte[] qcup_IntegratedCircuitCardSystemRelatedData;
524 |
525 | /**
526 | * 域59 明细查询数据
527 | */
528 | public String qcup_DetailInquiring;
529 |
530 | /**
531 | * 域60 自定义域
532 | */
533 | public String qcup_AdditionalPointOfServiceInformation;
534 |
535 | /**
536 | * 域61 持卡人身份认证信息
537 | */
538 | public String qcup_AuthenticationInformation;
539 |
540 | /**
541 | * 域63 自定义域
542 | */
543 | public byte[] qcup_ReservedPrivate;
544 |
545 | /**
546 | * 域70 网络管理码
547 | */
548 | public String qcup_Networkmanagementcode;
549 |
550 | /**
551 | * 域90 原始数据元
552 | */
553 | public String qcup_OriginalDataElements;
554 |
555 | /**
556 | * 域96 报文安全码
557 | */
558 | public byte[] qcup_MessageSecurityCode;
559 |
560 | /**
561 | * 域100 接收机构标识码
562 | */
563 | public String qcup_DestinationInstituitionIdentificationCode;
564 |
565 | /**
566 | * 域102 账户标识1
567 | */
568 | public String qcup_AccountIdentification1;
569 |
570 | /**
571 | * 域103 账户标识2
572 | */
573 | public String qcup_AccountIdentification2;
574 |
575 | /**
576 | * 域128 报文鉴别码
577 | */
578 | public byte[] qcup_Mac;
579 |
580 |
581 | public String getQCUP_PrimaryAccountNumber() {
582 | return qcup_PrimaryAccountNumber;
583 | }
584 |
585 | public void setQCUP_PrimaryAccountNumber(String qCUP_PrimaryAccountNumber) {
586 | qcup_PrimaryAccountNumber = qCUP_PrimaryAccountNumber;
587 | }
588 |
589 | public String getQCUP_ProcessingCode() {
590 | return qcup_ProcessingCode;
591 | }
592 |
593 | public void setQCUP_ProcessingCode(String qCUP_ProcessingCode) {
594 | qcup_ProcessingCode = qCUP_ProcessingCode;
595 | }
596 |
597 | public String getQCUP_TransactionsAmount() {
598 | return qcup_TransactionsAmount;
599 | }
600 |
601 | public void setQCUP_TransactionsAmount(String qCUP_TransactionsAmount) {
602 | qcup_TransactionsAmount = qCUP_TransactionsAmount;
603 | }
604 |
605 | public String getQCUP_TransmissionDateAndTime() {
606 | return qcup_TransmissionDateAndTime;
607 | }
608 |
609 | public void setQCUP_TransmissionDateAndTime(String qCUP_TransmissionDateAndTime) {
610 | qcup_TransmissionDateAndTime = qCUP_TransmissionDateAndTime;
611 | }
612 |
613 | public String getQCUP_SystemTraceAuditNumber() {
614 | return qcup_SystemTraceAuditNumber;
615 | }
616 |
617 | public void setQCUP_SystemTraceAuditNumber(String qCUP_SystemTraceAuditNumber) {
618 | qcup_SystemTraceAuditNumber = qCUP_SystemTraceAuditNumber;
619 | }
620 |
621 | public String getQCUP_LocalTransactionTime() {
622 | return qcup_LocalTransactionTime;
623 | }
624 |
625 | public void setQCUP_LocalTransactionTime(String qCUP_LocalTransactionTime) {
626 | qcup_LocalTransactionTime = qCUP_LocalTransactionTime;
627 | }
628 |
629 | public String getQCUP_LocalTransactionDate() {
630 | return qcup_LocalTransactionDate;
631 | }
632 |
633 | public void setQCUP_LocalTransactionDate(String qCUP_LocalTransactionDate) {
634 | qcup_LocalTransactionDate = qCUP_LocalTransactionDate;
635 | }
636 |
637 | public String getQCUP_ExpirationDate() {
638 | return qcup_ExpirationDate;
639 | }
640 |
641 | public void setQCUP_ExpirationDate(String qCUP_ExpirationDate) {
642 | qcup_ExpirationDate = qCUP_ExpirationDate;
643 | }
644 |
645 | public String getQCUP_SettlementDate() {
646 | return qcup_SettlementDate;
647 | }
648 |
649 | public void setQCUP_SettlementDate(String qCUP_SettlementDate) {
650 | qcup_SettlementDate = qCUP_SettlementDate;
651 | }
652 |
653 | public String getQCUP_MerchantType() {
654 | return qcup_MerchantType;
655 | }
656 |
657 | public void setQCUP_MerchantType(String qCUP_MerchantType) {
658 | qcup_MerchantType = qCUP_MerchantType;
659 | }
660 |
661 | public String getQCUP_PointOfServiceEntryModeCode() {
662 | return qcup_PointOfServiceEntryModeCode;
663 | }
664 |
665 | public void setQCUP_PointOfServiceEntryModeCode(
666 | String qCUP_PointOfServiceEntryModeCode) {
667 | qcup_PointOfServiceEntryModeCode = qCUP_PointOfServiceEntryModeCode;
668 | }
669 |
670 | public String getQCUP_CardSequenceNumber() {
671 | return qcup_CardSequenceNumber;
672 | }
673 |
674 | public void setQCUP_CardSequenceNumber(String qCUP_CardSequenceNumber) {
675 | qcup_CardSequenceNumber = qCUP_CardSequenceNumber;
676 | }
677 |
678 | public String getQCUP_PointOfServiceConditionMode() {
679 | return qcup_PointOfServiceConditionMode;
680 | }
681 |
682 | public void setQCUP_PointOfServiceConditionMode(
683 | String qCUP_PointOfServiceConditionMode) {
684 | qcup_PointOfServiceConditionMode = qCUP_PointOfServiceConditionMode;
685 | }
686 |
687 | public String getQCUP_PointofServicePinCaptureCode() {
688 | return qcup_PointofServicePinCaptureCode;
689 | }
690 |
691 | public void setQCUP_PointofServicePinCaptureCode(
692 | String qCUP_PointofServicePinCaptureCode) {
693 | qcup_PointofServicePinCaptureCode = qCUP_PointofServicePinCaptureCode;
694 | }
695 |
696 | public String getQCUP_AcquiringInstitutionIdentificationCode() {
697 | return qcup_AcquiringInstitutionIdentificationCode;
698 | }
699 |
700 | public void setQCUP_AcquiringInstitutionIdentificationCode(
701 | String qCUP_AcquiringInstitutionIdentificationCode) {
702 | qcup_AcquiringInstitutionIdentificationCode = qCUP_AcquiringInstitutionIdentificationCode;
703 | }
704 |
705 | public String getQCUP_ForwardingInstitutionIdentificationCode() {
706 | return qcup_ForwardingInstitutionIdentificationCode;
707 | }
708 |
709 | public void setQCUP_ForwardingInstitutionIdentificationCode(
710 | String qCUP_ForwardingInstitutionIdentificationCode) {
711 | qcup_ForwardingInstitutionIdentificationCode = qCUP_ForwardingInstitutionIdentificationCode;
712 | }
713 |
714 | public String getQCUP_Track2Data() {
715 | return qcup_Track2Data;
716 | }
717 |
718 | public void setQCUP_Track2Data(String qCUP_Track2Data) {
719 | qcup_Track2Data = qCUP_Track2Data;
720 | }
721 |
722 | public String getQCUP_Track3Data() {
723 | return qcup_Track3Data;
724 | }
725 |
726 | public void setQCUP_Track3Data(String qCUP_Track3Data) {
727 | qcup_Track3Data = qCUP_Track3Data;
728 | }
729 |
730 | public String getQCUP_RetrievalReferenceNumber() {
731 | return qcup_RetrievalReferenceNumber;
732 | }
733 |
734 | public void setQCUP_RetrievalReferenceNumber(
735 | String qCUP_RetrievalReferenceNumber) {
736 | qcup_RetrievalReferenceNumber = qCUP_RetrievalReferenceNumber;
737 | }
738 |
739 | public String getQCUP_AuthorizationIdentificationResponse() {
740 | return qcup_AuthorizationIdentificationResponse;
741 | }
742 |
743 | public void setQCUP_AuthorizationIdentificationResponse(
744 | String qCUP_AuthorizationIdentificationResponse) {
745 | qcup_AuthorizationIdentificationResponse = qCUP_AuthorizationIdentificationResponse;
746 | }
747 |
748 | public String getQCUP_ResponseCode() {
749 | return qcup_ResponseCode;
750 | }
751 |
752 | public void setQCUP_ResponseCode(String qCUP_ResponseCode) {
753 | qcup_ResponseCode = qCUP_ResponseCode;
754 | }
755 |
756 | public String getQCUP_CardAcceptorTerminalIdentification() {
757 | return qcup_CardAcceptorTerminalIdentification;
758 | }
759 |
760 | public void setQCUP_CardAcceptorTerminalIdentification(
761 | String qCUP_CardAcceptorTerminalIdentification) {
762 | qcup_CardAcceptorTerminalIdentification = qCUP_CardAcceptorTerminalIdentification;
763 | }
764 |
765 | public String getQCUP_CardAcceptorIdentificationCode() {
766 | return qcup_CardAcceptorIdentificationCode;
767 | }
768 |
769 | public void setQCUP_CardAcceptorIdentificationCode(
770 | String qCUP_CardAcceptorIdentificationCode) {
771 | qcup_CardAcceptorIdentificationCode = qCUP_CardAcceptorIdentificationCode;
772 | }
773 |
774 | public String getQCUP_CardAcceptorNameLocation() {
775 | return qcup_CardAcceptorNameLocation;
776 | }
777 |
778 | public void setQCUP_CardAcceptorNameLocation(
779 | String qCUP_CardAcceptorNameLocation) {
780 | qcup_CardAcceptorNameLocation = qCUP_CardAcceptorNameLocation;
781 | }
782 |
783 | public String getQCUP_AdditionalDataPrivate() {
784 | return qcup_AdditionalDataPrivate;
785 | }
786 |
787 | public void setQCUP_AdditionalDataPrivate(String qCUP_AdditionalDataPrivate) {
788 | qcup_AdditionalDataPrivate = qCUP_AdditionalDataPrivate;
789 | }
790 |
791 | public String getQCUP_CurrencyCodeTransaction() {
792 | return qcup_CurrencyCodeTransaction;
793 | }
794 |
795 | public void setQCUP_CurrencyCodeTransaction(String qCUP_CurrencyCodeTransaction) {
796 | qcup_CurrencyCodeTransaction = qCUP_CurrencyCodeTransaction;
797 | }
798 |
799 | public byte[] getQCUP_pinData() {
800 | return qcup_pinData;
801 | }
802 |
803 | public void setQCUP_pinData(byte[] qCUP_pinData) {
804 | qcup_pinData = qCUP_pinData;
805 | }
806 |
807 | public String getQCUP_SecurityRelatedControlInformation() {
808 | return qcup_SecurityRelatedControlInformation;
809 | }
810 |
811 | public void setQCUP_SecurityRelatedControlInformation(
812 | String qCUP_SecurityRelatedControlInformation) {
813 | qcup_SecurityRelatedControlInformation = qCUP_SecurityRelatedControlInformation;
814 | }
815 |
816 | public String getQCUP_AdditionalAmounts() {
817 | return qcup_AdditionalAmounts;
818 | }
819 |
820 | public void setQCUP_AdditionalAmounts(String qCUP_AdditionalAmounts) {
821 | qcup_AdditionalAmounts = qCUP_AdditionalAmounts;
822 | }
823 |
824 | public byte[] getQCUP_IntegratedCircuitCardSystemRelatedData() {
825 | return qcup_IntegratedCircuitCardSystemRelatedData;
826 | }
827 |
828 | public void setQCUP_IntegratedCircuitCardSystemRelatedData(
829 | byte[] qCUP_IntegratedCircuitCardSystemRelatedData) {
830 | qcup_IntegratedCircuitCardSystemRelatedData = qCUP_IntegratedCircuitCardSystemRelatedData;
831 | }
832 |
833 | public String getQCUP_DetailInquiring() {
834 | return qcup_DetailInquiring;
835 | }
836 |
837 | public void setQCUP_DetailInquiring(String qCUP_DetailInquiring) {
838 | qcup_DetailInquiring = qCUP_DetailInquiring;
839 | }
840 |
841 | public String getQCUP_AdditionalPointOfServiceInformation() {
842 | return qcup_AdditionalPointOfServiceInformation;
843 | }
844 |
845 | public void setQCUP_AdditionalPointOfServiceInformation(
846 | String qCUP_AdditionalPointOfServiceInformation) {
847 | qcup_AdditionalPointOfServiceInformation = qCUP_AdditionalPointOfServiceInformation;
848 | }
849 |
850 | public String getQCUP_AuthenticationInformation() {
851 | return qcup_AuthenticationInformation;
852 | }
853 |
854 | public void setQCUP_AuthenticationInformation(
855 | String qCUP_AuthenticationInformation) {
856 | qcup_AuthenticationInformation = qCUP_AuthenticationInformation;
857 | }
858 |
859 | public byte[] getQCUP_ReservedPrivate() {
860 | return qcup_ReservedPrivate;
861 | }
862 |
863 | public void setQCUP_ReservedPrivate(byte[] qCUP_ReservedPrivate) {
864 | qcup_ReservedPrivate = qCUP_ReservedPrivate;
865 | }
866 |
867 | public String getQCUP_Networkmanagementcode() {
868 | return qcup_Networkmanagementcode;
869 | }
870 |
871 | public void setQCUP_Networkmanagementcode(String qCUP_Networkmanagementcode) {
872 | qcup_Networkmanagementcode = qCUP_Networkmanagementcode;
873 | }
874 |
875 | public String getQCUP_OriginalDataElements() {
876 | return qcup_OriginalDataElements;
877 | }
878 |
879 | public void setQCUP_OriginalDataElements(String qCUP_OriginalDataElements) {
880 | qcup_OriginalDataElements = qCUP_OriginalDataElements;
881 | }
882 |
883 | public byte[] getQCUP_MessageSecurityCode() {
884 | return qcup_MessageSecurityCode;
885 | }
886 |
887 | public void setQCUP_MessageSecurityCode(byte[] qCUP_MessageSecurityCode) {
888 | qcup_MessageSecurityCode = qCUP_MessageSecurityCode;
889 | }
890 |
891 | public String getQCUP_DestinationInstituitionIdentificationCode() {
892 | return qcup_DestinationInstituitionIdentificationCode;
893 | }
894 |
895 | public void setQCUP_DestinationInstituitionIdentificationCode(
896 | String qCUP_DestinationInstituitionIdentificationCode) {
897 | qcup_DestinationInstituitionIdentificationCode = qCUP_DestinationInstituitionIdentificationCode;
898 | }
899 |
900 | public String getQCUP_AccountIdentification1() {
901 | return qcup_AccountIdentification1;
902 | }
903 |
904 | public void setQCUP_AccountIdentification1(String qCUP_AccountIdentification1) {
905 | qcup_AccountIdentification1 = qCUP_AccountIdentification1;
906 | }
907 |
908 | public String getQCUP_AccountIdentification2() {
909 | return qcup_AccountIdentification2;
910 | }
911 |
912 | public void setQCUP_AccountIdentification2(String qCUP_AccountIdentification2) {
913 | qcup_AccountIdentification2 = qCUP_AccountIdentification2;
914 | }
915 |
916 | public byte[] getQCUP_Mac() {
917 | return qcup_Mac;
918 | }
919 |
920 | public void setQCUP_Mac(byte[] qCUP_Mac) {
921 | qcup_Mac = qCUP_Mac;
922 | }
923 |
924 | public String getReserved() {
925 | return reserved;
926 | }
927 |
928 | public void setReserved(String reserved) {
929 | this.reserved = reserved;
930 | }
931 |
932 | public String getServiceResponse() {
933 | return serviceResponse;
934 | }
935 |
936 | public void setServiceResponse(String serviceResponse) {
937 | this.serviceResponse = serviceResponse;
938 | }
939 |
940 | public byte[] getServiceRequestCode() {
941 | return serviceRequestCode;
942 | }
943 |
944 | public void setServiceRequestCode(byte[] serviceRequestCode) {
945 | this.serviceRequestCode = serviceRequestCode;
946 | }
947 |
948 | public byte[] getServiceRequestPara() {
949 | return serviceRequestPara;
950 | }
951 |
952 | public void setServiceRequestPara(byte[] serviceRequestPara) {
953 | this.serviceRequestPara = serviceRequestPara;
954 | }
955 |
956 | public byte[] getServiceRequestSign() {
957 | return serviceRequestSign;
958 | }
959 |
960 | public void setServiceRequestSign(byte[] serviceRequestSign) {
961 | this.serviceRequestSign = serviceRequestSign;
962 | }
963 |
964 |
965 | public byte[] getServiceScript() {
966 | return serviceScript;
967 | }
968 |
969 | public void setServiceScript(byte[] serviceScript) {
970 | this.serviceScript = serviceScript;
971 | }
972 |
973 | public String getTPDU() {
974 | return TPDU;
975 | }
976 |
977 | public void setTPDU(String tpdu) {
978 | TPDU = tpdu;
979 | }
980 |
981 | public String getBalanceAmount() {
982 | return balanceAmount;
983 | }
984 |
985 | public void setBalanceAmount(String balanceAmount) {
986 | this.balanceAmount = balanceAmount;
987 | }
988 |
989 | public String getNetManageCode() {
990 | return netManageCode;
991 | }
992 |
993 | public void setNetManageCode(String netManageCode) {
994 | this.netManageCode = netManageCode;
995 | }
996 |
997 | public String getOperatorCode() {
998 | return operatorCode;
999 | }
1000 |
1001 |
1002 | public void setOperatorCode(String operatorCode) {
1003 | this.operatorCode = operatorCode;
1004 | }
1005 |
1006 |
1007 |
1008 | public String getAuthorizationIdentifyResCode() {
1009 | return authorizationIdentifyResCode;
1010 | }
1011 |
1012 |
1013 | public void setAuthorizationIdentifyResCode(String authorizationIdentifyResCode) {
1014 | this.authorizationIdentifyResCode = authorizationIdentifyResCode;
1015 | }
1016 |
1017 |
1018 | public String getChinaUnionPayInfo() {
1019 | return chinaUnionPayInfo;
1020 | }
1021 |
1022 |
1023 | public void setChinaUnionPayInfo(String chinaUnionPayInfo) {
1024 | this.chinaUnionPayInfo = chinaUnionPayInfo;
1025 | }
1026 |
1027 |
1028 | public String getExtInfo() {
1029 | return extInfo;
1030 | }
1031 |
1032 |
1033 | public void setExtInfo(String extInfo) {
1034 | this.extInfo = extInfo;
1035 | }
1036 |
1037 |
1038 | public String getInternationalOrganizationCode() {
1039 | return internationalOrganizationCode;
1040 | }
1041 |
1042 |
1043 | public void setInternationalOrganizationCode(
1044 | String internationalOrganizationCode) {
1045 | this.internationalOrganizationCode = internationalOrganizationCode;
1046 | }
1047 |
1048 |
1049 | public String getPublishBank() {
1050 | return publishBank;
1051 | }
1052 |
1053 |
1054 | public void setPublishBank(String publishBank) {
1055 | this.publishBank = publishBank;
1056 | }
1057 |
1058 |
1059 | public String getReceiveBank() {
1060 | return receiveBank;
1061 | }
1062 |
1063 |
1064 | public void setReceiveBank(String receiveBank) {
1065 | this.receiveBank = receiveBank;
1066 | }
1067 |
1068 |
1069 |
1070 | public String getSettlementdate() {
1071 | return settlementdate;
1072 | }
1073 |
1074 |
1075 | public void setSettlementdate(String settlementdate) {
1076 | this.settlementdate = settlementdate;
1077 | }
1078 |
1079 | public byte[] getParameterInfo() {
1080 | return parameterInfo;
1081 | }
1082 |
1083 | public void setParameterInfo(byte[] parameterInfo) {
1084 | this.parameterInfo = parameterInfo;
1085 | }
1086 |
1087 | public String getAcceptorSign() {
1088 | return acceptorSign;
1089 | }
1090 |
1091 |
1092 | public void setAcceptorSign(String acceptorSign) {
1093 | this.acceptorSign = acceptorSign;
1094 | }
1095 |
1096 |
1097 | public String getRetrievalRefNum() {
1098 | return retrievalRefNum;
1099 | }
1100 |
1101 |
1102 | public void setRetrievalRefNum(String retrievalRefNum) {
1103 | this.retrievalRefNum = retrievalRefNum;
1104 | }
1105 |
1106 |
1107 | public byte[] getClientKey() {
1108 | return clientKey;
1109 | }
1110 |
1111 |
1112 | public void setClientKey(byte[] clientKey) {
1113 | this.clientKey = clientKey;
1114 | }
1115 |
1116 |
1117 |
1118 | public String getOriginalBatchNumber() {
1119 | return originalBatchNumber;
1120 | }
1121 |
1122 | public void setOriginalBatchNumber(String originalBatchNumber) {
1123 | this.originalBatchNumber = originalBatchNumber;
1124 | }
1125 |
1126 | public String getOriginalTraceNumber() {
1127 | return originalTraceNumber;
1128 | }
1129 |
1130 | public void setOriginalTraceNumber(String originalTraceNumber) {
1131 | this.originalTraceNumber = originalTraceNumber;
1132 | }
1133 |
1134 | public String getOriginalTransactionDate() {
1135 | return originalTransactionDate;
1136 | }
1137 |
1138 | public void setOriginalTransactionDate(String originalTransactionDate) {
1139 | this.originalTransactionDate = originalTransactionDate;
1140 | }
1141 |
1142 | public String getCardValidate() {
1143 | return cardValidate;
1144 | }
1145 | public void setCardValidate(String cardValidate) {
1146 | this.cardValidate = cardValidate;
1147 | }
1148 | public String getCurrencyTransactionCode() {
1149 | return currencyTransactionCode;
1150 | }
1151 | public void setCurrencyTransactionCode(String currencyTransactionCode) {
1152 | this.currencyTransactionCode = currencyTransactionCode;
1153 | }
1154 | public byte[] getMac() {
1155 | return mac;
1156 | }
1157 | public void setMac(byte[] mac) {
1158 | this.mac = mac;
1159 | }
1160 | public byte[] getPinData() {
1161 | return pinData;
1162 | }
1163 | public void setPinData(byte[] pinData) {
1164 | this.pinData = pinData;
1165 | }
1166 | public String getPointServiceCode() {
1167 | return pointServiceCode;
1168 | }
1169 | public void setPointServiceCode(String pointServiceCode) {
1170 | this.pointServiceCode = pointServiceCode;
1171 | }
1172 | public String getPointServiceInputMode() {
1173 | return pointServiceInputMode;
1174 | }
1175 | public void setPointServiceInputMode(String pointServiceInputMode) {
1176 | this.pointServiceInputMode = pointServiceInputMode;
1177 | }
1178 | public String getPointServicePINCode() {
1179 | return pointServicePINCode;
1180 | }
1181 | public void setPointServicePINCode(String pointServicePINCode) {
1182 | this.pointServicePINCode = pointServicePINCode;
1183 | }
1184 | public String getPriAccountNumber() {
1185 | return priAccountNumber;
1186 | }
1187 | public void setPriAccountNumber(String priAccountNumber) {
1188 | this.priAccountNumber = priAccountNumber;
1189 | }
1190 | public String getProcess() {
1191 | return process;
1192 | }
1193 | public void setProcess(String process) {
1194 | this.process = process;
1195 | }
1196 | public String getSecurityControlInfo() {
1197 | return securityControlInfo;
1198 | }
1199 | public void setSecurityControlInfo(String securityControlInfo) {
1200 | this.securityControlInfo = securityControlInfo;
1201 | }
1202 | public String getTrack2Data() {
1203 | return track2Data;
1204 | }
1205 | public void setTrack2Data(String track2Data) {
1206 | this.track2Data = track2Data;
1207 | }
1208 | public String getTrack3Data() {
1209 | return track3Data;
1210 | }
1211 | public void setTrack3Data(String track3Data) {
1212 | this.track3Data = track3Data;
1213 | }
1214 | public String getTransactionAmount() {
1215 | return transactionAmount;
1216 | }
1217 | public void setTransactionAmount(String transactionAmount) {
1218 | this.transactionAmount = transactionAmount;
1219 | }
1220 |
1221 |
1222 |
1223 |
1224 | /**
1225 | * @brief
1226 | * 受卡方系统跟踪号
1227 | *
1228 | * @return
1229 | */
1230 | public int getTraceNumber() {
1231 | return Integer.parseInt(traceNumber);
1232 | }
1233 |
1234 |
1235 | /**
1236 | * @brief
1237 | * 设置受卡方系统跟踪号
1238 | *
1239 | * @param traceNumber
1240 | */
1241 | public void setTraceNumber(String traceNumber) {
1242 | this.traceNumber = traceNumber;
1243 | }
1244 |
1245 | /**
1246 | * @brief
1247 | * 设置受卡方系统跟踪号
1248 | *
1249 | * @param traceNumber
1250 | */
1251 | public void setTraceNumber(int traceNumber) {
1252 | this.traceNumber = String.valueOf(traceNumber);
1253 | }
1254 |
1255 |
1256 | /**
1257 | * @brief
1258 | * 受卡机终端标识码
1259 | *
1260 | * @return
1261 | */
1262 | public String getServiceCode() {
1263 | return serviceCode;
1264 | }
1265 |
1266 |
1267 | /**
1268 | * @brief
1269 | * 设置受卡机终端标识码
1270 | *
1271 | * @param serviceCode
1272 | */
1273 | public void setServiceCode(String serviceCode) {
1274 | this.serviceCode = serviceCode;
1275 | }
1276 |
1277 |
1278 | /**
1279 | * @brief
1280 | * 受卡方标识码 商户编号
1281 | *
1282 | * @return
1283 | */
1284 | public String getCardAcptIdenCode() {
1285 | return cardAcptIdenCode;
1286 | }
1287 |
1288 |
1289 | /**
1290 | * @brief
1291 | * 设置受卡方标识码 商户编号
1292 | *
1293 | * @param cardAcptIdenCode
1294 | */
1295 | public void setCardAcptIdenCode(String cardAcptIdenCode) {
1296 | this.cardAcptIdenCode = cardAcptIdenCode;
1297 | }
1298 |
1299 |
1300 | /**
1301 | * @return cardAcptAddress
1302 | */
1303 |
1304 | public String getCardAcptAddress() {
1305 | return cardAcptAddress;
1306 | }
1307 |
1308 | /**
1309 | * @param cardAcptAddress 要设置的 cardAcptAddress
1310 | */
1311 | public void setCardAcptAddress(String cardAcptAddress) {
1312 | this.cardAcptAddress = cardAcptAddress;
1313 | }
1314 |
1315 | /**
1316 | * @brief
1317 | * 获得应答码
1318 | *
1319 | * @return
1320 | */
1321 | public String getResponseCode() {
1322 | return responseCode;
1323 | }
1324 |
1325 |
1326 | /**
1327 | * @brief
1328 | * 设置应答码
1329 | *
1330 | * @param responseCode
1331 | */
1332 | public void setResponseCode(String responseCode) {
1333 | this.responseCode = responseCode;
1334 | }
1335 |
1336 | public String getLocalTransTime() {
1337 | return localTransTime;
1338 | }
1339 |
1340 |
1341 | public void setLocalTransTime(String localTransTime) {
1342 | this.localTransTime = localTransTime;
1343 | }
1344 |
1345 |
1346 | public String getLocalTransDate() {
1347 | return localTransDate;
1348 | }
1349 |
1350 |
1351 | public void setLocalTransDate(String localTransDate) {
1352 | this.localTransDate = localTransDate;
1353 | }
1354 |
1355 |
1356 | /**
1357 | * @brief
1358 | * 批次号
1359 | *
1360 | * @return
1361 | */
1362 | public int getBatchNumber() {
1363 | return Integer.parseInt(batchNumber);
1364 | }
1365 |
1366 | /**
1367 | * @brief
1368 | * 设置批次号
1369 | *
1370 | * @param batchNumber
1371 | */
1372 | public void setBatchNumber(String batchNumber) {
1373 | this.batchNumber = batchNumber;
1374 | }
1375 |
1376 | /**
1377 | * @brief
1378 | * 设置批次号
1379 | *
1380 | * @param batchNumber
1381 | */
1382 | public void setBatchNumber(int batchNumber) {
1383 | this.batchNumber = String.valueOf(batchNumber);
1384 | }
1385 |
1386 | /**
1387 | * @brief
1388 | * 交易类型
1389 | *
1390 | * @return
1391 | */
1392 | // public abstract String getTransactionType();
1393 |
1394 | /**
1395 | * @brief
1396 | * 设置交易类型
1397 | *
1398 | * @param transactionType
1399 | */
1400 | public void setTransactionType(String transactionType) {
1401 | this.transactionType = transactionType;
1402 | }
1403 |
1404 | public String getMsgTypeID() {
1405 | return msgTypeID;
1406 | }
1407 |
1408 | public void setMsgTypeID(String msgTypeID) {
1409 | this.msgTypeID = msgTypeID;
1410 | }
1411 |
1412 | public String getForeignCardCreditTotalAmount() {
1413 | return foreignCardCreditTotalAmount;
1414 | }
1415 |
1416 | public void setForeignCardCreditTotalAmount(String foreignCardCreditTotalAmount) {
1417 | this.foreignCardCreditTotalAmount = foreignCardCreditTotalAmount;
1418 | }
1419 |
1420 | public String getForeignCardCreditTotalCount() {
1421 | return foreignCardCreditTotalCount;
1422 | }
1423 |
1424 | public void setForeignCardCreditTotalCount(String foreignCardCreditTotalCount) {
1425 | this.foreignCardCreditTotalCount = foreignCardCreditTotalCount;
1426 | }
1427 |
1428 | public String getForeignCardLoanTotalAmount() {
1429 | return foreignCardLoanTotalAmount;
1430 | }
1431 |
1432 | public void setForeignCardLoanTotalAmount(String foreignCardLoanTotalAmount) {
1433 | this.foreignCardLoanTotalAmount = foreignCardLoanTotalAmount;
1434 | }
1435 |
1436 | public String getForeignCardLoanTotalCount() {
1437 | return foreignCardLoanTotalCount;
1438 | }
1439 |
1440 | public void setForeignCardLoanTotalCount(String foreignCardLoanTotalCount) {
1441 | this.foreignCardLoanTotalCount = foreignCardLoanTotalCount;
1442 | }
1443 |
1444 |
1445 |
1446 | public String getLocalCardCreditTotalAmount() {
1447 | return localCardCreditTotalAmount;
1448 | }
1449 |
1450 | public void setLocalCardCreditTotalAmount(String localCardCreditTotalAmount) {
1451 | this.localCardCreditTotalAmount = localCardCreditTotalAmount;
1452 | }
1453 |
1454 | public String getLocalCardCreditTotalCount() {
1455 | return localCardCreditTotalCount;
1456 | }
1457 |
1458 | public void setLocalCardCreditTotalCount(String localCardCreditTotalCount) {
1459 | this.localCardCreditTotalCount = localCardCreditTotalCount;
1460 | }
1461 |
1462 | public String getLocalCardLoanTotalAmount() {
1463 | return localCardLoanTotalAmount;
1464 | }
1465 |
1466 | public void setLocalCardLoanTotalAmount(String localCardLoanTotalAmount) {
1467 | this.localCardLoanTotalAmount = localCardLoanTotalAmount;
1468 | }
1469 |
1470 | public String getLocalCardLoanTotalCount() {
1471 | return localCardLoanTotalCount;
1472 | }
1473 |
1474 | public void setLocalCardLoanTotalCount(String localCardLoanTotalCount) {
1475 | this.localCardLoanTotalCount = localCardLoanTotalCount;
1476 | }
1477 |
1478 | public String getForeignCardCheckAccountCode() {
1479 | return foreignCardCheckAccountCode;
1480 | }
1481 |
1482 | public void setForeignCardCheckAccountCode(String foreignCardCheckAccountCode) {
1483 | this.foreignCardCheckAccountCode = foreignCardCheckAccountCode;
1484 | }
1485 |
1486 | public String getLocalCardCheckAccountCode() {
1487 | return localCardCheckAccountCode;
1488 | }
1489 |
1490 | public void setLocalCardCheckAccountCode(String localCardCheckAccountCode) {
1491 | this.localCardCheckAccountCode = localCardCheckAccountCode;
1492 | }
1493 |
1494 | public String getTransactionDetial() {
1495 | return transactionDetial;
1496 | }
1497 |
1498 | public void setTransactionDetial(String transactionDetial) {
1499 | this.transactionDetial = transactionDetial;
1500 | }
1501 |
1502 | public String getAuthorizationOrganization() {
1503 | return authorizationOrganization;
1504 | }
1505 |
1506 | public void setAuthorizationOrganization(String authorizationOrganization) {
1507 | this.authorizationOrganization = authorizationOrganization;
1508 | }
1509 |
1510 | public String getAuthorizationType() {
1511 | return authorizationType;
1512 | }
1513 |
1514 | public void setAuthorizationType(String authorizationType) {
1515 | this.authorizationType = authorizationType;
1516 | }
1517 | public int getTransactionType() {
1518 | return Integer.parseInt(transactionType);
1519 | }
1520 |
1521 | /**
1522 | * 原授权码.在预授权完成联机的时候由EFTModoule进行设置!打印的时候需要使用
1523 | */
1524 | private String originalAuthorizationCode;
1525 |
1526 | public String getOriginalAuthorizationCode() {
1527 | return originalAuthorizationCode;
1528 | }
1529 |
1530 | public void setOriginalAuthorizationCode(String originalAuthorizationCode) {
1531 | this.originalAuthorizationCode = originalAuthorizationCode;
1532 | }
1533 |
1534 | /**
1535 | * 原系统参考号.在退货的时候由EFTModoule进行设置!打印的时候需要使用
1536 | */
1537 | private String originalRetrievalRef;
1538 |
1539 | public String cardHolderName;
1540 |
1541 | public String idType;
1542 |
1543 | public String idNumber;
1544 |
1545 | public String mobileNumber;
1546 |
1547 | public String smartCardSerialNumber;
1548 |
1549 | public String getOriginalRetrievalRef() {
1550 | return originalRetrievalRef;
1551 | }
1552 |
1553 | public void setOriginalRetrievalRef(String originalRetrievalRef) {
1554 | this.originalRetrievalRef = originalRetrievalRef;
1555 | }
1556 |
1557 | public int getUniqueID() {
1558 | return uniqueID;
1559 | }
1560 |
1561 | public void setUniqueID(int uniqueID) {
1562 | this.uniqueID = uniqueID;
1563 | }
1564 |
1565 | public String getMerchantName() {
1566 | return merchantName;
1567 | }
1568 |
1569 | public void setMerchantName(String merchantName) {
1570 | this.merchantName = merchantName;
1571 | }
1572 |
1573 | /**
1574 | * @return the cardHolderName
1575 | */
1576 | public String getCardHolderName() {
1577 | return cardHolderName;
1578 | }
1579 |
1580 | /**
1581 | * @param cardHolderName the cardHolderName to set
1582 | */
1583 | public void setCardHolderName(String cardHolderName) {
1584 | this.cardHolderName = cardHolderName;
1585 | }
1586 |
1587 | /**
1588 | * @return the idNumber
1589 | */
1590 | public String getIdNumber() {
1591 | return idNumber;
1592 | }
1593 |
1594 | /**
1595 | * @param idNumber the idNumber to set
1596 | */
1597 | public void setIdNumber(String idNumber) {
1598 | this.idNumber = idNumber;
1599 | }
1600 |
1601 | /**
1602 | * @return the idType
1603 | */
1604 | public String getIdType() {
1605 | return idType;
1606 | }
1607 |
1608 | /**
1609 | * @param idType the idType to set
1610 | */
1611 | public void setIdType(String idType) {
1612 | this.idType = idType;
1613 | }
1614 |
1615 | /**
1616 | * @return the mobileNumber
1617 | */
1618 | public String getMobileNumber() {
1619 | return mobileNumber;
1620 | }
1621 |
1622 | /**
1623 | * @param mobileNumber the mobileNumber to set
1624 | */
1625 | public void setMobileNumber(String mobileNumber) {
1626 | this.mobileNumber = mobileNumber;
1627 | }
1628 |
1629 |
1630 | /**
1631 | * @return the smartCardSerialNumber
1632 | */
1633 | public String getSmartCardSerialNumber() {
1634 | return smartCardSerialNumber;
1635 | }
1636 |
1637 | /**
1638 | * @param smartCardSerialNumber the smartCardSerialNumber to set
1639 | */
1640 | public void setSmartCardSerialNumber(String smartCardSerialNumber) {
1641 | this.smartCardSerialNumber = smartCardSerialNumber;
1642 | }
1643 | }
1644 |
--------------------------------------------------------------------------------
/Encrypt.java:
--------------------------------------------------------------------------------
1 | package com.zj.qcup.util.iso8583;
2 |
3 | import com.zj.core.web.interceptor.SysOutInterceptor;
4 |
5 |
6 |
7 | /**
8 | * @author wangl
9 | *
10 | */
11 | public class Encrypt {
12 |
13 | public static final int SUFFIX = 1; // 后面补零
14 |
15 | public static final int PREFIX = 2; // 前面补零
16 |
17 |
18 |
19 | /**
20 | * @brief
21 | * 用主密钥加密mak,pik,带checkvalue
22 | *
23 | * @param mak
24 | * @param kek
25 | * @return
26 | */
27 | public static byte[] encryptKey(byte[] key,byte[] kek) {
28 | byte[] out = new byte[12];
29 | System.arraycopy(encrypt(key,kek),0,out,0,8);
30 | System.arraycopy(encrypt(new byte[8], key),0,out,8,4);
31 | return out;
32 | }
33 |
34 | /**
35 | * des加密
36 | *
37 | *
38 | * @param input
39 | * @param key
40 | * @return
41 | */
42 | public static byte[] encrypt(byte[] input, byte[] key) {
43 | long[] keynum = new long[16];
44 | Des.des_set_key(key, keynum);
45 | byte[] encypted = new byte[8];
46 | Des.ecb_encrypt(input, encypted, keynum, true);
47 | return encypted;
48 | }
49 |
50 | /**
51 | * des解密
52 | *
53 | * @param input
54 | * @param key
55 | * @return
56 | */
57 | public static byte[] decrypt(byte[] input, byte[] key) {
58 | long[] keynum = new long[16];
59 | Des.des_set_key(key, keynum);
60 | byte[] encypted = new byte[8];
61 | Des.ecb_encrypt(input, encypted, keynum, false);
62 | return encypted;
63 | }
64 |
65 | /**
66 | * 3DES加密
67 | * @param input 要加密数据
68 | * @param key 密钥
69 | * @return
70 | */
71 | public static byte[] TriDESencrypt(byte[] input,byte[] key){
72 | byte[] key1 = new byte[8];
73 | byte[] key2 = new byte[8];
74 | System.arraycopy(key, 0, key1, 0, key1.length);
75 | System.arraycopy(key, 8, key2, 0, key2.length);
76 | byte[] ret = encrypt(input, key1);
77 | ret = decrypt(ret, key2);
78 | return encrypt(ret, key1);
79 | }
80 |
81 | /**
82 | * 3DES加密
83 | * @param input 要解密数据
84 | * @param key 密钥
85 | * @return
86 | */
87 | public static byte[] TriDESdecrypt(byte[] input,byte[] key){
88 | byte[] key1 = new byte[8];
89 | byte[] key2 = new byte[8];
90 | System.arraycopy(key, 0, key1, 0, key1.length);
91 | System.arraycopy(key, 8, key2, 0, key2.length);
92 | byte[] ret = decrypt(input, key1);
93 | ret = encrypt(ret, key2);
94 | return decrypt(ret, key1);
95 | }
96 |
97 | /**
98 | * ECB加密
99 | *
100 | * @param input
101 | * @param MAK
102 | * @return
103 | */
104 | public static byte[] ECB(byte[] input, byte[] MAK) {
105 | // -- P1&&P2
106 | int len = input.length / 8;
107 | if (len < 8 || input.length % 8 != 0)
108 | len++;
109 |
110 | byte[] tem = new byte[len * 8];
111 | System.arraycopy(input, 0, tem, 0, input.length);
112 |
113 | input = tem;
114 |
115 | byte[] M1 = new byte[8];
116 | System.arraycopy(input, 0, M1, 0, 8);
117 | byte[] MB = new byte[8];
118 | for (int i = 1; i < len; i++) {
119 | System.arraycopy(input, 8 * i, MB, 0, 8);
120 | M1 = XOR(M1, MB);
121 | }
122 |
123 | byte[] result = M1;
124 | // --p3 2hex
125 | String block = byte2hex(result);
126 | // --p4 MAK encrypt
127 | byte[] b1 = encrypt(block.substring(0, 8).getBytes(), MAK);
128 | // -p5 XOR
129 | byte[] tempBlock = XOR(b1, block.substring(8).getBytes());
130 | // --p6 des
131 | byte[] b2 = encrypt(tempBlock, MAK);
132 | // --p7 2hex
133 | System.out.println("Mac密钥"+byte2hex(b2));
134 |
135 | byte[] out = byte2hex(b2).substring(0, 8).getBytes();
136 | return out;
137 | }
138 |
139 | /**
140 | * 格式化byte
141 | *
142 | * @param b
143 | * @return
144 | */
145 | private static String byte2hex(byte[] b) {
146 | char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
147 | 'B', 'C', 'D', 'E', 'F' };
148 | char[] out = new char[b.length * 2];
149 | for (int i = 0; i < b.length; i++) {
150 | byte c = b[i];
151 | out[i * 2] = Digit[(c >>> 4) & 0X0F];
152 | out[i * 2 + 1] = Digit[c & 0X0F];
153 | }
154 |
155 | return new String(out);
156 | }
157 |
158 |
159 | /**
160 | * 异或
161 | *
162 | * @param op1
163 | * @param op2
164 | * @return
165 | */
166 | private static byte[] XOR(byte[] op1, byte[] op2) {
167 | int len = op1.length;
168 | byte[] out = new byte[len];
169 | for (int i = 0; i < len; i++) {
170 | out[i] = (byte) (op1[i] ^ op2[i]);
171 | }
172 | return out;
173 | }
174 |
175 | public static void main(String[] args) {
176 | System.out.println(ArrayUtil.hexEncode(XOR(ArrayUtil.hexDecode("5E4C9485F7CEC4159B469B9B9B58FD4C"), ArrayUtil.hexDecode("B8630C695022C3E2950FAF1171810696"))));
177 | byte [] miyue = XOR(ArrayUtil.hexDecode("5E4C9485F7CEC4159B469B9B9B58FD4C"), ArrayUtil.hexDecode("B8630C695022C3E2950FAF1171810696"));
178 | System.out.println(ArrayUtil.hexEncode(TriDESencrypt(ArrayUtil.hexDecode("00000000"), miyue)));
179 | }
180 |
181 |
182 | /**
183 | * PIN加密
184 | * @param pin 密码
185 | * @param pan 卡号
186 | * @param pik Pik
187 | * @return
188 | */
189 | public static byte[] encryptPIN(String pin,String pan,byte[] pik) {
190 |
191 | //输入判断的防御式代码
192 | if (pin == null || pan == null || pik == null) {
193 | return null;
194 | }
195 |
196 | if (pan.length()<13) {
197 | return null;
198 | }
199 |
200 |
201 | pan = pan.substring(pan.length()-13,pan.length()-1);
202 |
203 | //获得PAN
204 | byte[] subedpan = new byte[8];
205 | byte[] input = ArrayUtil.hexDecode(pan);
206 | System.arraycopy(input, 0, subedpan, 2, 6);
207 |
208 | //获得PINBLOCK
209 | byte[] pinblock = new byte[8];
210 | // 填充FF
211 | for (int i = 0; i < pinblock.length; i++) {
212 | pinblock[i] = (byte) 0xFF;
213 | }
214 | int size = pin.length();
215 | String t;
216 | if (size <10) {
217 | t = "0"+size+pin;
218 | } else {
219 | t = size+pin;
220 | }
221 | byte [] p = ArrayUtil.hexDecode(t);
222 | System.arraycopy(p, 0, pinblock, 0, p.length);
223 |
224 | if (pik.length == 8) {
225 | return encrypt(XOR(pinblock, subedpan), pik);
226 | } else {
227 | return TriDESencrypt(XOR(pinblock, subedpan), pik);
228 | }
229 |
230 |
231 | }
232 |
233 |
234 |
235 | /**
236 | * 获得MAK
237 | *
238 | * @param key
239 | * masterkey
240 | * @param input
241 | * 完整数据
242 | * @param output
243 | * mak
244 | * @return
245 | * @throws Exception
246 | */
247 | public static byte[] mak(byte[] key, byte[] input) throws Exception {
248 | byte[] output = new byte[8];
249 | System.arraycopy(input, 12, output, 0, 8);
250 | byte[] checkValue = new byte[4];
251 | System.arraycopy(input, 20, checkValue, 0, 4);
252 | output = decrypt(output, key);
253 | // check valid
254 | byte[] value = encrypt(new byte[8], output);
255 | for (int i = 0; i < 4; i++) {
256 | if (checkValue[i] != value[i])
257 | throw new Exception();
258 | }
259 | // check over
260 | return output;
261 | }
262 |
263 | /**
264 | * 获得MAK
265 | *
266 | * @param key
267 | * masterkey
268 | * @param input
269 | * 完整数据
270 | * @param output
271 | * mak
272 | * @return
273 | * @throws Exception
274 | */
275 | public static byte[] mak16(byte[] key, byte[] input) throws Exception {
276 | byte[] output = new byte[16];
277 | System.arraycopy(input, 20, output, 0, 16);
278 | byte[] checkValue = new byte[4];
279 | System.arraycopy(input, 36, checkValue, 0, 4);
280 | output = TriDESdecrypt(output, key);
281 | // check valid
282 | byte[] value = encrypt(new byte[8], output);
283 | for (int i = 0; i < 4; i++) {
284 | if (checkValue[i] != value[i])
285 | throw new Exception();
286 | }
287 | // check over
288 | return output;
289 | }
290 |
291 |
292 |
293 |
294 | /**
295 | * 获得pik
296 | *
297 | * @param key
298 | * @param input
299 | * @param output
300 | * @return
301 | * @throws Exception
302 | */
303 | public static byte[] pik(byte[] key, byte[] input) throws Exception {
304 | byte[] pin = new byte[8];
305 | System.arraycopy(input, 0, pin, 0, 8);
306 | byte[] checkValue = new byte[4];
307 | System.arraycopy(input, 8, checkValue, 0, 4);
308 | pin = decrypt(pin, key);
309 | // check valid
310 | byte[] value = encrypt(new byte[8], pin);
311 | for (int i = 0; i < 4; i++) {
312 | if (checkValue[i] != value[i])
313 | throw new Exception();
314 | }
315 | // check over
316 | return pin;
317 | }
318 |
319 | /**
320 | * 获得pik
321 | *
322 | * @param key
323 | * @param input
324 | * @param output
325 | * @return
326 | * @throws Exception
327 | */
328 | public static byte[] pik16(byte[] key, byte[] input) throws Exception {
329 | byte[] pin1 = new byte[8];
330 | byte[] pin2 = new byte[8];
331 | System.arraycopy(input, 0, pin1, 0, 8);
332 | System.arraycopy(input, 8, pin2, 0, 8);
333 | byte[] checkValue = new byte[4];
334 | System.arraycopy(input, 16, checkValue, 0, 4);
335 | pin1 = TriDESdecrypt(pin1, key);
336 | pin2 = TriDESdecrypt(pin2, key);
337 | byte[] pin = new byte[16];
338 | System.arraycopy(pin1, 0, pin, 0, pin1.length);
339 | System.arraycopy(pin2, 0, pin, pin1.length, pin2.length);
340 |
341 | // check valid
342 | byte[] value = TriDESencrypt(new byte[8], pin);
343 | for (int i = 0; i < 4; i++) {
344 | if (checkValue[i] != value[i])
345 | throw new Exception();
346 | }
347 | // check over
348 | return pin;
349 | }
350 |
351 | }
352 |
--------------------------------------------------------------------------------
/EncryptionMachineUtil.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 银联加密机操作类
3 | * @author wangl
4 | *
5 | */
6 | public class EncryptionMachineUtil {
7 |
8 | /**
9 | * 获取SEK索引
10 | * @return
11 | */
12 | public static String getSek(){
13 | return "S0012";
14 | }
15 |
16 | /**
17 | * 下载MAK密钥密文
18 | * @return
19 | */
20 | public static String getMak(){
21 | String mak = "";
22 | return mak;
23 | }
24 |
25 |
26 | /**
27 | * MAC计算
28 | * @param sek
29 | * @param mak
30 | * @param data
31 | * @return
32 | */
33 | public static String mac(String sek, String mak,String data){
34 | String mac = "";
35 | return mac;
36 | }
37 |
38 | /**
39 | * MAC验证
40 | * @param sek
41 | * @param mak
42 | * @param mac
43 | * @param data
44 | * @return
45 | */
46 | public static boolean mac(String sek, String mak,String mac,String data){
47 | boolean b = false;
48 | return b;
49 | }
50 |
51 |
52 | }
53 |
--------------------------------------------------------------------------------
/GroupField.java:
--------------------------------------------------------------------------------
1 | /**
2 | * $Log: GroupField.java,v $
3 | * Revision 1.2 2007/11/13 06:36:54 wangl
4 | * 同步代码
5 | *
6 | * Revision 1.4 2007/11/09 07:10:50 wangl
7 | * 加入适当的注释
8 | *
9 | * Revision 1.3 2007/11/07 06:36:51 wangl
10 | * 修改加入空字段保护
11 | *
12 | * Revision 1.2 2007/11/07 02:28:54 wangl
13 | * 修改一些小错误
14 | *
15 | * Revision 1.1 2007/11/02 07:16:55 wangl
16 | * 添加新的重构後的代码
17 | *
18 | */
19 |
20 | package com.zj.qcup.util.iso8583;
21 |
22 | import java.io.ByteArrayOutputStream;
23 | import java.io.IOException;
24 | import java.io.InputStream;
25 | import java.io.OutputStream;
26 | import java.util.ArrayList;
27 | import java.util.List;
28 |
29 | /**
30 | * @brief
31 | * 32 | * 字段数组处理基类 33 | *
34 | * 35 | * 字段数组处理基类 36 | * 37 | * @author wangl 38 | * @version eJPos SDK1.0 39 | * @see 40 | * @since 2007-10-26 41 | */ 42 | 43 | public class GroupField extends MutableField { 44 | 45 | private ArrayList array = new ArrayList(); 46 | 47 | public GroupField(int bit, int length, int wide, AField[] fields,boolean isMac) { 48 | super(bit, null, length, true, null, wide,isMac); 49 | if(fields != null){ 50 | for (int i = 0; i < fields.length; i++) { 51 | array.add(fields[i]); 52 | } 53 | } 54 | } 55 | 56 | public AField[] getFields() { 57 | return (AField[]) array.toArray(new AField[]{}); 58 | } 59 | 60 | 61 | public boolean pack(EFTMessage msg, OutputStream out,ListISO8583包解析
22 | * 23 | * ISO8583包 24 | * 25 | * @author wangl 26 | * @version eJPos SDK1.0 27 | * @see 28 | * @since 2007-9-6 29 | */ 30 | 31 | 32 | public class ISO8583Message { 33 | 34 | 35 | byte[] msgData; 36 | 37 | byte[] tpdu = new byte[5]; 38 | 39 | byte[] head = new byte[6]; 40 | 41 | /** 42 | * @brief 把接受到的数据封装为Iso8583包对象 43 | * 44 | * @param data 45 | * @return 46 | */ 47 | public ISO8583Message(byte[] revdata) { 48 | this.msgData = revdata; 49 | } 50 | 51 | public ISO8583Message(byte[] data,byte[] tpdu) { 52 | this.msgData = data; 53 | this.tpdu = tpdu; 54 | } 55 | 56 | public ISO8583Message() { 57 | // TODO 自动生成构造函数存根 58 | } 59 | 60 | /** 61 | * @brief 62 | * 当前包的MsgID 63 | * 64 | * @return 65 | */ 66 | public String getMsgId(){ 67 | byte[] tmp = new byte[2]; 68 | System.arraycopy(msgData, 0, tmp, 0, 2); 69 | return byte2hex(tmp); 70 | } 71 | 72 | private String byte2hex(byte[] b) { 73 | char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 74 | 'B', 'C', 'D', 'E', 'F' }; 75 | char[] out = new char[b.length * 2]; 76 | for (int i = 0; i < b.length; i++) { 77 | byte c = b[i]; 78 | out[i * 2] = Digit[(c >>> 4) & 0X0F]; 79 | out[i * 2 + 1] = Digit[c & 0X0F]; 80 | } 81 | return new String(out); 82 | } 83 | 84 | /** 85 | * @return 86 | * @brief 87 | * 获得byte数据 88 | * 89 | */ 90 | public byte[] getBytes() { 91 | return msgData; 92 | } 93 | 94 | 95 | 96 | public void setBytes(byte[] b) { 97 | this.msgData = b; 98 | } 99 | 100 | public String getTPDU() { 101 | return ISO8583Util.compressedBCD2String(head);//byte2hex(head); 102 | } 103 | 104 | 105 | 106 | 107 | 108 | } 109 | -------------------------------------------------------------------------------- /ISO8583Parser.java: -------------------------------------------------------------------------------- 1 | import java.io.ByteArrayInputStream; 2 | import java.io.ByteArrayOutputStream; 3 | import java.io.IOException; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import com.unionpay.common.MacEncryptdllUtils; 7 | import com.unionpay.common.iso8583.DataConverter; 8 | import com.zj.core.log.SnakeLogger; 9 | import com.zj.core.web.SnakePlatform; 10 | import com.zj.qcup.QCUP; 11 | /** 12 | * 13 | * @brief 14 | *15 | * ISO8583数据解析类 16 | *
17 | * 18 | * 负责打包成ISO8583数据包和解包成ISO8583数据的64个域, 19 | * 要打包的数据不包括协议部分和TPDU数据部分之用消息类型,位图和其他域 20 | * 21 | * @author wangl 22 | * @version eJPos SDK1.0 23 | * @see 24 | * @since 2007-7-6 25 | */ 26 | public class ISO8583Parser { 27 | 28 | private SnakeLogger logger = SnakePlatform.getLogger(QCUP.class); 29 | 30 | public ISO8583Parser() { 31 | 32 | } 33 | 34 | /** 35 | * 36 | * @param eftMessage 包数据 37 | * @param msgStructure 包结构 38 | * @param sek SEK索引 39 | * @param mak MAK密钥密文 40 | * @param isTest 是否使用软加密 41 | * @return 42 | */ 43 | public ISO8583Message pack(EFTMessage eftMessage,AField msgStructure[], String sek,String mak, boolean isUsedSoftEncr,String tmpKey,String tmpMacKey,String interfaceName,boolean isChannel) { 44 | StringBuffer sendLog = new StringBuffer(); 45 | sendLog.append("\n"); 46 | sendLog.append("============================================================================================"); 47 | sendLog.append("\n\n"); 48 | sendLog.append(">>发送的报文 : "+interfaceName+"\n"); 49 | sendLog.append(">>域信息"+"\n"); 50 | byte[] bitMap = new byte[16]; 51 | ByteArrayOutputStream out = new ByteArrayOutputStream(); 52 | String msgTYPE = eftMessage.getMsgTypeID(); 53 | sendLog.append("[1] "+msgTYPE+"\n"); 54 | byte[] msgID = null; 55 | List9 | * ISO8583数据包相关工具类 10 | *
11 | * 12 | * 将数据转换为bcd和反转bcd为字符串相关功能 13 | * 14 | * @author wangl 15 | * @version eJPos SDK1.0 16 | * @see 17 | * @since 2007-7-6 18 | */ 19 | public class ISO8583Util { 20 | public static final int SUFFIX = 1; // 后面补位 21 | 22 | public static final int PREFIX = 2; // 前面补位 23 | 24 | /** 25 | * 26 | * 把整数转换成字节数组中指定偏移量处的连续四个字节。没有符号限制。 27 | * 28 | * @param num 29 | * 进行转换int类型 30 | * @param datas 31 | * 转换后放入的缓冲 32 | * @param offset 33 | * 缓冲的偏移点 34 | * @return null 35 | * @throws null 36 | */ 37 | 38 | public static void IntToByteArray(int num, byte[] datas, int offset) { 39 | 40 | datas[offset] = (byte) (num >> 24); 41 | 42 | datas[offset + 1] = (byte) (num >> 16); 43 | 44 | datas[offset + 2] = (byte) (num >> 8); 45 | 46 | datas[offset + 3] = (byte) (num); 47 | 48 | } 49 | 50 | /** 51 | * 将bcd码转换为字符串 52 | * 53 | * @param b 54 | * @return 55 | */ 56 | public static String compressedBCD2String(byte[] b) { 57 | StringBuffer buffer = new StringBuffer(); 58 | byte bit = 0; 59 | for (int i = 0; i < b.length; i++) { 60 | bit = (byte) ((b[i] >> 4) & 0xf); 61 | buffer.append(Integer.toHexString(bit)); 62 | bit = (byte) ((b[i]) & 0xf); 63 | buffer.append(Integer.toHexString(bit)); 64 | } 65 | return buffer.toString(); 66 | } 67 | 68 | /** 69 | * @brief 将两个压缩式BCD码转换为int 70 | * 71 | * @param a 72 | * @param b 73 | * @return 74 | */ 75 | public static int BCD2Integer(byte a, byte b) { 76 | return (((a >> 4) & 0x0f) * 1000) + (((a) & 0x0f) * 100) 77 | + (((b >> 4) & 0x0f) * 10) + ((b) & 0x0f); 78 | } 79 | 80 | /** 81 | * 构造bcd形式的字节数组,如"123456"会转化为一个字节数组,0x12,0x34,0x56 82 | * 83 | * @param pin 84 | * 进行转换的数组 85 | * @mode 补零的模式 1为补零到后面,2位补零到前面 86 | * @return 转换后的BCD数组 87 | * @throws null 88 | */ 89 | public static byte[] createBCDByteArray(String pin, int mode) { 90 | if ((pin.length() % 2) != 0) { 91 | if (mode == ISO8583Util.PREFIX) { 92 | pin = "0" + pin; 93 | }else{ 94 | pin = pin + "0"; 95 | } 96 | } 97 | 98 | byte[] pinArray = pin.getBytes(); 99 | for (int i = 0; i < pinArray.length; i++) { 100 | pinArray[i] -= '0'; 101 | } 102 | byte[] bcdPin = getCompressedBCDArray(pinArray,SUFFIX); 103 | return bcdPin; 104 | } 105 | 106 | /** 107 | * 非压缩式转化为压缩式 得到压缩式bcd码的字节数组 108 | * 109 | * @param src 110 | * 要转化的非压缩式字节数组 111 | * @return 112 | */ 113 | public static byte[] getCompressedBCDArray(byte[] src,int mode) { 114 | 115 | int desLength = 0; 116 | if (src.length % 2 == 0) { 117 | desLength = src.length ; 118 | }else{ 119 | desLength = src.length+1; 120 | } 121 | byte[] desBytes = format(src,desLength,mode,(byte)0); 122 | byte[] des = new byte[desLength/2]; 123 | for (int i = 0; i < des.length; i++) { 124 | des[i] = (byte) (desBytes[2 * i] << 4 | desBytes[2 * i + 1]); 125 | } 126 | 127 | return des; 128 | } 129 | 130 | /** 131 | * 132 | * @brief 校验 133 | * 134 | * @param data 135 | * @param length 136 | * @return 137 | */ 138 | public static byte getCheckSumBit(byte[] data, int length) { 139 | byte sumBit = 0; 140 | for (int i = 0; i < length; i++) { 141 | sumBit ^= data[i]; 142 | } 143 | return sumBit; 144 | } 145 | 146 | /** 147 | * 将字节数组中某位置1 148 | * 149 | * @param index 150 | */ 151 | public static byte[] setBit(byte[] bytes, int index)// 设置BIT MAP的第index位 152 | { 153 | int size = 8; 154 | int i = index / size;// 先看是哪个byte 155 | int j = index % size;// 再看是这个byte的第几位 156 | int mask = 0x80; 157 | if (j == 0) {// 如果刚好整除8,则要退一位 158 | j = size; 159 | i = i - 1; 160 | } 161 | 162 | mask >>= j - 1;// 右移j-1位作为或数; 163 | bytes[i] |= mask;// 作按位或,相当于置1 164 | return bytes; 165 | } 166 | 167 | 168 | 169 | /** 170 | * 判断该域是否有效 171 | * 172 | * @param index 173 | * @return 174 | */ 175 | public static boolean validateField(byte[] bytes, int index) { 176 | if (index > 128 || index < 1) 177 | return false; 178 | int i = index / 8;// 先看是哪个byte 179 | int j = index % 8;// 再看是这个byte的第几位 180 | byte b = bytes[i];// 取出这个bitmap的字节来判断 181 | b <<= j;// 左移n位,使要判断的这位升到第一位 182 | byte mask = (byte) 0x80; 183 | return (b & mask) == mask;// 判断左移后的值是否大于128,即该位是否为1 184 | 185 | } 186 | 187 | /** 188 | * 格式化字符串 189 | * 190 | * @param inStr 191 | * 输入字符串 192 | * @param length 193 | * 格式化长度 194 | * @param position 195 | * 对齐位置 196 | * @param stuffing 197 | * 填充字符 198 | * @return 经过格式化后的字符串 199 | */ 200 | public static String format(String inStr, int length, int position, 201 | char stuffing) { 202 | if (inStr == null) { 203 | inStr = ""; 204 | } 205 | if (inStr.length() >= length) { 206 | return inStr; 207 | } 208 | int blankSize = length - inStr.length(); 209 | StringBuffer out = new StringBuffer(blankSize); 210 | for (int i = 0; i < blankSize; i++) { 211 | out.append(stuffing); 212 | } 213 | 214 | switch (position) { 215 | case SUFFIX: { 216 | out.insert(0, inStr); 217 | break; 218 | } 219 | case PREFIX: 220 | out.append(inStr); 221 | break; 222 | default: { 223 | out.insert(0, inStr); 224 | break; 225 | } 226 | } 227 | return out.toString(); 228 | } 229 | 230 | 231 | 232 | 233 | 234 | 235 | /** 236 | * 格式化字符串 237 | * 238 | * @param inBytes 239 | * 输入byte数组 240 | * @param length 241 | * 格式化长度 242 | * @param position 243 | * 对齐位置 244 | * @param stuffing 245 | * 填充byte 246 | * @return 经过格式化后的byte数组 247 | */ 248 | public static byte[] format(byte[] inBytes, int length, int position, 249 | byte stuffing) { 250 | if (inBytes == null) { 251 | return null; 252 | } 253 | if (inBytes.length >= length) { 254 | return inBytes; 255 | } 256 | int blankSize = length - inBytes.length; 257 | byte[] out = new byte[blankSize + inBytes.length]; 258 | for (int i = 0; i < blankSize; i++) { 259 | out[i] = (stuffing); 260 | } 261 | 262 | switch (position) { 263 | case SUFFIX: { 264 | System.arraycopy(inBytes, 0, out, 0, inBytes.length); 265 | break; 266 | } 267 | case PREFIX: 268 | default: { 269 | System.arraycopy(inBytes, 0, out, blankSize, inBytes.length); 270 | } 271 | } 272 | return out; 273 | } 274 | 275 | /** 276 | * 生成bitMap的List 277 | * 278 | * @param bitMap 279 | * @return 280 | */ 281 | public static List generateBitMapIndex(byte[] bitMap) { 282 | ArrayList list = new ArrayList(); 283 | StringBuffer buf = new StringBuffer(); 284 | byte b = 0x0; 285 | for (int i = 0; i < 16; i++) { 286 | b = bitMap[i];// 从位图中取1 byte 287 | int mask = 0x80; 288 | for (int j = 0; j < 8; j++) { 289 | if ((b & mask) == mask)// 如果该位是1 290 | { 291 | int index = i * 8 + j + 1; 292 | if (index >= 0) { 293 | list.add(new Integer(index)); 294 | } 295 | buf.append("1"); 296 | }else { 297 | buf.append("0"); 298 | } 299 | mask >>= 1; 300 | } 301 | } 302 | return list; 303 | } 304 | 305 | /** 306 | * 判断这个域是否存在 307 | * 308 | * @param index 309 | * @return 310 | */ 311 | public boolean isExistIndex(byte[] bitMap, int index) { 312 | List list = generateBitMapIndex(bitMap); 313 | if (list.contains(new Integer(index))) { 314 | return true; 315 | } else { 316 | return false; 317 | } 318 | } 319 | 320 | /** 321 | * 322 | * 323 | * 将字符串数据转化为非压缩式BCD数组 324 | * 325 | * @param pin 326 | * @return 327 | */ 328 | public static byte[] createNotCompressedBCDArray(String pin) { 329 | if (pin != null) { 330 | byte[] b = pin.getBytes(); 331 | for (int i = 0; i < b.length; i++) { 332 | b[i] -= '0'; 333 | } 334 | return b; 335 | } else { 336 | return null; 337 | } 338 | } 339 | 340 | public static void main(String[] args) { 341 | byte[] b = createNotCompressedBCDArray("19"); 342 | } 343 | 344 | /** 345 | * 346 | * 347 | * 将压缩式字节数组转化为非压缩式字节数组 348 | * 349 | * @param src 350 | * 要转化的压缩式的字节数组 351 | * @return 352 | */ 353 | public static byte[] getNotCompressedBCDArray(byte[] src) { 354 | ByteArrayOutputStream out = new ByteArrayOutputStream(); 355 | for (int i = 0; i < src.length; i++) { 356 | byte desHigh = (byte) ((src[i] >> 4) & 0x0F); 357 | byte desLow = (byte) (src[i] & 0x0F); 358 | out.write(desHigh); 359 | out.write(desLow); 360 | } 361 | return out.toByteArray(); 362 | } 363 | 364 | /** 365 | * 366 | * 367 | * 将非压缩式BCD码转化为字符串 368 | * 369 | * @param value 370 | * 要转化的BCD码 371 | * @return 372 | */ 373 | public static String notCompressedBCD2String(byte[] value) { 374 | // TODO 自动生成方法存根 375 | 376 | StringBuffer buffer = new StringBuffer(); 377 | int des = 0; 378 | for (int i = 0; i < value.length; i++) { 379 | des = value[i] & 0x0F; 380 | buffer.append(des); 381 | } 382 | return buffer.toString(); 383 | } 384 | } 385 | -------------------------------------------------------------------------------- /MessageStructure.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Revision 1.10 2007/12/14 06:57:04 wangl 4 | * 预授权追加报文格式修改 5 | * 6 | */ 7 | 8 | import java.util.Hashtable; 9 | 10 | 11 | /** 12 | * @brief 13 | *消息结构定义
14 | * 15 | * 消息结构定义 16 | * 17 | * @author wangl 18 | * @version eJPos SDK1.0 19 | * @see 20 | * @since 2007-9-6 21 | */ 22 | 23 | public class MessageStructure { 24 | 25 | /** 26 | * POS消息结构 27 | */ 28 | @SuppressWarnings("rawtypes") 29 | private static final Hashtable map = new Hashtable(); 30 | private static final AField FIELD_11 = new BCDField(11,"受卡方系统跟踪号",6, true,"traceNumber",false); 31 | private static final AField FIELD_12 = new BCDField(12,"受卡方所在地时间", 6, true, "localTransTime",false); 32 | private static final AField FIELD_13 = new BCDField(13,"受卡方所在地日期", 4, true, "localTransDate",false); 33 | private static final AField FIELD_32 = new MutableBCDField(32,"受理方标识码", 11, true, "acceptorSign",2,false); 34 | private static final AField FIELD_37 = new ASCIIField(37,"检索参考号", 12, true, "retrievalRefNum",false); 35 | private static final AField FIELD_39 = new ASCIIField(39,"应答码", 2, true, "responseCode",false); 36 | private static final AField FIELD_41 = new ASCIIField(41,"受卡机终端标识码", 8, true, "serviceCode",false); 37 | private static final AField FIELD_42 = new ASCIIField(42,"受卡方标识码", 15, true, "cardAcptIdenCode",false); 38 | private static final AField FIELD_43 = new ASCIIField(43,"受卡方名称地址", 40, true, "cardAcptAddress",false); 39 | private static final AField FIELD_62_Key = new MutableBinaryField(62,"终端密钥", 24, false, "clientKey",3,false); 40 | private static final AField FIELD_62_Parameter = new MutableASCIIField(62,"终端参数信息", 160, true, "parameterInfo",3,false); 41 | private static final AField FIELD_62_status = new MutableASCIIField(62,"终端状态信息", 160, true, "parameterInfo",3,false); 42 | private static final AField FIELD_62_Identity = new MutableASCIIField(62,"身份认证信息", 22, false, "parameterInfo",3,false); 43 | private static final AField FIELD_60_1 = new BCDField(1,"交易类型码", 2, true, "transactionType",false); 44 | private static final AField FIELD_60_2 = new BCDField(2, "批次号", 6, true, "batchNumber",false); 45 | private static final AField FIELD_60_3 = new BCDField(3,"网络管理信息码",3, true, "netManageCode",false); 46 | private static final AField FIELD_OPCODE = new ASCIIField(1, "操作员代码", 3, false, "operatorCode",false); 47 | private static final AField FIELD_2 = new MutableBCDField(2, "主帐号", 19, false, "priAccountNumber",2,false); 48 | private static final AField FIELD_3 = new BCDField(3, "交易处理码", 6, true, "process",false); 49 | private static final AField FIELD_4= new BCDField(4, "交易金额",12, true, "transactionAmount",ISO8583Util.PREFIX,false); 50 | private static final AField FIELD_14= new BCDField(14, "卡有效期", 4, false, "cardValidate",false); 51 | private static final AField FIELD_22= new BCDField(22, "服务点输入方式", 3, true, "pointServiceInputMode",false); 52 | private static final AField FIELD_25= new BCDField(25, "服务点条件码", 2, true, "pointServiceCode",false); 53 | private static final AField FIELD_26= new BCDField(26, "服务点PIN获取码", 2, false, "pointServicePINCode",false); 54 | private static final AField FIELD_35= new MutableBCDField(35, "2磁道数据", 37, true, "track2Data",2,false); 55 | private static final AField FIELD_36= new MutableBCDField(36, "3磁道数据", 104, true, "track3Data",3,false); 56 | private static final AField FIELD_44= new MutableASCIIField(44, "附加响应数据", 19, true, "extInfo",2,false); 57 | private static final AField FIELD_49= new ASCIIField(49, "交易货币代码", 3, true, "currencyTransactionCode",false); 58 | private static final AField FIELD_52= new BinaryField(52, "个人标识数据码", 8, false, "pinData",false); 59 | private static final AField FIELD_53= new BCDField(53, "安全控制信息", 16, false, "securityControlInfo",false); 60 | private static final AField FIELD_64= new BinaryField(64, "消息鉴别码", 8, true, "mac",false); 61 | private static final AField FIELD_38= new ASCIIField(38, "授权应答码", 6, false, "authorizationIdentifyResCode",false); 62 | private static final AField FIELD_15= new BCDField(15, "清算日期", 4, false, "settlementdate",false); 63 | private static final AField FIELD_63_1 = new ASCIIField(1, "国际组织代码", 3, true, "internationalOrganizationCode",false); 64 | private static final AField FIELD_63_2 = new ASCIIField(2, "发卡行返回信息", 20, false, "publishBank",false); 65 | private static final AField FIELD_63_3 = new ASCIIField(3, "中国银联返回信息", 20, false, "chinaUnionPayInfo",false); 66 | private static final AField FIELD_63_4 = new ASCIIField(4, "收单行返回信息", 20, false, "receiveBank",false); 67 | private static final AField FIELD_61_1 = new BCDField(1, "原交易批次号", 6, false, "originalBatchNumber",false); 68 | private static final AField FIELD_61_2 = new BCDField(2, "原POS流水号", 6, false, "originalTraceNumber",false); 69 | private static final AField FIELD_61_3 = new BCDField(3, "原交易日期", 4, false, "originalTransactionDate",false); 70 | private static final AField FIELD_61_4 = new BCDField(4, "原授权方式", 2, false, "authorizationType",false); 71 | private static final AField FIELD_61_5 = new BCDField(5, "原授权机构", 11, false, "authorizationOrganization",false); 72 | private static final AField FIELD_54 = new MutableASCIIField(54,"附加金额",20,true,"balanceAmount",3,false); 73 | private static final AField FIELD_48_LocalCardLoanTotalAmount = new BCDField(1,"内卡借记总金额", 12, true, "localCardLoanTotalAmount",false); 74 | private static final AField FIELD_48_LocalCardLoanTotalCount = new BCDField(2, "内卡借记总笔数", 3, true, "localCardLoanTotalCount",false); 75 | private static final AField FIELD_48_LocalCardCreditTotalAmount = new BCDField(3, "内卡贷记总金额", 12, true, "localCardCreditTotalAmount",false); 76 | private static final AField FIELD_48_LocalCardCreditTotalCount = new BCDField(4, "内卡贷记总笔数", 3, true, "localCardCreditTotalCount",false); 77 | private static final AField FIELD_48_LocalCardCheckAccountCode = new BCDField(5, "内卡对账应答码", 1, true, "localCardCheckAccountCode",false); 78 | private static final AField FIELD_48_ForeignCardLoanTotalAmount = new BCDField(6, "外卡借记总金额", 12, true, "foreignCardLoanTotalAmount",false); 79 | private static final AField FIELD_48_ForeignCardLoanTotalCount = new BCDField(7,"外卡借记总笔数", 3, true, "foreignCardLoanTotalCount",false); 80 | private static final AField FIELD_48_ForeignCardCreditTotalAmount = new BCDField(8,"外卡贷记总金额", 12, true, "foreignCardCreditTotalAmount",false); 81 | private static final AField FIELD_48_ForeignCardCreditTotalCount = new BCDField(9,"外卡贷记总笔数", 3, true, "foreignCardCreditTotalCount",false); 82 | private static final AField FIELD_48_ForeignCardCheckAccountCode = new BCDField(10, "外卡对账应答码", 1, true, "foreignCardCheckAccountCode",false); 83 | private static final AField FIELD_48_TIP_AMOUNT = new MutableBCDField(48,"小费金额", 62, false, "transactionDetial",3,false); 84 | private static final AField FIELD_48_DETIAL = new MutableBCDField(48, "交易明細", 322, false, "transactionDetial",3,false); 85 | private static final AField FIELD_GROUP_60_1_2_3 = new BCDGroupField(60,11,3,new AField[]{FIELD_60_1,FIELD_60_2,FIELD_60_3,},false); 86 | private static final AField FIELD_GROUP_61_1_2 = new BCDGroupField(61,12,3,new AField[]{FIELD_61_1,FIELD_61_2},false); 87 | private static final AField FIELD_GROUP_48_TOTAL = new BCDGroupField(48,62,3,new AField[]{FIELD_48_LocalCardLoanTotalAmount,FIELD_48_LocalCardLoanTotalCount,FIELD_48_LocalCardCreditTotalAmount,FIELD_48_LocalCardCreditTotalCount,FIELD_48_LocalCardCheckAccountCode,FIELD_48_ForeignCardLoanTotalAmount,FIELD_48_ForeignCardLoanTotalCount,FIELD_48_ForeignCardCreditTotalAmount,FIELD_48_ForeignCardCreditTotalCount,FIELD_48_ForeignCardCheckAccountCode},false); 88 | private static final AField FIELD_GROUP_60_1_2 = new BCDGroupField(60,8,3,new AField[]{FIELD_60_1,FIELD_60_2},false); 89 | private static final AField FIELD_GROUP_63_1_2_3_4 = new ASCIIGroupField(63,63,3,new AField[]{FIELD_63_1,FIELD_63_2,FIELD_63_3,FIELD_63_4},false); 90 | private static final AField FIELD_GROUP_63_OPCODE = new ASCIIGroupField(63,3,3,new AField[]{FIELD_OPCODE},false); 91 | private static final AField FIELD_GROUP_63_InternationalOrganizationCode = new ASCIIGroupField(63,3,3,new AField[]{FIELD_63_1},false); 92 | private static final AField FIELD_GROUP_61_1_2_3 = new BCDGroupField(61,29,3,new AField[]{FIELD_61_1,FIELD_61_2,FIELD_61_3},false); 93 | private static final AField FIELD_GROUP_61_1_2_3_4_5 = new BCDGroupField(61,29,3,new AField[]{FIELD_61_1,FIELD_61_2,FIELD_61_3,FIELD_61_4,FIELD_61_5},false); 94 | 95 | 96 | public static final AField[] SingInReqMsg = new AField[]{ 97 | FIELD_11, 98 | FIELD_41, 99 | FIELD_42, 100 | FIELD_GROUP_60_1_2_3, 101 | FIELD_GROUP_63_OPCODE 102 | }; 103 | 104 | public static final AField[] SingInResMsg = new AField[]{ 105 | FIELD_11, 106 | FIELD_12, 107 | FIELD_13, 108 | FIELD_32, 109 | FIELD_37, 110 | FIELD_39, 111 | FIELD_41, 112 | FIELD_42, 113 | FIELD_GROUP_60_1_2_3, 114 | FIELD_62_Key 115 | }; 116 | 117 | public static final AField[] SingOutResMsg = new AField[]{ 118 | FIELD_11, 119 | FIELD_12, 120 | FIELD_13, 121 | FIELD_32, 122 | FIELD_37, 123 | FIELD_39, 124 | FIELD_41, 125 | FIELD_42, 126 | FIELD_GROUP_60_1_2_3, 127 | }; 128 | 129 | public static final AField[] SingOutReqMsg = new AField[]{ 130 | FIELD_11, 131 | FIELD_41, 132 | FIELD_42, 133 | FIELD_GROUP_60_1_2_3, 134 | }; 135 | 136 | public static final AField[] ParameterTransResMsg = new AField[]{ 137 | FIELD_12, 138 | FIELD_13, 139 | FIELD_37, 140 | FIELD_39, 141 | FIELD_41, 142 | FIELD_42, 143 | FIELD_GROUP_60_1_2_3, 144 | FIELD_62_Parameter 145 | }; 146 | 147 | 148 | public static final AField[] ParameterTransReqMsg = new AField[]{ 149 | FIELD_41, 150 | FIELD_42, 151 | FIELD_GROUP_60_1_2_3, 152 | 153 | }; 154 | 155 | public static final AField[] ResponseTestingResMsg = new AField[]{ 156 | FIELD_12, 157 | FIELD_13, 158 | FIELD_39, 159 | FIELD_41, 160 | FIELD_42, 161 | FIELD_GROUP_60_1_2_3, 162 | }; 163 | 164 | 165 | public static final AField[] ResponseTestingReqMsg = new AField[]{ 166 | FIELD_41, 167 | FIELD_42, 168 | FIELD_GROUP_60_1_2_3, 169 | }; 170 | 171 | 172 | public static final AField[] StatusReportResMsg = new AField[]{ 173 | FIELD_12, 174 | FIELD_13, 175 | FIELD_39, 176 | FIELD_41, 177 | FIELD_42, 178 | FIELD_GROUP_60_1_2_3, 179 | }; 180 | 181 | 182 | 183 | public static final AField[] StatusReportReqMsg = new AField[]{ 184 | FIELD_41, 185 | FIELD_42, 186 | FIELD_GROUP_60_1_2_3, 187 | FIELD_62_status, 188 | }; 189 | 190 | public static final AField[] PurchaseResMsg = new AField[]{ 191 | FIELD_2, 192 | FIELD_3, 193 | FIELD_4, 194 | FIELD_11, 195 | FIELD_12, 196 | FIELD_13, 197 | FIELD_14, 198 | FIELD_15, 199 | FIELD_25, 200 | FIELD_32, 201 | FIELD_37, 202 | FIELD_38, 203 | FIELD_39, 204 | FIELD_41, 205 | FIELD_42, 206 | FIELD_44, 207 | FIELD_49, 208 | FIELD_53, 209 | FIELD_GROUP_60_1_2, 210 | FIELD_GROUP_63_1_2_3_4, 211 | FIELD_64 212 | }; 213 | 214 | public static final AField[] PurchaseReqMsg = new AField[]{ 215 | FIELD_2, 216 | FIELD_3, 217 | FIELD_4, 218 | FIELD_11, 219 | FIELD_14, 220 | FIELD_22, 221 | FIELD_25, 222 | FIELD_26, 223 | FIELD_35, 224 | FIELD_36, 225 | FIELD_41, 226 | FIELD_42, 227 | FIELD_49, 228 | FIELD_52, 229 | FIELD_53, 230 | FIELD_GROUP_60_1_2, 231 | 232 | FIELD_64 233 | }; 234 | 235 | 236 | public static final AField[] PreAuthorizationResMsg = new AField[]{ 237 | FIELD_2, 238 | FIELD_3, 239 | FIELD_4, 240 | FIELD_11, 241 | FIELD_12, 242 | FIELD_13, 243 | FIELD_14, 244 | FIELD_15, 245 | FIELD_25, 246 | FIELD_32, 247 | FIELD_37, 248 | FIELD_38, 249 | FIELD_39, 250 | FIELD_41, 251 | FIELD_42, 252 | FIELD_44, 253 | FIELD_49, 254 | FIELD_53, 255 | FIELD_GROUP_60_1_2, 256 | FIELD_GROUP_63_1_2_3_4, 257 | FIELD_64 258 | 259 | }; 260 | 261 | 262 | 263 | public static final AField[] PreAuthorizationReqMsg = new AField[]{ 264 | FIELD_2, 265 | FIELD_3, 266 | FIELD_4, 267 | FIELD_11, 268 | FIELD_14, 269 | FIELD_22, 270 | FIELD_25, 271 | FIELD_26, 272 | FIELD_35, 273 | FIELD_36, 274 | FIELD_41, 275 | FIELD_42, 276 | FIELD_49, 277 | FIELD_52, 278 | FIELD_53, 279 | FIELD_GROUP_60_1_2, 280 | FIELD_64 281 | 282 | }; 283 | 284 | 285 | 286 | public static final AField[] PreAuthorizationIncreaseResMsg = new AField[]{ 287 | FIELD_2, 288 | FIELD_3, 289 | FIELD_4, 290 | FIELD_11, 291 | FIELD_12, 292 | FIELD_13, 293 | FIELD_14, 294 | FIELD_15, 295 | FIELD_25, 296 | FIELD_32, 297 | FIELD_37, 298 | FIELD_38, 299 | FIELD_39, 300 | FIELD_41, 301 | FIELD_42, 302 | FIELD_44, 303 | FIELD_49, 304 | FIELD_53, 305 | FIELD_GROUP_60_1_2, 306 | FIELD_GROUP_63_1_2_3_4, 307 | FIELD_64 308 | 309 | }; 310 | 311 | 312 | 313 | public static final AField[] PreAuthorizationIncreaseReqMsg = new AField[]{ 314 | FIELD_2, 315 | FIELD_3, 316 | FIELD_4, 317 | FIELD_11, 318 | FIELD_14, 319 | FIELD_22, 320 | FIELD_25, 321 | FIELD_26, 322 | FIELD_35, 323 | FIELD_36, 324 | FIELD_41, 325 | FIELD_42, 326 | FIELD_49, 327 | FIELD_52, 328 | FIELD_53, 329 | FIELD_GROUP_60_1_2, 330 | FIELD_64 331 | 332 | }; 333 | 334 | 335 | 336 | public static final AField[] PreAuthorizationIncreaseReversalReqMsg = new AField[]{ 337 | FIELD_2, 338 | FIELD_3, 339 | FIELD_4, 340 | FIELD_11, 341 | FIELD_14, 342 | FIELD_22, 343 | FIELD_25, 344 | FIELD_35, 345 | FIELD_36, 346 | FIELD_38, 347 | FIELD_39, 348 | FIELD_41, 349 | FIELD_42, 350 | FIELD_49, 351 | FIELD_53, 352 | FIELD_GROUP_60_1_2, 353 | FIELD_64 354 | 355 | }; 356 | 357 | 358 | public static final AField[] PreAuthorizationIncreaseReversalResMsg = new AField[]{ 359 | FIELD_2, 360 | FIELD_3, 361 | FIELD_4, 362 | FIELD_11, 363 | FIELD_12, 364 | FIELD_13, 365 | FIELD_14, 366 | FIELD_15, 367 | FIELD_25, 368 | FIELD_32, 369 | FIELD_37, 370 | FIELD_39, 371 | FIELD_41, 372 | FIELD_42, 373 | FIELD_49, 374 | FIELD_53, 375 | FIELD_54, 376 | FIELD_GROUP_60_1_2, 377 | FIELD_64 378 | 379 | }; 380 | 381 | public static final AField[] PreAuthorizationCompleteCancelReversalReqMsg = new AField[]{ 382 | FIELD_2, 383 | FIELD_3, 384 | FIELD_4, 385 | FIELD_11, 386 | FIELD_14, 387 | FIELD_22, 388 | FIELD_25, 389 | FIELD_35, 390 | FIELD_36, 391 | FIELD_38, 392 | FIELD_39, 393 | FIELD_41, 394 | FIELD_42, 395 | FIELD_49, 396 | FIELD_53, 397 | FIELD_GROUP_61_1_2_3, 398 | FIELD_GROUP_60_1_2, 399 | FIELD_64 400 | 401 | }; 402 | 403 | public static final AField[] PreAuthorizationCompleteCancelReversalResMsg = new AField[]{ 404 | FIELD_2, 405 | FIELD_3, 406 | FIELD_4, 407 | FIELD_11, 408 | FIELD_12, 409 | FIELD_13, 410 | FIELD_14, 411 | FIELD_15, 412 | FIELD_25, 413 | FIELD_32, 414 | FIELD_37, 415 | FIELD_39, 416 | FIELD_41, 417 | FIELD_42, 418 | FIELD_49, 419 | FIELD_53, 420 | FIELD_GROUP_60_1_2, 421 | FIELD_64 422 | 423 | }; 424 | 425 | 426 | 427 | public static final AField[] PreAuthorizationCompleteCancelReqMsg = new AField[]{ 428 | FIELD_2, 429 | FIELD_3, 430 | FIELD_4, 431 | FIELD_11, 432 | FIELD_14, 433 | FIELD_15, 434 | FIELD_22, 435 | FIELD_25, 436 | FIELD_26, 437 | FIELD_35, 438 | FIELD_36, 439 | FIELD_37, 440 | FIELD_38, 441 | FIELD_41, 442 | FIELD_42, 443 | FIELD_49, 444 | FIELD_52, 445 | FIELD_53, 446 | FIELD_GROUP_60_1_2, 447 | FIELD_GROUP_61_1_2_3, 448 | FIELD_64 449 | }; 450 | 451 | public static final AField[] PreAuthorizationCompleteCancelResMsg = new AField[]{ 452 | FIELD_2, 453 | FIELD_3, 454 | FIELD_4, 455 | FIELD_11, 456 | FIELD_12, 457 | FIELD_13, 458 | FIELD_14, 459 | FIELD_15, 460 | FIELD_25, 461 | FIELD_32, 462 | FIELD_37, 463 | FIELD_38, 464 | FIELD_39, 465 | FIELD_41, 466 | FIELD_42, 467 | FIELD_44, 468 | FIELD_49, 469 | FIELD_53, 470 | FIELD_GROUP_60_1_2, 471 | FIELD_GROUP_63_1_2_3_4, 472 | FIELD_64 473 | 474 | }; 475 | 476 | 477 | 478 | 479 | public static final AField[] PreAuthorizationCancelReqMsg = new AField[]{ 480 | FIELD_2, 481 | FIELD_3, 482 | FIELD_4, 483 | FIELD_11, 484 | FIELD_14, 485 | FIELD_22, 486 | FIELD_25, 487 | FIELD_26, 488 | FIELD_35, 489 | FIELD_36, 490 | FIELD_38, 491 | FIELD_41, 492 | FIELD_42, 493 | FIELD_49, 494 | FIELD_52, 495 | FIELD_53, 496 | FIELD_GROUP_60_1_2, 497 | FIELD_GROUP_61_1_2_3, 498 | FIELD_64 499 | 500 | }; 501 | 502 | 503 | public static final AField[] PreAuthorizationCancelResMsg = new AField[]{ 504 | FIELD_2, 505 | FIELD_3, 506 | FIELD_4, 507 | FIELD_11, 508 | FIELD_12, 509 | FIELD_13, 510 | FIELD_14, 511 | FIELD_15, 512 | FIELD_25, 513 | FIELD_32, 514 | FIELD_37, 515 | FIELD_38, 516 | FIELD_39, 517 | FIELD_41, 518 | FIELD_42, 519 | FIELD_44, 520 | FIELD_49, 521 | FIELD_53, 522 | FIELD_GROUP_60_1_2, 523 | FIELD_GROUP_63_1_2_3_4, 524 | FIELD_64 525 | 526 | }; 527 | 528 | 529 | 530 | public static final AField[] PreAuthorizationReversalReqMsg = new AField[]{ 531 | FIELD_2, 532 | FIELD_3, 533 | FIELD_4, 534 | FIELD_11, 535 | FIELD_14, 536 | FIELD_22, 537 | FIELD_25, 538 | FIELD_35, 539 | FIELD_36, 540 | FIELD_38, 541 | FIELD_39, 542 | FIELD_41, 543 | FIELD_42, 544 | FIELD_49, 545 | FIELD_53, 546 | FIELD_GROUP_60_1_2, 547 | FIELD_64 548 | 549 | }; 550 | 551 | 552 | public static final AField[] PreAuthorizationReversalResMsg = new AField[]{ 553 | FIELD_2, 554 | FIELD_3, 555 | FIELD_4, 556 | FIELD_11, 557 | FIELD_12, 558 | FIELD_13, 559 | FIELD_14, 560 | FIELD_15, 561 | FIELD_25, 562 | FIELD_32, 563 | FIELD_37, 564 | FIELD_39, 565 | FIELD_41, 566 | FIELD_42, 567 | FIELD_49, 568 | FIELD_53, 569 | FIELD_GROUP_60_1_2, 570 | FIELD_64 571 | 572 | }; 573 | 574 | public static final AField[] PreAuthorizationCompleteReqMsg = new AField[]{ 575 | FIELD_2, 576 | FIELD_3, 577 | FIELD_4, 578 | FIELD_11, 579 | FIELD_14, 580 | FIELD_22, 581 | FIELD_25, 582 | FIELD_26, 583 | FIELD_35, 584 | FIELD_36, 585 | FIELD_38, 586 | FIELD_41, 587 | FIELD_42, 588 | FIELD_49, 589 | FIELD_52, 590 | FIELD_53, 591 | FIELD_GROUP_60_1_2, 592 | FIELD_GROUP_61_1_2_3, 593 | FIELD_64 594 | }; 595 | 596 | 597 | public static final AField[] PreAuthorizationCompleteResMsg = new AField[]{ 598 | FIELD_2, 599 | FIELD_3, 600 | FIELD_4, 601 | FIELD_11, 602 | FIELD_12, 603 | FIELD_13, 604 | FIELD_14, 605 | FIELD_15, 606 | FIELD_25, 607 | FIELD_32, 608 | FIELD_37, 609 | FIELD_38, 610 | FIELD_39, 611 | FIELD_41, 612 | FIELD_42, 613 | FIELD_44, 614 | FIELD_49, 615 | FIELD_53, 616 | FIELD_GROUP_60_1_2, 617 | FIELD_GROUP_63_1_2_3_4, 618 | FIELD_64 619 | 620 | 621 | }; 622 | 623 | 624 | public static final AField[] PreAuthorizationCompleteReversalReqMsg = new AField[]{ 625 | FIELD_2, 626 | FIELD_3, 627 | FIELD_4, 628 | FIELD_11, 629 | FIELD_14, 630 | FIELD_22, 631 | FIELD_25, 632 | FIELD_35, 633 | FIELD_36, 634 | FIELD_38, 635 | FIELD_39, 636 | FIELD_41, 637 | FIELD_42, 638 | FIELD_49, 639 | FIELD_53, 640 | FIELD_GROUP_60_1_2, 641 | FIELD_GROUP_61_1_2_3, 642 | FIELD_64 643 | }; 644 | 645 | 646 | public static final AField[] PreAuthorizationCompleteReversalResMsg = new AField[]{ 647 | FIELD_2, 648 | FIELD_3, 649 | FIELD_4, 650 | FIELD_11, 651 | FIELD_12, 652 | FIELD_13, 653 | FIELD_14, 654 | FIELD_15, 655 | FIELD_25, 656 | FIELD_32, 657 | FIELD_37, 658 | FIELD_39, 659 | FIELD_41, 660 | FIELD_42, 661 | FIELD_49, 662 | FIELD_53, 663 | FIELD_GROUP_60_1_2, 664 | FIELD_64 665 | 666 | 667 | }; 668 | 669 | 670 | public static final AField[] PreAuthorizationCancelReversalReqMsg = new AField[]{ 671 | FIELD_2, 672 | FIELD_3, 673 | FIELD_4, 674 | FIELD_11, 675 | FIELD_14, 676 | FIELD_22, 677 | FIELD_25, 678 | FIELD_35, 679 | FIELD_36, 680 | FIELD_38, 681 | FIELD_39, 682 | FIELD_41, 683 | FIELD_42, 684 | FIELD_49, 685 | FIELD_53, 686 | FIELD_GROUP_60_1_2, 687 | FIELD_GROUP_61_1_2_3, 688 | FIELD_64 689 | }; 690 | 691 | 692 | public static final AField[] PreAuthorizationCancelReversalResMsg = new AField[]{ 693 | FIELD_2, 694 | FIELD_3, 695 | FIELD_4, 696 | FIELD_11, 697 | FIELD_12, 698 | FIELD_13, 699 | FIELD_14, 700 | FIELD_15, 701 | FIELD_25, 702 | FIELD_32, 703 | FIELD_37, 704 | FIELD_39, 705 | FIELD_41, 706 | FIELD_42, 707 | FIELD_49, 708 | FIELD_53, 709 | FIELD_GROUP_60_1_2, 710 | FIELD_64 711 | 712 | 713 | }; 714 | 715 | 716 | public static final AField[] BalanceInquiryReqMsg = new AField[]{ 717 | FIELD_2, 718 | FIELD_3, 719 | FIELD_11, 720 | FIELD_14, 721 | FIELD_22, 722 | FIELD_25, 723 | FIELD_26, 724 | FIELD_35, 725 | FIELD_36, 726 | FIELD_41, 727 | FIELD_42, 728 | FIELD_49, 729 | FIELD_52, 730 | FIELD_53, 731 | FIELD_GROUP_60_1_2, 732 | FIELD_62_Identity, 733 | FIELD_64 734 | }; 735 | 736 | 737 | public static final AField[] BalanceInquiryResMsg = new AField[]{ 738 | FIELD_2, 739 | FIELD_3, 740 | FIELD_11, 741 | FIELD_12, 742 | FIELD_13, 743 | FIELD_14, 744 | FIELD_25, 745 | FIELD_32, 746 | FIELD_37, 747 | FIELD_39, 748 | FIELD_41, 749 | FIELD_42, 750 | FIELD_44, 751 | FIELD_49, 752 | FIELD_53, 753 | FIELD_54, 754 | FIELD_GROUP_60_1_2, 755 | FIELD_64 756 | 757 | 758 | }; 759 | 760 | 761 | public static final AField[] PurchaseReversalReqMsg = new AField[]{ 762 | FIELD_2, 763 | FIELD_3, 764 | FIELD_4, 765 | FIELD_11, 766 | FIELD_14, 767 | FIELD_22, 768 | FIELD_25, 769 | FIELD_35, 770 | FIELD_36, 771 | FIELD_38, 772 | FIELD_39, 773 | FIELD_41, 774 | FIELD_42, 775 | FIELD_49, 776 | FIELD_53, 777 | FIELD_GROUP_60_1_2, 778 | FIELD_64 779 | }; 780 | 781 | 782 | public static final AField[] PurchaseReversalResMsg = new AField[]{ 783 | FIELD_2, 784 | FIELD_3, 785 | FIELD_4, 786 | FIELD_11, 787 | FIELD_12, 788 | FIELD_13, 789 | FIELD_14, 790 | FIELD_15, 791 | FIELD_25, 792 | FIELD_32, 793 | FIELD_37, 794 | FIELD_39, 795 | FIELD_41, 796 | FIELD_42, 797 | FIELD_44, 798 | FIELD_49, 799 | FIELD_53, 800 | FIELD_GROUP_60_1_2, 801 | FIELD_64 802 | }; 803 | 804 | 805 | 806 | public static final AField[] PurchaseCancelReqMsg = new AField[]{ 807 | FIELD_2, 808 | FIELD_3, 809 | FIELD_4, 810 | FIELD_11, 811 | FIELD_14, 812 | FIELD_22, 813 | FIELD_25, 814 | FIELD_26, 815 | FIELD_35, 816 | FIELD_36, 817 | FIELD_37, 818 | FIELD_38, 819 | FIELD_41, 820 | FIELD_42, 821 | FIELD_49, 822 | FIELD_52, 823 | FIELD_53, 824 | FIELD_GROUP_60_1_2, 825 | FIELD_GROUP_61_1_2, 826 | FIELD_64 827 | }; 828 | 829 | 830 | public static final AField[] PurchaseCancelResMsg = new AField[]{ 831 | FIELD_2, 832 | FIELD_3, 833 | FIELD_4, 834 | FIELD_11, 835 | FIELD_12, 836 | FIELD_13, 837 | FIELD_14, 838 | FIELD_15, 839 | FIELD_25, 840 | FIELD_32, 841 | FIELD_37, 842 | FIELD_38, 843 | FIELD_39, 844 | FIELD_41, 845 | FIELD_42, 846 | FIELD_44, 847 | FIELD_49, 848 | FIELD_53, 849 | FIELD_GROUP_60_1_2, 850 | FIELD_GROUP_63_1_2_3_4, 851 | FIELD_64 852 | }; 853 | 854 | 855 | 856 | public static final AField[] PurchaseCancelReversalReqMsg = new AField[]{ 857 | FIELD_2, 858 | FIELD_3, 859 | FIELD_4, 860 | FIELD_11, 861 | FIELD_14, 862 | FIELD_22, 863 | FIELD_25, 864 | FIELD_35, 865 | FIELD_36, 866 | FIELD_38, 867 | FIELD_39, 868 | FIELD_41, 869 | FIELD_42, 870 | FIELD_49, 871 | FIELD_53, 872 | FIELD_GROUP_60_1_2, 873 | FIELD_GROUP_61_1_2, 874 | FIELD_64 875 | }; 876 | 877 | 878 | public static final AField[] PurchaseCancelReversalResMsg = new AField[]{ 879 | FIELD_2, 880 | FIELD_3, 881 | FIELD_4, 882 | FIELD_11, 883 | FIELD_12, 884 | FIELD_13, 885 | FIELD_14, 886 | FIELD_15, 887 | FIELD_25, 888 | FIELD_32, 889 | FIELD_37, 890 | FIELD_39, 891 | FIELD_41, 892 | FIELD_42, 893 | FIELD_44, 894 | FIELD_49, 895 | FIELD_53, 896 | FIELD_GROUP_60_1_2, 897 | FIELD_64 898 | }; 899 | 900 | 901 | public static final AField[] RefundReqMsg = new AField[]{ 902 | FIELD_2, 903 | FIELD_3, 904 | FIELD_4, 905 | FIELD_11, 906 | FIELD_14, 907 | FIELD_22, 908 | FIELD_25, 909 | FIELD_26, 910 | FIELD_35, 911 | FIELD_36, 912 | FIELD_37, 913 | FIELD_38, 914 | FIELD_41, 915 | FIELD_42, 916 | FIELD_49, 917 | FIELD_52, 918 | FIELD_53, 919 | FIELD_GROUP_60_1_2, 920 | FIELD_GROUP_61_1_2_3, 921 | FIELD_GROUP_63_InternationalOrganizationCode, 922 | FIELD_64 923 | }; 924 | 925 | 926 | public static final AField[] RefundResMsg = new AField[]{ 927 | FIELD_2, 928 | FIELD_3, 929 | FIELD_4, 930 | FIELD_11, 931 | FIELD_12, 932 | FIELD_13, 933 | FIELD_14, 934 | FIELD_15, 935 | FIELD_25, 936 | FIELD_32, 937 | FIELD_37, 938 | FIELD_39, 939 | FIELD_41, 940 | FIELD_42, 941 | FIELD_44, 942 | FIELD_49, 943 | FIELD_53, 944 | FIELD_GROUP_60_1_2, 945 | FIELD_GROUP_63_1_2_3_4, 946 | FIELD_64 947 | 948 | 949 | }; 950 | 951 | 952 | 953 | public static final AField[] BatchSettlementReqMsg = new AField[]{ 954 | FIELD_11, 955 | FIELD_41, 956 | FIELD_42, 957 | FIELD_GROUP_48_TOTAL, 958 | FIELD_49, 959 | FIELD_GROUP_60_1_2_3, 960 | FIELD_GROUP_63_OPCODE 961 | }; 962 | 963 | 964 | public static final AField[] BatchSettlementResMsg = new AField[]{ 965 | FIELD_11, 966 | FIELD_12, 967 | FIELD_13, 968 | FIELD_15, 969 | FIELD_32, 970 | FIELD_37, 971 | FIELD_41, 972 | FIELD_42, 973 | FIELD_GROUP_48_TOTAL, 974 | FIELD_49, 975 | FIELD_GROUP_60_1_2_3, 976 | FIELD_GROUP_63_OPCODE 977 | }; 978 | 979 | 980 | public static final AField[] BatchUploadReqMsg = new AField[]{ 981 | FIELD_11, 982 | FIELD_41, 983 | FIELD_42, 984 | FIELD_48_DETIAL, 985 | FIELD_GROUP_60_1_2_3, 986 | }; 987 | 988 | 989 | public static final AField[] BatchUploadResMsg = new AField[]{ 990 | FIELD_11, 991 | FIELD_12, 992 | FIELD_13, 993 | FIELD_32, 994 | FIELD_37, 995 | FIELD_39, 996 | FIELD_41, 997 | FIELD_42, 998 | FIELD_48_DETIAL, 999 | FIELD_GROUP_60_1_2_3, 1000 | }; 1001 | 1002 | 1003 | 1004 | public static final AField[] SettlementAdjustTransactionResMsg = new AField[]{ 1005 | FIELD_2, 1006 | FIELD_3, 1007 | FIELD_4, 1008 | FIELD_11, 1009 | FIELD_12, 1010 | FIELD_13, 1011 | FIELD_14, 1012 | FIELD_15, 1013 | FIELD_25, 1014 | FIELD_32, 1015 | FIELD_37, 1016 | FIELD_38, 1017 | FIELD_39, 1018 | FIELD_41, 1019 | FIELD_42, 1020 | FIELD_44, 1021 | FIELD_49, 1022 | FIELD_53, 1023 | FIELD_GROUP_60_1_2, 1024 | FIELD_GROUP_63_1_2_3_4, 1025 | FIELD_64 1026 | 1027 | }; 1028 | 1029 | 1030 | 1031 | 1032 | public static final AField[] SettlementAdjustTransactionReqMsg = new AField[]{ 1033 | FIELD_2, 1034 | FIELD_3, 1035 | FIELD_4, 1036 | FIELD_11, 1037 | FIELD_14, 1038 | FIELD_22, 1039 | FIELD_25, 1040 | FIELD_38, 1041 | FIELD_41, 1042 | FIELD_42, 1043 | FIELD_48_TIP_AMOUNT, 1044 | FIELD_49, 1045 | FIELD_53, 1046 | FIELD_GROUP_60_1_2, 1047 | FIELD_GROUP_61_1_2_3_4_5, 1048 | FIELD_63_1, 1049 | FIELD_64 1050 | 1051 | }; 1052 | 1053 | public static final AField[] NotifySettlementAdjustResMsg = new AField[]{ 1054 | FIELD_2, 1055 | FIELD_3, 1056 | FIELD_4, 1057 | FIELD_11, 1058 | FIELD_12, 1059 | FIELD_13, 1060 | FIELD_14, 1061 | FIELD_15, 1062 | FIELD_25, 1063 | FIELD_32, 1064 | FIELD_37, 1065 | FIELD_38, 1066 | FIELD_39, 1067 | FIELD_41, 1068 | FIELD_42, 1069 | FIELD_44, 1070 | FIELD_49, 1071 | FIELD_53, 1072 | FIELD_GROUP_60_1_2, 1073 | FIELD_GROUP_63_1_2_3_4 1074 | }; 1075 | 1076 | 1077 | 1078 | public static final AField[] NotifySettlementAdjustReqMsg = new AField[]{ 1079 | FIELD_2, 1080 | FIELD_3, 1081 | FIELD_4, 1082 | FIELD_11, 1083 | FIELD_14, 1084 | FIELD_22, 1085 | FIELD_25, 1086 | FIELD_38, 1087 | FIELD_41, 1088 | FIELD_42, 1089 | FIELD_48_TIP_AMOUNT, 1090 | FIELD_49, 1091 | FIELD_53, 1092 | FIELD_GROUP_60_1_2, 1093 | FIELD_GROUP_61_1_2_3_4_5, 1094 | FIELD_63_1, 1095 | }; 1096 | 1097 | 1098 | 1099 | public static final AField[] NotifySettlementResMsg = new AField[]{ 1100 | FIELD_2, 1101 | FIELD_3, 1102 | FIELD_4, 1103 | FIELD_11, 1104 | FIELD_12, 1105 | FIELD_13, 1106 | FIELD_14, 1107 | FIELD_15, 1108 | FIELD_25, 1109 | FIELD_32, 1110 | FIELD_37, 1111 | FIELD_38, 1112 | FIELD_39, 1113 | FIELD_41, 1114 | FIELD_42, 1115 | FIELD_44, 1116 | FIELD_49, 1117 | FIELD_53, 1118 | FIELD_GROUP_60_1_2, 1119 | FIELD_GROUP_63_1_2_3_4 1120 | }; 1121 | 1122 | 1123 | 1124 | public static final AField[] NotifySettlementReqMsg = new AField[]{ 1125 | FIELD_2, 1126 | FIELD_3, 1127 | FIELD_4, 1128 | FIELD_11, 1129 | FIELD_14, 1130 | FIELD_22, 1131 | FIELD_25, 1132 | FIELD_38, 1133 | FIELD_41, 1134 | FIELD_42, 1135 | FIELD_48_TIP_AMOUNT, 1136 | FIELD_49, 1137 | FIELD_53, 1138 | FIELD_GROUP_60_1_2, 1139 | FIELD_GROUP_61_1_2_3_4_5, 1140 | FIELD_63_1 1141 | }; 1142 | 1143 | public static final AField[] SettlementTransactionResMsg = new AField[]{ 1144 | FIELD_2, 1145 | FIELD_3, 1146 | FIELD_4, 1147 | FIELD_11, 1148 | FIELD_12, 1149 | FIELD_13, 1150 | FIELD_14, 1151 | FIELD_15, 1152 | FIELD_25, 1153 | FIELD_32, 1154 | FIELD_37, 1155 | FIELD_38, 1156 | FIELD_39, 1157 | FIELD_41, 1158 | FIELD_42, 1159 | FIELD_44, 1160 | FIELD_49, 1161 | FIELD_53, 1162 | FIELD_GROUP_60_1_2, 1163 | FIELD_GROUP_63_1_2_3_4, 1164 | FIELD_64 1165 | 1166 | }; 1167 | 1168 | 1169 | 1170 | public static final AField[] SettlementTransactionReqMsg = new AField[]{ 1171 | FIELD_2, 1172 | FIELD_3, 1173 | FIELD_4, 1174 | FIELD_11, 1175 | FIELD_14, 1176 | FIELD_22, 1177 | FIELD_25, 1178 | FIELD_38, 1179 | FIELD_41, 1180 | FIELD_42, 1181 | FIELD_48_TIP_AMOUNT, 1182 | FIELD_49, 1183 | FIELD_53, 1184 | FIELD_GROUP_60_1_2, 1185 | FIELD_GROUP_61_1_2_3_4_5, 1186 | FIELD_GROUP_63_InternationalOrganizationCode, 1187 | FIELD_64 1188 | }; 1189 | 1190 | public static final AField[] NotifyRefundReqMsg = new AField[]{ 1191 | FIELD_2, 1192 | FIELD_3, 1193 | FIELD_4, 1194 | FIELD_11, 1195 | FIELD_14, 1196 | FIELD_22, 1197 | FIELD_25, 1198 | FIELD_26, 1199 | FIELD_35, 1200 | FIELD_36, 1201 | FIELD_37, 1202 | FIELD_38, 1203 | FIELD_41, 1204 | FIELD_42, 1205 | FIELD_49, 1206 | FIELD_52, 1207 | FIELD_53, 1208 | FIELD_GROUP_60_1_2, 1209 | FIELD_GROUP_61_1_2_3, 1210 | FIELD_GROUP_63_InternationalOrganizationCode 1211 | }; 1212 | 1213 | 1214 | public static final AField[] NotifyRefundResMsg = new AField[]{ 1215 | FIELD_2, 1216 | FIELD_3, 1217 | FIELD_4, 1218 | FIELD_11, 1219 | FIELD_12, 1220 | FIELD_13, 1221 | FIELD_14, 1222 | FIELD_15, 1223 | FIELD_25, 1224 | FIELD_32, 1225 | FIELD_37, 1226 | FIELD_39, 1227 | FIELD_41, 1228 | FIELD_42, 1229 | FIELD_44, 1230 | FIELD_49, 1231 | FIELD_53, 1232 | FIELD_GROUP_60_1_2, 1233 | FIELD_GROUP_63_1_2_3_4 1234 | }; 1235 | 1236 | private static final AField FIELD_BCD_GROUP_48_TOTAL = new BCDGroupField(48,62,3,null,false); 1237 | private static final AField FIELD_GROUP_BCD_60_1_2_3 = new BCDGroupField(60,11,3,null,false); 1238 | private static final AField FIELD_GROUP_BCD_61_1_2_3_4_5 = new BCDGroupField(61,29,3,null,false); 1239 | private static final AField FIELD_ASCII_GROUP_63_1_2_3_4 = new ASCIIGroupField(63,63,3,null,false); 1240 | 1241 | 1242 | public static final AField[] ExcessTable = new AField[]{ 1243 | FIELD_2, 1244 | FIELD_3, 1245 | FIELD_4, 1246 | FIELD_11, 1247 | FIELD_12, 1248 | FIELD_13, 1249 | FIELD_14, 1250 | FIELD_15, 1251 | FIELD_22, 1252 | FIELD_25, 1253 | FIELD_26, 1254 | FIELD_32, 1255 | FIELD_35, 1256 | FIELD_36, 1257 | FIELD_37, 1258 | FIELD_38, 1259 | FIELD_39, 1260 | FIELD_41, 1261 | FIELD_42, 1262 | FIELD_43, 1263 | FIELD_44, 1264 | FIELD_BCD_GROUP_48_TOTAL, 1265 | FIELD_49, 1266 | FIELD_52, 1267 | FIELD_53, 1268 | FIELD_54, 1269 | FIELD_GROUP_BCD_60_1_2_3, 1270 | FIELD_GROUP_BCD_61_1_2_3_4_5, 1271 | //XXX 62域有可能是终端密钥和终端状态信息的参数,目前只处理了是参数的情况 1272 | FIELD_62_Parameter, 1273 | FIELD_ASCII_GROUP_63_1_2_3_4, 1274 | FIELD_64, 1275 | 1276 | }; 1277 | 1278 | 1279 | /** 1280 | * QCUP消息结构 1281 | */ 1282 | private static final AField FIELD_QCUP_2 = new MutableASCIIField(2,"主账号", 19, false, "qcup_PrimaryAccountNumber",2,true); 1283 | private static final AField FIELD_QCUP_3 = new ASCIIField(3,"交易处理码", 6, false, "qcup_ProcessingCode",true); 1284 | private static final AField FIELD_QCUP_4 = new ASCIIField(4,"交易金额", 12, false, "qcup_TransactionsAmount",ISO8583Util.PREFIX,true); 1285 | private static final AField FIELD_QCUP_7 = new ASCIIField(7,"交易传输时间", 10, false, "qcup_TransmissionDateAndTime",true); 1286 | private static final AField FIELD_QCUP_11 = new ASCIIField(11,"系统跟踪号", 6, false, "qcup_SystemTraceAuditNumber",true); 1287 | private static final AField FIELD_QCUP_12 = new ASCIIField(12,"受卡方所在地时间", 6, false, "qcup_LocalTransactionTime",false); 1288 | private static final AField FIELD_QCUP_13 = new ASCIIField(13,"受卡方所在地日期", 4, false, "qcup_LocalTransactionDate",false); 1289 | private static final AField FIELD_QCUP_14 = new ASCIIField(14,"卡有效期", 4, false, "qcup_ExpirationDate",false); 1290 | private static final AField FIELD_QCUP_15 = new ASCIIField(15,"清算日期", 4, false, "qcup_SettlementDate",false); 1291 | private static final AField FIELD_QCUP_18 = new ASCIIField(18,"商户类型", 4, false, "qcup_MerchantType",true); 1292 | private static final AField FIELD_QCUP_22 = new ASCIIField(22,"服务点输入方式码", 3, false, "qcup_PointOfServiceEntryModeCode",false); 1293 | private static final AField FIELD_QCUP_23 = new ASCIIField(23,"卡序列号", 3, false, "qcup_CardSequenceNumber",false); 1294 | private static final AField FIELD_QCUP_25 = new ASCIIField(25,"服务点条件码", 2, false, "qcup_PointOfServiceConditionMode",true); 1295 | private static final AField FIELD_QCUP_26 = new ASCIIField(26,"服务点PIN获取码", 2, false, "qcup_PointofServicePinCaptureCode",false); 1296 | private static final AField FIELD_QCUP_32 = new MutableASCIIField(32,"受理机构标识码", 11, false, "qcup_AcquiringInstitutionIdentificationCode",2,true); 1297 | private static final AField FIELD_QCUP_33 = new MutableASCIIField(33,"发送机构标识码", 11, false, "qcup_ForwardingInstitutionIdentificationCode",2,true); 1298 | private static final AField FIELD_QCUP_35 = new MutableASCIIField(35,"第二磁道数据", 37, false, "qcup_Track2Data",2,false); 1299 | private static final AField FIELD_QCUP_36 = new MutableASCIIField(36,"第三磁道数据", 104, false, "qcup_Track3Data",3,false); 1300 | private static final AField FIELD_QCUP_37 = new ASCIIField(37,"检索参考号", 12, false, "qcup_RetrievalReferenceNumber",false); 1301 | private static final AField FIELD_QCUP_38 = new ASCIIField(38,"授权标识应答码", 6, false, "qcup_AuthorizationIdentificationResponse",true); 1302 | private static final AField FIELD_QCUP_39 = new ASCIIField(39,"应答码", 2, false, "qcup_ResponseCode",true); 1303 | private static final AField FIELD_QCUP_41 = new ASCIIField(41,"受卡机终端标识码", 8, false, "qcup_CardAcceptorTerminalIdentification",true); 1304 | private static final AField FIELD_QCUP_42 = new ASCIIField(42,"受卡方标识码", 15, false, "qcup_CardAcceptorIdentificationCode",true); 1305 | private static final AField FIELD_QCUP_43 = new ASCIIField(43,"受卡方名称地址", 40, false, "qcup_CardAcceptorNameLocation",false); 1306 | private static final AField FIELD_QCUP_48 = new MutableASCIIField(48,"自定义域", 600, false, "qcup_AdditionalDataPrivate",3,false); 1307 | private static final AField FIELD_QCUP_49 = new ASCIIField(49,"交易货币代码", 3, false, "qcup_CurrencyCodeTransaction",false); 1308 | private static final AField FIELD_QCUP_52 = new BinaryField(52, "个人标识数据码", 8, false, "qcup_pinData",false); 1309 | private static final AField FIELD_QCUP_53 = new ASCIIField(53,"安全控制信息", 16, false, "qcup_SecurityRelatedControlInformation",false); 1310 | private static final AField FIELD_QCUP_54 = new MutableASCIIField(54,"实际余额", 40, false, "qcup_AdditionalAmounts",3,false); 1311 | private static final AField FIELD_QCUP_55 = new MutableBinaryField(55, "基于PBOC借贷记标准的IC卡数据域", 255, false, "qcup_IntegratedCircuitCardSystemRelatedData",3,false); 1312 | private static final AField FIELD_QCUP_59 = new MutableASCIIField(59,"明细查询数据", 600, false, "qcup_DetailInquiring",3,false); 1313 | private static final AField FIELD_QCUP_60 = new MutableASCIIField(60,"自定义域", 100, false, "qcup_AdditionalPointOfServiceInformation",3,false); 1314 | private static final AField FIELD_QCUP_61 = new MutableASCIIField(61,"持卡人身份认证信息", 255, false, "qcup_AuthenticationInformation",3,false); 1315 | private static final AField FIELD_QCUP_63 = new MutableASCIIField(63,"自定义域", 512, false, "qcup_ReservedPrivate",3,false); 1316 | private static final AField FIELD_QCUP_70 = new ASCIIField(70,"网络管理码", 3, false, "qcup_Networkmanagementcode",false); 1317 | private static final AField FIELD_QCUP_90 = new ASCIIField(90,"原始数据元", 42, false, "qcup_OriginalDataElements",true); 1318 | private static final AField FIELD_QCUP_96 = new BinaryField(96, "报文安全码", 8, false, "qcup_MessageSecurityCode",false); 1319 | private static final AField FIELD_QCUP_100 = new MutableASCIIField(100,"接收机构标识码", 11, false, "qcup_DestinationInstituitionIdentificationCode",2,false); 1320 | private static final AField FIELD_QCUP_102 = new MutableASCIIField(102,"账户标识1", 28, false, "qcup_AccountIdentification1",2,false); 1321 | private static final AField FIELD_QCUP_103 = new MutableASCIIField(103,"账户标识2", 28, false, "qcup_AccountIdentification2",2,false); 1322 | private static final AField FIELD_QCUP_128 = new BinaryField(128,"报文鉴别码", 8, false, "qcup_Mac",false); 1323 | 1324 | 1325 | /** 1326 | * 多渠道渠道签到(请求) 1327 | */ 1328 | public static final AField[] channelInReqMsg = new AField[]{ 1329 | // FIELD_QCUP_7, 1330 | FIELD_QCUP_11, 1331 | FIELD_QCUP_12, 1332 | FIELD_QCUP_13, 1333 | FIELD_QCUP_33, 1334 | // FIELD_QCUP_41, 1335 | FIELD_QCUP_70 1336 | }; 1337 | 1338 | /** 1339 | * 多渠道渠道签到(返回) 1340 | */ 1341 | public static final AField[] channelInResMsg = new AField[]{ 1342 | FIELD_QCUP_11, 1343 | FIELD_QCUP_12, 1344 | FIELD_QCUP_13, 1345 | FIELD_QCUP_33, 1346 | FIELD_QCUP_39, 1347 | FIELD_QCUP_48, 1348 | FIELD_QCUP_70 1349 | }; 1350 | 1351 | /** 1352 | * 多渠道委托关系查询(请求) 1353 | */ 1354 | public static final AField[] TrustRelationshipQueryReqMsg = new AField[]{ 1355 | FIELD_QCUP_2, 1356 | FIELD_QCUP_3, 1357 | FIELD_QCUP_7, 1358 | FIELD_QCUP_11, 1359 | FIELD_QCUP_12, 1360 | FIELD_QCUP_13, 1361 | FIELD_QCUP_22, 1362 | FIELD_QCUP_25, 1363 | FIELD_QCUP_32, 1364 | FIELD_QCUP_33, 1365 | FIELD_QCUP_37, 1366 | FIELD_QCUP_41, 1367 | FIELD_QCUP_42, 1368 | FIELD_QCUP_43, 1369 | FIELD_QCUP_48, 1370 | FIELD_QCUP_49, 1371 | FIELD_QCUP_128 1372 | }; 1373 | 1374 | /** 1375 | * 多渠道委托关系查询(返回) 1376 | */ 1377 | public static final AField[] TrustRelationshipQueryResMsg = new AField[]{ 1378 | FIELD_QCUP_2, 1379 | FIELD_QCUP_3, 1380 | FIELD_QCUP_7, 1381 | FIELD_QCUP_11, 1382 | FIELD_QCUP_12, 1383 | FIELD_QCUP_13, 1384 | FIELD_QCUP_25, 1385 | FIELD_QCUP_32, 1386 | FIELD_QCUP_33, 1387 | FIELD_QCUP_37, 1388 | FIELD_QCUP_39, 1389 | FIELD_QCUP_41, 1390 | FIELD_QCUP_42, 1391 | FIELD_QCUP_48, 1392 | FIELD_QCUP_49, 1393 | FIELD_QCUP_100 1394 | }; 1395 | 1396 | /** 1397 | * 多渠道单笔代收(请求) 1398 | */ 1399 | public static final AField[] SingleCollectingReqMsg = new AField[]{ 1400 | FIELD_QCUP_2, 1401 | FIELD_QCUP_3, 1402 | FIELD_QCUP_4, 1403 | FIELD_QCUP_7, 1404 | FIELD_QCUP_11, 1405 | FIELD_QCUP_12, 1406 | FIELD_QCUP_13, 1407 | FIELD_QCUP_22, 1408 | FIELD_QCUP_25, 1409 | FIELD_QCUP_32, 1410 | FIELD_QCUP_33, 1411 | FIELD_QCUP_37, 1412 | FIELD_QCUP_41, 1413 | FIELD_QCUP_42, 1414 | FIELD_QCUP_43, 1415 | FIELD_QCUP_48, 1416 | FIELD_QCUP_49, 1417 | FIELD_QCUP_128 1418 | }; 1419 | 1420 | /** 1421 | * 多渠道单笔代收(返回) 1422 | */ 1423 | public static final AField[] SingleCollectingResMsg = new AField[]{ 1424 | FIELD_QCUP_2, 1425 | FIELD_QCUP_3, 1426 | FIELD_QCUP_4, 1427 | FIELD_QCUP_7, 1428 | FIELD_QCUP_11, 1429 | FIELD_QCUP_12, 1430 | FIELD_QCUP_13, 1431 | FIELD_QCUP_15, 1432 | FIELD_QCUP_25, 1433 | FIELD_QCUP_32, 1434 | FIELD_QCUP_33, 1435 | FIELD_QCUP_37, 1436 | FIELD_QCUP_39, 1437 | FIELD_QCUP_41, 1438 | FIELD_QCUP_42, 1439 | FIELD_QCUP_48, 1440 | FIELD_QCUP_49, 1441 | FIELD_QCUP_59, 1442 | FIELD_QCUP_100, 1443 | FIELD_QCUP_128 1444 | }; 1445 | 1446 | /** 1447 | * 多渠道单笔代收撤销(请求) 1448 | */ 1449 | public static final AField[] SingleCollectingCancelReqMsg = new AField[]{ 1450 | FIELD_QCUP_2, 1451 | FIELD_QCUP_3, 1452 | FIELD_QCUP_4, 1453 | FIELD_QCUP_7, 1454 | FIELD_QCUP_11, 1455 | FIELD_QCUP_12, 1456 | FIELD_QCUP_13, 1457 | FIELD_QCUP_22, 1458 | FIELD_QCUP_25, 1459 | FIELD_QCUP_32, 1460 | FIELD_QCUP_33, 1461 | FIELD_QCUP_37, 1462 | FIELD_QCUP_41, 1463 | FIELD_QCUP_42, 1464 | FIELD_QCUP_43, 1465 | FIELD_QCUP_48, 1466 | FIELD_QCUP_49, 1467 | FIELD_QCUP_90, 1468 | FIELD_QCUP_128 1469 | }; 1470 | 1471 | /** 1472 | * 多渠道单笔代收撤销(返回) 1473 | */ 1474 | public static final AField[] SingleCollectingCancelResMsg = new AField[]{ 1475 | FIELD_QCUP_2, 1476 | FIELD_QCUP_3, 1477 | FIELD_QCUP_4, 1478 | FIELD_QCUP_7, 1479 | FIELD_QCUP_11, 1480 | FIELD_QCUP_12, 1481 | FIELD_QCUP_13, 1482 | FIELD_QCUP_15, 1483 | FIELD_QCUP_25, 1484 | FIELD_QCUP_32, 1485 | FIELD_QCUP_33, 1486 | FIELD_QCUP_37, 1487 | FIELD_QCUP_39, 1488 | FIELD_QCUP_41, 1489 | FIELD_QCUP_42, 1490 | FIELD_QCUP_48, 1491 | FIELD_QCUP_49, 1492 | FIELD_QCUP_59, 1493 | FIELD_QCUP_100, 1494 | FIELD_QCUP_128 1495 | }; 1496 | 1497 | /** 1498 | * 多渠道冲正(请求) 1499 | */ 1500 | public static final AField[] ReverseReqMsg = new AField[]{ 1501 | FIELD_QCUP_2, 1502 | FIELD_QCUP_3, 1503 | FIELD_QCUP_4, 1504 | FIELD_QCUP_7, 1505 | FIELD_QCUP_11, 1506 | FIELD_QCUP_12, 1507 | FIELD_QCUP_13, 1508 | FIELD_QCUP_25, 1509 | FIELD_QCUP_32, 1510 | FIELD_QCUP_33, 1511 | FIELD_QCUP_37, 1512 | FIELD_QCUP_41, 1513 | FIELD_QCUP_42, 1514 | FIELD_QCUP_43, 1515 | FIELD_QCUP_48, 1516 | FIELD_QCUP_49, 1517 | FIELD_QCUP_90, 1518 | FIELD_QCUP_128 1519 | }; 1520 | 1521 | 1522 | /** 1523 | * 多渠道冲正(返回) 1524 | */ 1525 | public static final AField[] ReverseResMsg = new AField[]{ 1526 | FIELD_QCUP_2, 1527 | FIELD_QCUP_3, 1528 | FIELD_QCUP_4, 1529 | FIELD_QCUP_7, 1530 | FIELD_QCUP_11, 1531 | FIELD_QCUP_12, 1532 | FIELD_QCUP_13, 1533 | FIELD_QCUP_15, 1534 | FIELD_QCUP_25, 1535 | FIELD_QCUP_32, 1536 | FIELD_QCUP_33, 1537 | FIELD_QCUP_37, 1538 | FIELD_QCUP_39, 1539 | FIELD_QCUP_41, 1540 | FIELD_QCUP_42, 1541 | FIELD_QCUP_48, 1542 | FIELD_QCUP_49, 1543 | FIELD_QCUP_59, 1544 | FIELD_QCUP_100, 1545 | FIELD_QCUP_128 1546 | }; 1547 | 1548 | 1549 | /** 1550 | * 多渠道委托关系建立/撤销(请求) 1551 | */ 1552 | public static final AField[] TrustRelationshipAddOrDeleteReqMsg = new AField[]{ 1553 | FIELD_QCUP_2, 1554 | FIELD_QCUP_3, 1555 | FIELD_QCUP_7, 1556 | FIELD_QCUP_11, 1557 | FIELD_QCUP_12, 1558 | FIELD_QCUP_13, 1559 | FIELD_QCUP_22, 1560 | FIELD_QCUP_25, 1561 | FIELD_QCUP_26, 1562 | FIELD_QCUP_32, 1563 | FIELD_QCUP_33, 1564 | FIELD_QCUP_37, 1565 | FIELD_QCUP_41, 1566 | FIELD_QCUP_42, 1567 | FIELD_QCUP_43, 1568 | FIELD_QCUP_48, 1569 | FIELD_QCUP_49, 1570 | FIELD_QCUP_128 1571 | }; 1572 | 1573 | /** 1574 | * 多渠道委托关系建立/撤销(返回) 1575 | */ 1576 | public static final AField[] TrustRelationshipAddOrDeleteResMsg = new AField[]{ 1577 | FIELD_QCUP_2, 1578 | FIELD_QCUP_3, 1579 | FIELD_QCUP_7, 1580 | FIELD_QCUP_11, 1581 | FIELD_QCUP_12, 1582 | FIELD_QCUP_13, 1583 | FIELD_QCUP_15, 1584 | FIELD_QCUP_25, 1585 | FIELD_QCUP_32, 1586 | FIELD_QCUP_33, 1587 | FIELD_QCUP_37, 1588 | FIELD_QCUP_39, 1589 | FIELD_QCUP_41, 1590 | FIELD_QCUP_42, 1591 | FIELD_QCUP_48, 1592 | FIELD_QCUP_49, 1593 | FIELD_QCUP_128 1594 | }; 1595 | 1596 | 1597 | /** 1598 | * 多渠道实时代付(请求) 1599 | */ 1600 | public static final AField[] payForAnotherReqMsg = new AField[]{ 1601 | FIELD_QCUP_2, 1602 | FIELD_QCUP_3, 1603 | FIELD_QCUP_4, 1604 | FIELD_QCUP_7, 1605 | FIELD_QCUP_11, 1606 | FIELD_QCUP_12, 1607 | FIELD_QCUP_13, 1608 | FIELD_QCUP_22, 1609 | FIELD_QCUP_25, 1610 | FIELD_QCUP_32, 1611 | FIELD_QCUP_33, 1612 | FIELD_QCUP_37, 1613 | FIELD_QCUP_41, 1614 | FIELD_QCUP_42, 1615 | FIELD_QCUP_43, 1616 | FIELD_QCUP_48, 1617 | FIELD_QCUP_49, 1618 | FIELD_QCUP_61, 1619 | FIELD_QCUP_128 1620 | }; 1621 | 1622 | /** 1623 | * 多渠道实时代付(返回) 1624 | */ 1625 | public static final AField[] payForAnotherResMsg = new AField[]{ 1626 | FIELD_QCUP_2, 1627 | FIELD_QCUP_3, 1628 | FIELD_QCUP_4, 1629 | FIELD_QCUP_7, 1630 | FIELD_QCUP_11, 1631 | FIELD_QCUP_12, 1632 | FIELD_QCUP_13, 1633 | FIELD_QCUP_15, 1634 | // FIELD_QCUP_22, 1635 | FIELD_QCUP_25, 1636 | FIELD_QCUP_32, 1637 | FIELD_QCUP_33, 1638 | FIELD_QCUP_37, 1639 | FIELD_QCUP_39, 1640 | FIELD_QCUP_41, 1641 | FIELD_QCUP_42, 1642 | FIELD_QCUP_48, 1643 | FIELD_QCUP_49, 1644 | FIELD_QCUP_100, 1645 | FIELD_QCUP_128 1646 | }; 1647 | 1648 | /** 1649 | * 多渠道代付确认(请求) 1650 | */ 1651 | public static final AField[] payForAnotherConfirmReqMsg = new AField[]{ 1652 | FIELD_QCUP_2, 1653 | FIELD_QCUP_3, 1654 | FIELD_QCUP_4, 1655 | FIELD_QCUP_7, 1656 | FIELD_QCUP_11, 1657 | FIELD_QCUP_12, 1658 | FIELD_QCUP_13, 1659 | FIELD_QCUP_22, 1660 | FIELD_QCUP_25, 1661 | FIELD_QCUP_32, 1662 | FIELD_QCUP_33, 1663 | FIELD_QCUP_37, 1664 | FIELD_QCUP_41, 1665 | FIELD_QCUP_42, 1666 | FIELD_QCUP_43, 1667 | FIELD_QCUP_48, 1668 | FIELD_QCUP_49, 1669 | FIELD_QCUP_90, 1670 | FIELD_QCUP_128 1671 | }; 1672 | 1673 | /** 1674 | * 多渠道代付确认(返回) 1675 | */ 1676 | public static final AField[] payForAnotherConfirmResMsg = new AField[]{ 1677 | FIELD_QCUP_2, 1678 | FIELD_QCUP_3, 1679 | FIELD_QCUP_4, 1680 | FIELD_QCUP_7, 1681 | FIELD_QCUP_11, 1682 | FIELD_QCUP_12, 1683 | FIELD_QCUP_13, 1684 | FIELD_QCUP_15, 1685 | // FIELD_QCUP_22, 1686 | FIELD_QCUP_25, 1687 | FIELD_QCUP_32, 1688 | FIELD_QCUP_33, 1689 | FIELD_QCUP_37, 1690 | FIELD_QCUP_39, 1691 | FIELD_QCUP_41, 1692 | FIELD_QCUP_42, 1693 | FIELD_QCUP_48, 1694 | FIELD_QCUP_49, 1695 | // FIELD_QCUP_90, 1696 | // FIELD_QCUP_100, 1697 | FIELD_QCUP_128 1698 | }; 1699 | 1700 | /** 1701 | * 银行卡账户验证(请求) 1702 | */ 1703 | public static final AField[] checkAccountReqMsg = new AField[]{ 1704 | FIELD_QCUP_2, 1705 | FIELD_QCUP_3, 1706 | FIELD_QCUP_7, 1707 | FIELD_QCUP_11, 1708 | FIELD_QCUP_12, 1709 | FIELD_QCUP_13, 1710 | FIELD_QCUP_22, 1711 | FIELD_QCUP_25, 1712 | FIELD_QCUP_32, 1713 | FIELD_QCUP_33, 1714 | FIELD_QCUP_37, 1715 | FIELD_QCUP_41, 1716 | FIELD_QCUP_42, 1717 | FIELD_QCUP_43, 1718 | FIELD_QCUP_48, 1719 | FIELD_QCUP_49, 1720 | FIELD_QCUP_61, 1721 | FIELD_QCUP_128 1722 | }; 1723 | 1724 | /** 1725 | * 银行卡账户验证(返回) 1726 | */ 1727 | public static final AField[] checkAccountResMsg = new AField[]{ 1728 | FIELD_QCUP_2, 1729 | FIELD_QCUP_3, 1730 | FIELD_QCUP_7, 1731 | FIELD_QCUP_11, 1732 | FIELD_QCUP_12, 1733 | FIELD_QCUP_13, 1734 | FIELD_QCUP_14, 1735 | FIELD_QCUP_15, 1736 | // FIELD_QCUP_18, 1737 | // FIELD_QCUP_22, 1738 | FIELD_QCUP_25, 1739 | FIELD_QCUP_32, 1740 | FIELD_QCUP_33, 1741 | FIELD_QCUP_37, 1742 | FIELD_QCUP_39, 1743 | FIELD_QCUP_41, 1744 | FIELD_QCUP_42, 1745 | FIELD_QCUP_48, 1746 | FIELD_QCUP_49, 1747 | FIELD_QCUP_61, 1748 | FIELD_QCUP_100, 1749 | FIELD_QCUP_128 1750 | }; 1751 | 1752 | /** 1753 | * 缴费(请求) 1754 | */ 1755 | public static final AField[] payReqMsg = new AField[]{ 1756 | FIELD_QCUP_2, 1757 | FIELD_QCUP_3, 1758 | FIELD_QCUP_4, 1759 | FIELD_QCUP_7, 1760 | FIELD_QCUP_11, 1761 | FIELD_QCUP_12, 1762 | FIELD_QCUP_13, 1763 | FIELD_QCUP_15, 1764 | FIELD_QCUP_18, 1765 | FIELD_QCUP_22, 1766 | FIELD_QCUP_25, 1767 | FIELD_QCUP_32, 1768 | FIELD_QCUP_33, 1769 | FIELD_QCUP_37, 1770 | FIELD_QCUP_41, 1771 | FIELD_QCUP_42, 1772 | FIELD_QCUP_48, 1773 | FIELD_QCUP_49, 1774 | // FIELD_QCUP_59, 1775 | FIELD_QCUP_60, 1776 | FIELD_QCUP_100, 1777 | FIELD_QCUP_103, 1778 | FIELD_QCUP_128 1779 | }; 1780 | 1781 | /** 1782 | * 缴费(返回) 1783 | */ 1784 | public static final AField[] payResMsg = new AField[]{ 1785 | FIELD_QCUP_2, 1786 | FIELD_QCUP_3, 1787 | FIELD_QCUP_4, 1788 | FIELD_QCUP_7, 1789 | FIELD_QCUP_11, 1790 | FIELD_QCUP_12, 1791 | FIELD_QCUP_13, 1792 | FIELD_QCUP_15, 1793 | FIELD_QCUP_18, 1794 | FIELD_QCUP_22, 1795 | FIELD_QCUP_25, 1796 | FIELD_QCUP_32, 1797 | FIELD_QCUP_33, 1798 | FIELD_QCUP_37, 1799 | FIELD_QCUP_39, 1800 | FIELD_QCUP_41, 1801 | FIELD_QCUP_42, 1802 | FIELD_QCUP_48, 1803 | FIELD_QCUP_49, 1804 | // FIELD_QCUP_59, 1805 | FIELD_QCUP_60, 1806 | FIELD_QCUP_103, 1807 | FIELD_QCUP_128 1808 | }; 1809 | 1810 | /** 1811 | * 缴费撤销(请求) 1812 | */ 1813 | public static final AField[] payCancleReqMsg = new AField[]{ 1814 | FIELD_QCUP_2, 1815 | FIELD_QCUP_3, 1816 | FIELD_QCUP_4, 1817 | FIELD_QCUP_7, 1818 | FIELD_QCUP_11, 1819 | FIELD_QCUP_12, 1820 | FIELD_QCUP_13, 1821 | FIELD_QCUP_15, 1822 | FIELD_QCUP_18, 1823 | FIELD_QCUP_25, 1824 | FIELD_QCUP_32, 1825 | FIELD_QCUP_33, 1826 | FIELD_QCUP_37, 1827 | FIELD_QCUP_41, 1828 | FIELD_QCUP_42, 1829 | FIELD_QCUP_43, 1830 | FIELD_QCUP_48, 1831 | FIELD_QCUP_49, 1832 | FIELD_QCUP_59, 1833 | FIELD_QCUP_60, 1834 | FIELD_QCUP_90, 1835 | FIELD_QCUP_103, 1836 | FIELD_QCUP_128 1837 | }; 1838 | 1839 | /** 1840 | * 缴费撤销(返回) 1841 | */ 1842 | public static final AField[] payCancleResMsg = new AField[]{ 1843 | FIELD_QCUP_2, 1844 | FIELD_QCUP_3, 1845 | FIELD_QCUP_4, 1846 | FIELD_QCUP_7, 1847 | FIELD_QCUP_11, 1848 | FIELD_QCUP_12, 1849 | FIELD_QCUP_13, 1850 | FIELD_QCUP_15, 1851 | FIELD_QCUP_18, 1852 | // FIELD_QCUP_22, 1853 | FIELD_QCUP_25, 1854 | FIELD_QCUP_32, 1855 | FIELD_QCUP_33, 1856 | FIELD_QCUP_37, 1857 | FIELD_QCUP_39, 1858 | FIELD_QCUP_41, 1859 | FIELD_QCUP_42, 1860 | FIELD_QCUP_48, 1861 | FIELD_QCUP_49, 1862 | FIELD_QCUP_59, 1863 | FIELD_QCUP_60, 1864 | // FIELD_QCUP_63, 1865 | // FIELD_QCUP_100, 1866 | FIELD_QCUP_103, 1867 | FIELD_QCUP_128 1868 | }; 1869 | 1870 | /** 1871 | * 重置密钥(请求) 1872 | */ 1873 | public static final AField[] resetKeyReqMsg = new AField[]{ 1874 | FIELD_QCUP_7, 1875 | FIELD_QCUP_11, 1876 | FIELD_QCUP_33, 1877 | FIELD_QCUP_53, 1878 | FIELD_QCUP_70, 1879 | FIELD_QCUP_96, 1880 | FIELD_QCUP_128 1881 | }; 1882 | 1883 | /** 1884 | * 重置密钥(返回) 1885 | */ 1886 | public static final AField[] resetKeyResMsg = new AField[]{ 1887 | FIELD_QCUP_7, 1888 | FIELD_QCUP_11, 1889 | FIELD_QCUP_33, 1890 | FIELD_QCUP_39, 1891 | FIELD_QCUP_53, 1892 | FIELD_QCUP_70, 1893 | FIELD_QCUP_128 1894 | }; 1895 | 1896 | /** 1897 | * 多渠道实时消费(请求) 1898 | */ 1899 | public static final AField[] payForConsumerReqMsg = new AField[]{ 1900 | FIELD_QCUP_2, 1901 | FIELD_QCUP_3, 1902 | FIELD_QCUP_4, 1903 | FIELD_QCUP_7, 1904 | FIELD_QCUP_11, 1905 | FIELD_QCUP_12, 1906 | FIELD_QCUP_13, 1907 | FIELD_QCUP_22, 1908 | FIELD_QCUP_25, 1909 | FIELD_QCUP_32, 1910 | FIELD_QCUP_33, 1911 | FIELD_QCUP_37, 1912 | FIELD_QCUP_41, 1913 | FIELD_QCUP_42, 1914 | FIELD_QCUP_43, 1915 | FIELD_QCUP_48, 1916 | FIELD_QCUP_49, 1917 | FIELD_QCUP_61, 1918 | FIELD_QCUP_128 1919 | }; 1920 | 1921 | /** 1922 | * 多渠道实时消费(请求) 1923 | */ 1924 | public static final AField[] payForConsumerReqMsgHasPin = new AField[]{ 1925 | FIELD_QCUP_2, 1926 | FIELD_QCUP_3, 1927 | FIELD_QCUP_4, 1928 | FIELD_QCUP_7, 1929 | FIELD_QCUP_11, 1930 | FIELD_QCUP_12, 1931 | FIELD_QCUP_13, 1932 | FIELD_QCUP_22, 1933 | FIELD_QCUP_25, 1934 | FIELD_QCUP_26, 1935 | FIELD_QCUP_32, 1936 | FIELD_QCUP_33, 1937 | FIELD_QCUP_37, 1938 | FIELD_QCUP_41, 1939 | FIELD_QCUP_42, 1940 | FIELD_QCUP_43, 1941 | FIELD_QCUP_48, 1942 | FIELD_QCUP_49, 1943 | FIELD_QCUP_52, 1944 | FIELD_QCUP_53, 1945 | FIELD_QCUP_60, 1946 | FIELD_QCUP_61, 1947 | FIELD_QCUP_128 1948 | }; 1949 | 1950 | /** 1951 | * 多渠道实时消费(返回) 1952 | */ 1953 | public static final AField[] payForConsumerResMsg = new AField[]{ 1954 | FIELD_QCUP_2, 1955 | FIELD_QCUP_3, 1956 | FIELD_QCUP_4, 1957 | FIELD_QCUP_7, 1958 | FIELD_QCUP_11, 1959 | FIELD_QCUP_12, 1960 | FIELD_QCUP_13, 1961 | FIELD_QCUP_14, 1962 | FIELD_QCUP_15, 1963 | // FIELD_QCUP_22, 1964 | FIELD_QCUP_25, 1965 | FIELD_QCUP_32, 1966 | FIELD_QCUP_33, 1967 | FIELD_QCUP_37, 1968 | FIELD_QCUP_39, 1969 | FIELD_QCUP_41, 1970 | FIELD_QCUP_42, 1971 | FIELD_QCUP_48, 1972 | FIELD_QCUP_49, 1973 | // FIELD_QCUP_100, 1974 | FIELD_QCUP_128 1975 | }; 1976 | 1977 | /** 1978 | * 多渠道实时消费-磁条卡(请求) 1979 | */ 1980 | public static final AField[] payForConsumerCitiaoReqMsg = new AField[]{ 1981 | FIELD_QCUP_2, 1982 | FIELD_QCUP_3, 1983 | FIELD_QCUP_4, 1984 | FIELD_QCUP_7, 1985 | FIELD_QCUP_11, 1986 | FIELD_QCUP_12, 1987 | FIELD_QCUP_13, 1988 | FIELD_QCUP_22, 1989 | FIELD_QCUP_25, 1990 | FIELD_QCUP_26, 1991 | FIELD_QCUP_32, 1992 | FIELD_QCUP_33, 1993 | FIELD_QCUP_35, 1994 | // FIELD_QCUP_36, 1995 | FIELD_QCUP_37, 1996 | FIELD_QCUP_41, 1997 | FIELD_QCUP_42, 1998 | FIELD_QCUP_43, 1999 | // FIELD_QCUP_48, 2000 | FIELD_QCUP_49, 2001 | // FIELD_QCUP_52, 2002 | // FIELD_QCUP_53, 2003 | FIELD_QCUP_60, 2004 | FIELD_QCUP_128 2005 | }; 2006 | 2007 | /** 2008 | * 多渠道实时消费-磁条卡(返回) 2009 | */ 2010 | public static final AField[] payForConsumerCitiaoResMsg = new AField[]{ 2011 | FIELD_QCUP_2, 2012 | FIELD_QCUP_3, 2013 | FIELD_QCUP_4, 2014 | FIELD_QCUP_7, 2015 | FIELD_QCUP_11, 2016 | FIELD_QCUP_12, 2017 | FIELD_QCUP_13, 2018 | FIELD_QCUP_14, 2019 | FIELD_QCUP_15, 2020 | // FIELD_QCUP_22, 2021 | FIELD_QCUP_25, 2022 | FIELD_QCUP_32, 2023 | FIELD_QCUP_33, 2024 | FIELD_QCUP_37, 2025 | FIELD_QCUP_38, 2026 | FIELD_QCUP_39, 2027 | FIELD_QCUP_41, 2028 | FIELD_QCUP_42, 2029 | // FIELD_QCUP_48, 2030 | FIELD_QCUP_49, 2031 | // FIELD_QCUP_52, 2032 | // FIELD_QCUP_53, 2033 | FIELD_QCUP_128 2034 | }; 2035 | 2036 | /** 2037 | * 多渠道实时消费-IC卡(请求) 2038 | */ 2039 | public static final AField[] payForConsumerICReqMsg = new AField[]{ 2040 | FIELD_QCUP_2, 2041 | FIELD_QCUP_3, 2042 | FIELD_QCUP_4, 2043 | FIELD_QCUP_7, 2044 | FIELD_QCUP_11, 2045 | FIELD_QCUP_12, 2046 | FIELD_QCUP_13, 2047 | FIELD_QCUP_22, 2048 | // FIELD_QCUP_23, 2049 | FIELD_QCUP_25, 2050 | FIELD_QCUP_26, 2051 | FIELD_QCUP_32, 2052 | FIELD_QCUP_33, 2053 | // FIELD_QCUP_35, 2054 | // FIELD_QCUP_36, 2055 | FIELD_QCUP_37, 2056 | FIELD_QCUP_41, 2057 | FIELD_QCUP_42, 2058 | FIELD_QCUP_43, 2059 | // FIELD_QCUP_48, 2060 | FIELD_QCUP_49, 2061 | // FIELD_QCUP_52, 2062 | // FIELD_QCUP_53, 2063 | FIELD_QCUP_55, 2064 | FIELD_QCUP_60, 2065 | FIELD_QCUP_128 2066 | }; 2067 | 2068 | /** 2069 | * 多渠道实时消费-ic卡(返回) 2070 | */ 2071 | public static final AField[] payForConsumerICResMsg = new AField[]{ 2072 | FIELD_QCUP_2, 2073 | FIELD_QCUP_3, 2074 | FIELD_QCUP_4, 2075 | FIELD_QCUP_7, 2076 | FIELD_QCUP_11, 2077 | FIELD_QCUP_12, 2078 | FIELD_QCUP_13, 2079 | FIELD_QCUP_14, 2080 | FIELD_QCUP_15, 2081 | FIELD_QCUP_23, 2082 | FIELD_QCUP_25, 2083 | FIELD_QCUP_32, 2084 | FIELD_QCUP_33, 2085 | FIELD_QCUP_37, 2086 | FIELD_QCUP_38, 2087 | FIELD_QCUP_39, 2088 | FIELD_QCUP_41, 2089 | FIELD_QCUP_42, 2090 | // FIELD_QCUP_48, 2091 | FIELD_QCUP_49, 2092 | FIELD_QCUP_55, 2093 | FIELD_QCUP_128 2094 | }; 2095 | 2096 | /** 2097 | * 多渠道消费撤销(请求) 2098 | */ 2099 | public static final AField[] payForConsumerRevokeReqMsg = new AField[]{ 2100 | FIELD_QCUP_2, 2101 | FIELD_QCUP_3, 2102 | FIELD_QCUP_4, 2103 | FIELD_QCUP_7, 2104 | FIELD_QCUP_11, 2105 | FIELD_QCUP_12, 2106 | FIELD_QCUP_13, 2107 | FIELD_QCUP_22, 2108 | FIELD_QCUP_25, 2109 | FIELD_QCUP_32, 2110 | FIELD_QCUP_33, 2111 | FIELD_QCUP_37, 2112 | FIELD_QCUP_41, 2113 | FIELD_QCUP_42, 2114 | FIELD_QCUP_43, 2115 | // FIELD_QCUP_48, 2116 | FIELD_QCUP_49, 2117 | FIELD_QCUP_90, 2118 | FIELD_QCUP_128 2119 | }; 2120 | 2121 | /** 2122 | * 多渠道消费撤销(返回) 2123 | */ 2124 | public static final AField[] payForConsumerRevokeResMsg = new AField[]{ 2125 | FIELD_QCUP_2, 2126 | FIELD_QCUP_3, 2127 | FIELD_QCUP_4, 2128 | FIELD_QCUP_7, 2129 | FIELD_QCUP_11, 2130 | FIELD_QCUP_12, 2131 | FIELD_QCUP_13, 2132 | FIELD_QCUP_14, 2133 | FIELD_QCUP_15, 2134 | FIELD_QCUP_25, 2135 | FIELD_QCUP_32, 2136 | FIELD_QCUP_33, 2137 | FIELD_QCUP_37, 2138 | FIELD_QCUP_39, 2139 | FIELD_QCUP_41, 2140 | FIELD_QCUP_42, 2141 | FIELD_QCUP_48, 2142 | FIELD_QCUP_49, 2143 | FIELD_QCUP_128 2144 | }; 2145 | 2146 | /** 2147 | * 多渠道消费退货(请求) 2148 | */ 2149 | public static final AField[] payForConsumerTuiHuoReqMsg = new AField[]{ 2150 | FIELD_QCUP_2, 2151 | FIELD_QCUP_3, 2152 | FIELD_QCUP_4, 2153 | FIELD_QCUP_7, 2154 | FIELD_QCUP_11, 2155 | FIELD_QCUP_12, 2156 | FIELD_QCUP_13, 2157 | FIELD_QCUP_22, 2158 | FIELD_QCUP_25, 2159 | FIELD_QCUP_32, 2160 | FIELD_QCUP_33, 2161 | FIELD_QCUP_37, 2162 | FIELD_QCUP_41, 2163 | FIELD_QCUP_42, 2164 | FIELD_QCUP_43, 2165 | FIELD_QCUP_48, 2166 | FIELD_QCUP_49, 2167 | FIELD_QCUP_90, 2168 | FIELD_QCUP_128 2169 | }; 2170 | 2171 | /** 2172 | * 多渠道消费退货(返回) 2173 | */ 2174 | public static final AField[] payForConsumerTuiHuoResMsg = new AField[]{ 2175 | FIELD_QCUP_2, 2176 | FIELD_QCUP_3, 2177 | FIELD_QCUP_4, 2178 | FIELD_QCUP_7, 2179 | FIELD_QCUP_11, 2180 | FIELD_QCUP_12, 2181 | FIELD_QCUP_13, 2182 | FIELD_QCUP_14, 2183 | FIELD_QCUP_15, 2184 | FIELD_QCUP_25, 2185 | FIELD_QCUP_32, 2186 | FIELD_QCUP_33, 2187 | FIELD_QCUP_37, 2188 | FIELD_QCUP_39, 2189 | FIELD_QCUP_41, 2190 | FIELD_QCUP_42, 2191 | FIELD_QCUP_48, 2192 | FIELD_QCUP_49, 2193 | FIELD_QCUP_128 2194 | }; 2195 | 2196 | /** 2197 | * 多渠道冲正(请求) 2198 | */ 2199 | public static final AField[] payForConsumerCorrectReqMsg = new AField[]{ 2200 | FIELD_QCUP_2, 2201 | FIELD_QCUP_3, 2202 | FIELD_QCUP_4, 2203 | FIELD_QCUP_7, 2204 | FIELD_QCUP_11, 2205 | FIELD_QCUP_12, 2206 | FIELD_QCUP_13, 2207 | FIELD_QCUP_25, 2208 | FIELD_QCUP_32, 2209 | FIELD_QCUP_33, 2210 | FIELD_QCUP_37, 2211 | FIELD_QCUP_41, 2212 | FIELD_QCUP_42, 2213 | FIELD_QCUP_43, 2214 | FIELD_QCUP_48, 2215 | FIELD_QCUP_49, 2216 | FIELD_QCUP_90, 2217 | FIELD_QCUP_128 2218 | }; 2219 | 2220 | /** 2221 | * 多渠道冲正(返回) 2222 | */ 2223 | public static final AField[] payForConsumerCorrectResMsg = new AField[]{ 2224 | FIELD_QCUP_2, 2225 | FIELD_QCUP_3, 2226 | FIELD_QCUP_4, 2227 | FIELD_QCUP_7, 2228 | FIELD_QCUP_11, 2229 | FIELD_QCUP_12, 2230 | FIELD_QCUP_13, 2231 | FIELD_QCUP_15, 2232 | FIELD_QCUP_25, 2233 | FIELD_QCUP_32, 2234 | FIELD_QCUP_33, 2235 | FIELD_QCUP_37, 2236 | FIELD_QCUP_39, 2237 | FIELD_QCUP_41, 2238 | FIELD_QCUP_42, 2239 | FIELD_QCUP_48, 2240 | FIELD_QCUP_49, 2241 | FIELD_QCUP_128 2242 | }; 2243 | 2244 | 2245 | private MessageStructure() { 2246 | 2247 | } 2248 | 2249 | /** 2250 | * @brief 获得消息结构 2251 | * 2252 | * @param msg 2253 | * 消息 2254 | * @return 2255 | */ 2256 | public static AField[] getFields(String uniqueID) { 2257 | return (AField[]) map.get(uniqueID); 2258 | } 2259 | 2260 | @SuppressWarnings("unchecked") 2261 | public static void put(String uniqueID, AField[] msgFieldTable) { 2262 | map.put(uniqueID,msgFieldTable); 2263 | } 2264 | 2265 | } 2266 | -------------------------------------------------------------------------------- /MutableASCIIField.java: -------------------------------------------------------------------------------- 1 | /** 2 | * $Log: MutableASCIIField.java,v $ 3 | * Revision 1.2 2007/11/13 06:36:54 wangl 4 | * 同步代码 5 | * 6 | * Revision 1.2 2007/11/09 07:10:50 wangl 7 | * 加入适当的注释 8 | * 9 | * Revision 1.1 2007/11/02 07:16:55 wangl 10 | * 添加新的重构後的代码 11 | * 12 | * 13 | */ 14 | 15 | import java.io.IOException; 16 | import java.io.InputStream; 17 | import java.io.OutputStream; 18 | import java.util.List; 19 | 20 | /** 21 | * @brief 22 | *23 | * 变长的ASCII字符字段处理 24 | *
25 | * 26 | * 变长的ASCII字符字段处理 27 | * 28 | * @author wangl 29 | * @version eJPos SDK1.0 30 | * @see 31 | * @since 2007-9-6 32 | */ 33 | 34 | public class MutableASCIIField extends MutableField { 35 | 36 | public MutableASCIIField(int bit, String data_name, int length,boolean optional, String msgAttributeName, int wide,boolean isMac) { 37 | super(bit, data_name, length, optional, msgAttributeName, wide,isMac); 38 | } 39 | 40 | 41 | public boolean pack(EFTMessage msg, OutputStream out,List37 | * 变长的BCD字段的处理 38 | *
39 | * 40 | * 变长的BCD字段的处理 41 | * 42 | * @author wangl 43 | * @version eJPos SDK1.0 44 | * @see 45 | * @since 2007-9-6 46 | */ 47 | 48 | public class MutableBCDField extends MutableField { 49 | 50 | public MutableBCDField(int bit, String data_name, int length, 51 | boolean optional, String msgAttributeName, int wide,boolean isMac) { 52 | super(bit, data_name, length, optional, msgAttributeName, wide,isMac); 53 | } 54 | 55 | 56 | public boolean pack(EFTMessage msg, OutputStream out,List23 | * 变长的二进制字段的处理 24 | *
25 | * 26 | * 变长的二进制字段的处理 27 | * 28 | *29 | *
30 | * @author wangl 31 | * @version eJPos SDK1.0 32 | * @see 33 | * @since 2007-10-26 34 | */ 35 | 36 | public class MutableBinaryField extends MutableField { 37 | 38 | public MutableBinaryField(int bit, String data_name, int length, 39 | boolean optional, String msgAttributeName, int wide,boolean isMac) { 40 | super(bit, data_name, length, optional, msgAttributeName, wide,isMac); 41 | } 42 | 43 | 44 | public boolean pack(EFTMessage msg, OutputStream out,List变长字段数据处理的基类
28 | * 29 | * 变长字段数据处理的基类 30 | * 31 | * @author wangl 32 | * @version eJPos SDK1.0 33 | * @see 34 | * @since 2007-11-9 35 | */ 36 | 37 | public abstract class MutableField extends AField { 38 | 39 | /** 40 | *几位变长
41 | */
42 | protected int wide;
43 |
44 | /**
45 | * 占多少字节
46 | */
47 | protected int lengthInByte;
48 |
49 |
50 | protected MutableField(int bit, String data_name, int length,boolean optional, String msgAttributeName, int wide,boolean isMac) {
51 | super(bit, data_name, length, optional, msgAttributeName, wide,isMac);
52 | this.wide = wide;
53 | }
54 |
55 |
56 | /**
57 | * 将变长的长度写入流
58 | * @param out
59 | * @throws IOException
60 | */
61 | protected String writeLengthValue(OutputStream out) throws IOException {
62 | String lens = String.valueOf(this.length);
63 | int len = lens.length();
64 | for (int i = len; i < this.wide; i++) {
65 | lens = "0"+lens;
66 | }
67 | byte[] lenByte = lens.getBytes();
68 | out.write(lenByte);
69 | return lens;
70 | }
71 |
72 |
73 |
74 | /**
75 | * 将变长的长度从流中读出来
76 | * @param in
77 | *
78 | */
79 | protected void readLengthValue(InputStream in) {
80 | byte[] b = new byte[this.wide];
81 | try {
82 | in.read(b);
83 | int len = Integer.parseInt(new String(b));
84 | this.length = len;
85 | this.lengthInByte = len%2==0?len/2:((len+1)/2);
86 | } catch (IOException e) {
87 | // TODO 自动生成 catch 块
88 | e.printStackTrace();
89 | }
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # iso8583
2 | 银行间通讯8583报文解析代码
3 |
--------------------------------------------------------------------------------