├── 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,List macList,StringBuffer packLog); 111 | 112 | /** 113 | * @brief 解包过程 114 | * 115 | * @param in 116 | * 流化后的iso8583数据包 117 | * @param msg 118 | * 存放具体数据的金融消息 119 | */ 120 | abstract public void unpack(InputStream in, EFTMessage msg,StringBuffer retLog); 121 | 122 | /** 123 | * @brief 使用反射将值设置到消息对象 124 | * 125 | * @param msg 126 | * 金融消息 127 | * @param obj 128 | * 值 129 | */ 130 | @SuppressWarnings("rawtypes") 131 | public void setAttributeValue(EFTMessage msg, Object obj) { 132 | Class clazz = msg.getClass(); 133 | Field field = null; 134 | try { 135 | field = clazz.getField(msgAttributeName); 136 | field.set(msg, obj); 137 | } catch (Exception e) { 138 | 139 | } 140 | } 141 | 142 | /** 143 | * @brief 使用反射将消息对象的值读出来 144 | * 145 | * @param msg 146 | * 金融消息 147 | */ 148 | @SuppressWarnings("rawtypes") 149 | public Object getAttributeValue(EFTMessage msg) { 150 | Class clazz = msg.getClass(); 151 | Field field = null; 152 | Object returnObj = null; 153 | try { 154 | field = clazz.getField(msgAttributeName); 155 | returnObj = field.get(msg); 156 | return returnObj; 157 | } catch (Exception e) { 158 | return returnObj; 159 | } 160 | } 161 | } 162 | -------------------------------------------------------------------------------- /ASCIIField.java: -------------------------------------------------------------------------------- 1 | /** 2 | * $Log: ASCIIField.java,v $ 3 | * Revision 1.3 2007/11/28 11:34:48 wangl 4 | * 修改错误 5 | * 6 | * Revision 1.2 2007/11/13 06:36:54 wangl 7 | * 同步代码 8 | * 9 | * Revision 1.3 2007/11/09 07:10:49 wangl 10 | * 加入适当的注释 11 | * 12 | * Revision 1.2 2007/11/06 09:26:48 wangl 13 | * 修改对齐方式写错的地方 14 | * 15 | * Revision 1.1 2007/11/02 07:16:55 wangl 16 | * 添加新的重构後的代码 17 | * 18 | */ 19 | 20 | import java.io.IOException; 21 | import java.io.InputStream; 22 | import java.io.OutputStream; 23 | import java.util.List; 24 | 25 | 26 | /** 27 | * @brief 28 | *

29 | * 字符字段的处理 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 macList,StringBuffer packLog) { 55 | String valueTemp = (String) getAttributeValue(msg); 56 | packLog.append("["+this.bit+"] ["+valueTemp+"]"+"\n"); 57 | if (valueTemp == null) { 58 | if (isRequired()) { 59 | return false; 60 | } 61 | return false; 62 | } else { 63 | String value = ""; 64 | if(getBit() == 4){ 65 | value = ISO8583Util.format(valueTemp,this.length,getAlign(),STUFF0); 66 | }else{ 67 | value = ISO8583Util.format(valueTemp,this.length,getAlign(),STUFF); 68 | } 69 | try { 70 | String v = value.substring(0,this.length); 71 | out.write(v.getBytes("GBK")); 72 | if(this.isMac() == true){ 73 | macList.add(v); 74 | } 75 | return true; 76 | } catch (IOException e) { 77 | e.printStackTrace(); 78 | return false; 79 | } 80 | } 81 | 82 | } 83 | 84 | 85 | public void unpack(InputStream in, EFTMessage msg,StringBuffer retLog) { 86 | byte[] value = new byte[getLength()]; 87 | try { 88 | in.read(value); 89 | setAttributeValue(msg, new String(value)); 90 | retLog.append("["+this.bit+"] ["+new String(value,"GBK")+"]"+"\n"); 91 | } catch (IOException e) { 92 | // TODO 自动生成 catch 块 93 | e.printStackTrace(); 94 | } 95 | } 96 | 97 | } 98 | -------------------------------------------------------------------------------- /ASCIIGroupField.java: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * $Log: ASCIIGroupField.java,v $ 4 | * Revision 1.2 2007/11/13 06:36:54 wangl 5 | * 同步代码 6 | * 7 | * Revision 1.2 2007/11/09 07:10:49 wangl 8 | * 加入适当的注释 9 | * 10 | * Revision 1.1 2007/11/07 08:32:02 wangl 11 | * 添加新类型Group字段为容错做处理 12 | * 13 | */ 14 | 15 | 16 | import java.io.ByteArrayInputStream; 17 | import java.io.IOException; 18 | import java.io.InputStream; 19 | 20 | /** 21 | * 22 | * 23 | *

字符组字段处理

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,List macList,StringBuffer packLog) { 113 | String valueTemp = (String) getAttributeValue(msg); 114 | String value = ISO8583Util.format(valueTemp, this.length, getAlign(), 115 | STUFF); 116 | if (valueTemp == null) { 117 | if (isRequired()) { 118 | System.out.println("必选域但是EFTMessage数据为空:" + getFieldName()); 119 | } 120 | return false; 121 | } else { 122 | byte[] bcdValue = ISO8583Util.createNotCompressedBCDArray(value); 123 | if (isCompressed) { 124 | bcdValue = ISO8583Util.getCompressedBCDArray(bcdValue,ISO8583Util.SUFFIX); 125 | } 126 | try { 127 | out.write(bcdValue); 128 | return true; 129 | } catch (IOException e) { 130 | e.printStackTrace(); 131 | return false; 132 | } 133 | } 134 | 135 | } 136 | 137 | 138 | public void unpack(InputStream in, EFTMessage msg,StringBuffer retLog) { 139 | 140 | byte[] value = null; 141 | if (isCompressed) { 142 | int len = getLength() % 2 == 0 ? getLength() / 2: ((getLength() + 1) / 2); 143 | value = new byte[len]; 144 | } else { 145 | value = new byte[getLength()]; 146 | } 147 | 148 | try { 149 | in.read(value); 150 | String valueStr = null; 151 | if (isCompressed) { 152 | valueStr = ISO8583Util.compressedBCD2String(value); 153 | } else { 154 | valueStr = ISO8583Util.notCompressedBCD2String(value); 155 | } 156 | String val = valueStr.substring(0, getLength()); 157 | setAttributeValue(msg, val); 158 | 159 | } catch (IOException e) { 160 | e.printStackTrace(); 161 | 162 | } 163 | 164 | } 165 | 166 | } 167 | -------------------------------------------------------------------------------- /BCDGroupField.java: -------------------------------------------------------------------------------- 1 | /** 2 | * $Log: BCDGroupField.java,v $ 3 | * Revision 1.2 2007/11/13 06:36:54 wangl 4 | * 同步代码 5 | * 6 | * Revision 1.4 2007/11/09 07:10:49 wangl 7 | * 加入适当的注释 8 | * 9 | * Revision 1.3 2007/11/09 06:19:03 wangl 10 | * 修改錯誤得到壓縮bcd碼時候的錯誤 11 | * 12 | * Revision 1.2 2007/11/09 02:40:14 wangl 13 | * 修改BCDGroupField处理方式 14 | * 15 | * Revision 1.1 2007/11/07 08:32:02 wangl 16 | * 添加新类型Group字段为容错做处理 17 | * 18 | */ 19 | 20 | 21 | import java.io.ByteArrayInputStream; 22 | import java.io.ByteArrayOutputStream; 23 | import java.io.IOException; 24 | import java.io.InputStream; 25 | import java.io.OutputStream; 26 | import java.util.List; 27 | 28 | /** 29 | * 30 | * 31 | *

BCD类型的数字字段数组的处理

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,List macList,StringBuffer packLog) { 70 | AField[] fields = getFields(); 71 | ByteArrayOutputStream os = new ByteArrayOutputStream(); 72 | for (int i = 0; i < fields.length; i++) { 73 | AField f = fields[i]; 74 | f.isCompressed = false; 75 | f.pack(msg, os,macList,packLog); 76 | } 77 | byte[] notCompressByteArray = os.toByteArray(); 78 | String notCompressedBCDString = ISO8583Util.notCompressedBCD2String(notCompressByteArray); 79 | byte[] compressByteArray = ISO8583Util.createBCDByteArray(notCompressedBCDString,getAlign()); 80 | this.length =notCompressByteArray.length; 81 | try { 82 | writeLengthValue(out); 83 | out.write(compressByteArray); 84 | return true; 85 | } catch (IOException e) { 86 | e.printStackTrace(); 87 | return false; 88 | } 89 | } 90 | 91 | 92 | 93 | } 94 | -------------------------------------------------------------------------------- /BinaryField.java: -------------------------------------------------------------------------------- 1 | /** 2 | * $Log: BinaryField.java,v $ 3 | * Revision 1.2 2007/11/13 06:36:54 wangl 4 | * 同步代码 5 | * 6 | * Revision 1.3 2007/11/06 09:26:48 wangl 7 | * 修改对齐方式写错的地方 8 | * 9 | * Revision 1.2 2007/11/02 07:16:55 wangl 10 | * 添加新的重构後的代码 11 | * 12 | * 13 | */ 14 | 15 | 16 | import java.io.IOException; 17 | import java.io.InputStream; 18 | import java.io.OutputStream; 19 | import java.util.List; 20 | 21 | 22 | /** 23 | * @brief 24 | *

25 | * 二进制域 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 macList,StringBuffer packLog) { 54 | int len = getLength(); 55 | byte[] valueTemp = (byte[]) getAttributeValue(msg); 56 | if (valueTemp == null) { 57 | if (isRequired()) { 58 | System.out.println("必选域但是EFTMessage数据为空:" + getFieldName()); 59 | } 60 | return false; 61 | } else { 62 | byte[] value = ISO8583Util.format(valueTemp,this.length,getAlign(),STUFF); 63 | try { 64 | out.write(value, 0, len); 65 | } catch (IOException e) { 66 | e.printStackTrace(); 67 | return false; 68 | } 69 | return true; 70 | } 71 | } 72 | 73 | 74 | public void unpack(InputStream in, EFTMessage msg,StringBuffer retLog) { 75 | int len = getLength(); 76 | byte[] value = new byte[len]; 77 | try { 78 | in.read(value); 79 | setAttributeValue(msg, value); 80 | } catch (IOException e) { 81 | e.printStackTrace(); 82 | 83 | } 84 | 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /BinaryGroupField.java: -------------------------------------------------------------------------------- 1 | /** 2 | * $Log: BinaryGroupField.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/07 08:32:02 wangl 10 | * 添加新类型Group字段为容错做处理 11 | * 12 | */ 13 | 14 | import java.io.ByteArrayInputStream; 15 | import java.io.IOException; 16 | import java.io.InputStream; 17 | /** 18 | * 19 | * 20 | *

二进制直接字段数组处理

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,List macList,StringBuffer packLog) { 62 | ByteArrayOutputStream os = new ByteArrayOutputStream(); 63 | int length = 0; 64 | for (int i = 0; i < array.size(); i++) { 65 | AField f = (AField)array.get(i); 66 | f.pack(msg, os,macList,packLog); 67 | length += f.length; 68 | } 69 | this.length = length; 70 | byte[] b = os.toByteArray(); 71 | try { 72 | writeLengthValue(out); 73 | out.write(b); 74 | return true; 75 | } catch (IOException e) { 76 | e.printStackTrace(); 77 | return false; 78 | } 79 | 80 | 81 | } 82 | 83 | 84 | public void unpack(InputStream in, EFTMessage msg,StringBuffer retLog) { 85 | readLengthValue(in); 86 | for (int i = 0; i < array.size(); i++) { 87 | AField f = (AField)array.get(i); 88 | f.unpack(in,msg,retLog); 89 | } 90 | } 91 | 92 | } 93 | -------------------------------------------------------------------------------- /ISO8583Message.java: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * $Log: ISO8583Message.java,v $ 4 | * Revision 1.4 2008/01/28 02:10:47 wangl 5 | * 增加参数上送的调用 6 | * 7 | * Revision 1.3 2007/11/22 06:05:22 liaok 8 | * 增加TPDU字段并实现对其的赋值 9 | * 10 | * Revision 1.2 2007/11/13 06:36:54 wangl 11 | * 同步代码 12 | * 13 | * 14 | */ 15 | 16 | 17 | 18 | 19 | /** 20 | * @brief 21 | *

ISO8583包解析

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 | List macList = new ArrayList(); 56 | //消息类型 57 | if(msgTYPE != null && !"".equals(msgTYPE)){ 58 | msgID = msgTYPE.getBytes(); 59 | ISO8583Util.setBit(bitMap, 1); 60 | }else{ 61 | return null; 62 | } 63 | try { 64 | out.write(msgID); 65 | out.write(bitMap); 66 | macList.add(msgTYPE); 67 | } catch (Exception e) { 68 | e.printStackTrace(); 69 | return null; 70 | } 71 | 72 | //写域数据 73 | boolean hasMac = false; 74 | for (int i = 0; i < msgStructure.length; i++) { 75 | AField field = msgStructure[i]; 76 | if (field.getBit() == 128) { 77 | ISO8583Util.setBit(bitMap, field.getBit()); 78 | hasMac = true; 79 | } else if (field.pack(eftMessage, out,macList,sendLog)) { 80 | if(field.getBit() == 90){ 81 | macList.set(macList.size()-1, macList.get(macList.size()-1).substring(0,20)); 82 | } 83 | ISO8583Util.setBit(bitMap, field.getBit()); 84 | }else{ 85 | logger.error("域出错:#0 #1",String.valueOf(field.getBit()),field.getFieldName()); 86 | return null; 87 | } 88 | } 89 | 90 | //组合报文 91 | byte[] byteArray = out.toByteArray(); 92 | System.arraycopy(bitMap, 0, byteArray, msgID.length, bitMap.length); 93 | byte[] macField = null; 94 | ISO8583Message outMessage; 95 | if (hasMac) { 96 | //计算第128域Mac 97 | if(isChannel){ 98 | String mac = genMac(macList); 99 | if(isUsedSoftEncr){ 100 | String mossStr = DataConverter.stringToHexString(mac); 101 | String themac = MacEncryptdllUtils.calcMAC(mossStr,mossStr.length(), 0, tmpKey, tmpMacKey).substring(0,8); 102 | macField = themac.getBytes(); 103 | }else{ 104 | macField = EncryptionMachineUtil.mac(sek, mak, mac).getBytes(); 105 | } 106 | }else{ 107 | String mossStr = DataConverter.bytesToHexString(byteArray); 108 | String themac = MacEncryptdllUtils.calcMAC(mossStr,mossStr.length(), 0, tmpKey, tmpMacKey); 109 | System.out.println("mac str:" + mossStr); 110 | System.out.println("master Key:" + tmpKey); 111 | System.out.println("tmpMacKey:" + tmpMacKey); 112 | System.out.println("themac:" + themac); 113 | macField = ArrayUtil.hexDecode(themac); 114 | // macField = themac.getBytes(); 115 | System.out.println("128:::::::::::::" + ArrayUtil.hexEncode(macField)); 116 | } 117 | byte[] byteArrayHasMac = new byte[byteArray.length+ macField.length]; 118 | System.arraycopy(byteArray, 0, byteArrayHasMac, 0,byteArray.length); 119 | System.arraycopy(macField, 0, byteArrayHasMac, byteArray.length,macField.length); 120 | //计算报文总长度 121 | byte[] byteArrayHasLength = new byte[byteArrayHasMac.length+4]; 122 | byte[] bl = String.format("%04d", byteArrayHasMac.length).getBytes(); 123 | System.arraycopy(bl, 0, byteArrayHasLength, 0,4); 124 | System.arraycopy(byteArrayHasMac, 0, byteArrayHasLength, 4,byteArrayHasMac.length); 125 | outMessage = new ISO8583Message(byteArrayHasLength,null); 126 | } else { 127 | //计算报文总长度 128 | byte[] byteArrayHasLength = new byte[byteArray.length+4]; 129 | byte[] bl = String.format("%04d", byteArray.length).getBytes(); 130 | System.arraycopy(bl, 0, byteArrayHasLength, 0,4); 131 | System.arraycopy(byteArray, 0, byteArrayHasLength, 4,byteArray.length); 132 | outMessage = new ISO8583Message(byteArrayHasLength,null); 133 | } 134 | 135 | logger.info(sendLog.toString()); 136 | //输出 137 | return outMessage; 138 | 139 | } 140 | 141 | /** 142 | * 解包数据 143 | * 144 | * @param receiveData 145 | * @param msgStructure 146 | * @return 147 | * @throws Exception 148 | * @throws IOException 149 | */ 150 | @SuppressWarnings("rawtypes") 151 | public EFTMessage unpack(ISO8583Message receiveData,AField msgStructure[],String interfaceName) throws Exception { 152 | StringBuffer retLog = new StringBuffer(); 153 | retLog.append("\n"); 154 | retLog.append("============================================================================================"); 155 | retLog.append("\n\n"); 156 | retLog.append(">>收到的报文 : "+interfaceName+"\n"); 157 | retLog.append(">>域信息"+"\n"); 158 | 159 | ByteArrayInputStream in = new ByteArrayInputStream(receiveData.getBytes()); 160 | EFTMessage msg = new EFTMessage(); 161 | byte[] packLen = new byte[4]; 162 | byte[] msgID = new byte[4]; 163 | byte[] bitMap = new byte[16]; 164 | in.read(packLen); 165 | in.read(msgID); 166 | in.read(bitMap); 167 | msg.setMsgTypeID(new String(msgID)); 168 | retLog.append("[1] "+new String(msgID)+"\n"); 169 | ArrayList list = (ArrayList) ISO8583Util.generateBitMapIndex(bitMap); 170 | for (int i = 0; i < list.size(); i++) { 171 | int index = ((Integer) list.get(i)).intValue(); 172 | if(index == 1){ 173 | continue; 174 | } 175 | AField f = searchField(index, msgStructure,MessageStructure.ExcessTable); 176 | try { 177 | f.unpack(in, msg, retLog); 178 | } catch (Exception e) { 179 | logger.warn("解析域[#0]失败:#1", String.valueOf(index), e.getMessage()); 180 | } 181 | } 182 | logger.info(retLog.toString()); 183 | return msg; 184 | 185 | } 186 | /** 187 | * 188 | * 189 | * 查找到唯一一个字段 190 | * 191 | * @param index 192 | * @param msgStructure 193 | * @param excessTable 194 | * @return 195 | */ 196 | private static AField searchField(int index, AField[] msgStructure,AField[] excessTable) { 197 | AField f = null; 198 | f = getExistsField(index, msgStructure); 199 | if (f != null) { 200 | return f; 201 | } else { 202 | f = getExistsField(index, excessTable); 203 | return f; 204 | } 205 | } 206 | 207 | 208 | /** 209 | * 210 | * 211 | * 得到存在的域的字段 212 | * 213 | * @param index 214 | * @param fields 215 | * @return 216 | */ 217 | private static AField getExistsField(int index, AField[] fields) { 218 | if (fields == null) { 219 | return null; 220 | } else { 221 | for (int i = 0; i < fields.length; i++) { 222 | if (index == fields[i].getBit()) { 223 | return fields[i]; 224 | } 225 | } 226 | return null; 227 | } 228 | 229 | } 230 | 231 | 232 | /** 233 | * 234 | * 235 | * mac校验 236 | * 237 | * @param data 238 | * @param mak 239 | * @return 240 | */ 241 | public static byte[] encryptionMac(final byte[] data, byte[] mak) { 242 | byte[] ret = Encrypt.ECB(data, mak); 243 | return ret; 244 | } 245 | 246 | /** 247 | * 渠道mac域选择 248 | * @return 249 | */ 250 | public static String genMac(List macList){ 251 | String space = " "; 252 | String str = ""; 253 | for (int i = 0; i < macList.size(); i++) { 254 | String field = macList.get(i).trim(); //删去所有域的起始空格和结尾空格 255 | field = field.toUpperCase(); //所有的小写字母转换成大写字母 256 | field = field.replaceAll("^([a-zA-Z_0-9],.)", ""); //除了字母(A-Z),数字(0-9),空格,逗号(,)和点号(.)以外的字符都删去 257 | if(i != macList.size()){ 258 | field = field + space; //在域和域之间插入一个空格 259 | } 260 | str = str + field; 261 | } 262 | str = str.replace(" {2,}", space); //多于一个的连续空格,由一个空格代替 263 | return str.trim(); 264 | } 265 | 266 | 267 | /** 268 | * 后补空格 269 | * @param str 270 | * @param strLength 271 | * @return 272 | */ 273 | public static String addSpace(String str, int strLength) { 274 | int strLen = strLength - str.getBytes().length; 275 | StringBuffer sb = new StringBuffer(); 276 | for (int i = 0; i < strLen; i++) { 277 | sb.append(" "); 278 | } 279 | return str + sb.toString(); 280 | } 281 | 282 | /** 283 | * 左补0 284 | * @param str 285 | * @param strLength 286 | * @return 287 | */ 288 | public static String addZERO(String str, int strLength) { 289 | String s = str; 290 | int strLen = strLength - str.length(); 291 | for (int i = 0; i < strLen; i++) { 292 | s = "0"+s; 293 | } 294 | return s; 295 | } 296 | 297 | 298 | 299 | 300 | } 301 | -------------------------------------------------------------------------------- /ISO8583Util.java: -------------------------------------------------------------------------------- 1 | import java.io.ByteArrayOutputStream; 2 | import java.util.ArrayList; 3 | import java.util.List; 4 | 5 | /** 6 | * 7 | * @brief 8 | *

9 | * 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,List macList,StringBuffer packLog) { 42 | 43 | String value = (String) getAttributeValue(msg); 44 | packLog.append("["+this.bit+"] ["+value+"]"+"\n"); 45 | if (value == null) { 46 | if (isRequired()) { 47 | return false; 48 | } 49 | return false; 50 | } else { 51 | try { 52 | byte[] b = value.getBytes("GBK"); 53 | this.length = b.length; 54 | String lens = writeLengthValue(out); 55 | out.write(b); 56 | if(this.isMac() == true){ 57 | macList.add(lens+value); 58 | } 59 | return true; 60 | } catch (IOException e) { 61 | e.printStackTrace(); 62 | return false; 63 | } 64 | 65 | } 66 | 67 | } 68 | 69 | 70 | 71 | public void unpack(InputStream in, EFTMessage msg,StringBuffer retLog) { 72 | readLengthValue(in); 73 | byte[] value = new byte[this.length]; 74 | try { 75 | in.read(value,0,value.length); 76 | setAttributeValue(msg,new String(value)); 77 | retLog.append("["+this.bit+"] ["+new String(value,"GBK")+"]"+"\n"); 78 | } catch (IOException e) { 79 | e.printStackTrace(); 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /MutableBCDField.java: -------------------------------------------------------------------------------- 1 | /** 2 | * $Log: MutableBCDField.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/09 02:40:14 wangl 10 | * 修改BCDGroupField处理方式 11 | * 12 | * Revision 1.2 2007/11/06 09:26:48 wangl 13 | * 修改对齐方式写错的地方 14 | * 15 | * Revision 1.1 2007/11/02 07:16:55 wangl 16 | * 添加新的重构後的代码 17 | * 18 | * Revision 1.2 2007/10/09 03:17:47 liaok 19 | * 修正可选域的截取问题 20 | * 21 | * Revision 1.2 2007/09/19 07:55:24 liaok 22 | * 增加非定长属性字段 23 | * 24 | * Revision 1.1.1.1 2007/09/11 07:15:00 ndscm 25 | * 提交金融后台代码-zhaol 26 | * 27 | */ 28 | import java.io.IOException; 29 | import java.io.InputStream; 30 | import java.io.OutputStream; 31 | import java.util.List; 32 | 33 | 34 | /** 35 | * @brief 36 | *

37 | * 变长的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,List macList,StringBuffer packLog) { 57 | String value = (String) getAttributeValue(msg); 58 | if (value == null) { 59 | if (isRequired()) { 60 | System.out.println("必选域但是EFTMessage数据为空:" + getFieldName()); 61 | } 62 | return false; 63 | } else { 64 | try { 65 | this.length = value.length(); 66 | writeLengthValue(out); 67 | byte[] val = ISO8583Util.createBCDByteArray(value,ISO8583Util.SUFFIX); 68 | out.write(val); 69 | return true; 70 | } catch (IOException e) { 71 | e.printStackTrace(); 72 | return false; 73 | } 74 | 75 | } 76 | } 77 | 78 | 79 | public void unpack(InputStream in, EFTMessage msg,StringBuffer retLog) { 80 | readLengthValue(in); 81 | byte[] value = new byte[this.lengthInByte]; 82 | try { 83 | in.read(value,0,value.length); 84 | String valueStr = ISO8583Util.compressedBCD2String(value); 85 | String val = valueStr.substring(0,getLength()); 86 | setAttributeValue(msg,val); 87 | } catch (IOException e) { 88 | e.printStackTrace(); 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /MutableBinaryField.java: -------------------------------------------------------------------------------- 1 | /** 2 | * $Log: MutableBinaryField.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 | import java.io.IOException; 15 | import java.io.InputStream; 16 | import java.io.OutputStream; 17 | import java.util.List; 18 | 19 | 20 | /** 21 | * @brief 22 | *

23 | * 变长的二进制字段的处理 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 macList,StringBuffer packLog) { 45 | byte[] value = (byte[]) getAttributeValue(msg); 46 | if (value == null) { 47 | if (isRequired()) { 48 | System.out.println("必选域但是EFTMessage数据为空:" + getFieldName()); 49 | } 50 | return false; 51 | } else { 52 | try { 53 | this.length = value.length; 54 | writeLengthValue(out); 55 | out.write(value); 56 | return true; 57 | } catch (IOException e) { 58 | e.printStackTrace(); 59 | return false; 60 | } 61 | 62 | } 63 | } 64 | 65 | 66 | public void unpack(InputStream in, EFTMessage msg,StringBuffer retLog) { 67 | readLengthValue(in); 68 | byte[] value = new byte[this.length]; 69 | try { 70 | in.read(value,0,value.length); 71 | setAttributeValue(msg,value); 72 | } catch (IOException e) { 73 | e.printStackTrace(); 74 | } 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /MutableField.java: -------------------------------------------------------------------------------- 1 | /** 2 | * $Log: MutableField.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/09 02:40:14 wangl 10 | * 修改BCDGroupField处理方式 11 | * 12 | * Revision 1.2 2007/11/06 09:26:48 wangl 13 | * 修改对齐方式写错的地方 14 | * 15 | * Revision 1.1 2007/11/02 07:16:55 wangl 16 | * 添加新的重构後的代码 17 | * 18 | */ 19 | 20 | import java.io.IOException; 21 | import java.io.InputStream; 22 | import java.io.OutputStream; 23 | 24 | /** 25 | * 26 | * 27 | *

变长字段数据处理的基类

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 | --------------------------------------------------------------------------------