Мне нужно распаковать и получить MTI, представить значения элементов данных
303831308220000002000000040000000000000031313233303930323333303733313536303033303
1 строка сообщения. Итак, как вы видите, MTI должен быть 3038. Но когда я получаю значение MTI с помощью оператора isoMsg.getMTI();, он дает 0810 в качестве вывода. Итак, в чем проблема с моим кодом? Пожалуйста, ознакомьтесь с этим руководством.https://kodejava.org/how-do-i-unpack-an-iso-8583-message/ Там первые четыре поля отображаются как MTI, но я не получаю свои первые четыре поля как MTI .Пожалуйста, дайте подробный ответ.
public class IsoUnpacker {
public static void main(String[] args) {
String message = "3038313082200000020000000400000000000000313132333039303233333037333135363030333031";
IsoUnpacker iso = new IsoUnpacker();
try {
ISOMsg isoMsg = iso.parseISOMessage(message);
iso.printISOMessage(isoMsg);
} catch (Exception e) {
e.printStackTrace();
}
}
private ISOMsg parseISOMessage(String message) throws Exception {
System.out.printf("Message = %s%n", message);
try {
ISOMsg isoMsg= new ISOMsg();
GenericValidatingPackager packager = new GenericValidatingPackager();
packager.readFile("C:\\Users\\Hasindu\\Documents\\ISO_Unpacker\\iso_unpacking\\src\\resources\\fields.xml");
isoMsg.setPackager(packager);
isoMsg.unpack(ISOUtil.hex2byte(message));
return isoMsg;
} catch (ISOException e) {
System.out.println(e.getMessage());
}
return null ;
}
private void printISOMessage(ISOMsg isoMsg) {
try {
System.out.printf("MTI = %s%n", isoMsg.getMTI());
for (int i = 1; i <= isoMsg.getMaxField(); i++) {
if (isoMsg.hasField(i)) {
System.out.printf("Field (%s) = %s%n", i, isoMsg.getString(i));
}
}
} catch (ISOException e) {
e.printStackTrace();
}
}
}
файл fields.xml
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<!DOCTYPE isopackager PUBLIC
"-//jPOS/jPOS Generic Packager DTD 1.0//EN"
"http://jpos.org/dtd/generic-packager-1.0.dtd">
<!-- ISO 8583:1987 (ASCII) field descriptions for GenericPackager -->
<!-- Bitmap is BINARY in this case -->
<isopackager>
<isofield
id = "0"
length = "4"
name = "MESSAGE TYPE INDICATOR"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "1"
length = "16"
name = "BIT MAP"
class = "org.jpos.iso.IFB_BITMAP"/>
<isofield
id = "2"
length = "19"
name = "PAN - PRIMARY ACCOUNT NUMBER"
class = "org.jpos.iso.IFA_LLNUM"/>
<isofield
id = "3"
length = "6"
name = "PROCESSING CODE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "4"
length = "12"
name = "AMOUNT, TRANSACTION"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "5"
length = "12"
name = "AMOUNT, SETTLEMENT"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "6"
length = "12"
name = "AMOUNT, CARDHOLDER BILLING"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "7"
length = "10"
name = "TRANSMISSION DATE AND TIME"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "8"
length = "8"
name = "AMOUNT, CARDHOLDER BILLING FEE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "9"
length = "8"
name = "CONVERSION RATE, SETTLEMENT"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "10"
length = "8"
name = "CONVERSION RATE, CARDHOLDER BILLING"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "11"
length = "6"
name = "SYSTEM TRACE AUDIT NUMBER"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "12"
length = "6"
name = "TIME, LOCAL TRANSACTION"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "13"
length = "4"
name = "DATE, LOCAL TRANSACTION"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "14"
length = "4"
name = "DATE, EXPIRATION"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "15"
length = "4"
name = "DATE, SETTLEMENT"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "16"
length = "4"
name = "DATE, CONVERSION"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "17"
length = "4"
name = "DATE, CAPTURE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "18"
length = "4"
name = "MERCHANTS TYPE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "19"
length = "3"
name = "ACQUIRING INSTITUTION COUNTRY CODE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "20"
length = "3"
name = "PAN EXTENDED COUNTRY CODE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "21"
length = "3"
name = "FORWARDING INSTITUTION COUNTRY CODE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "22"
length = "3"
name = "POINT OF SERVICE ENTRY MODE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "23"
length = "3"
name = "CARD SEQUENCE NUMBER"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "24"
length = "3"
name = "NETWORK INTERNATIONAL IDENTIFIEER"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "25"
length = "2"
name = "POINT OF SERVICE CONDITION CODE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "26"
length = "2"
name = "POINT OF SERVICE PIN CAPTURE CODE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "27"
length = "1"
name = "AUTHORIZATION IDENTIFICATION RESP LEN"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "28"
length = "9"
name = "AMOUNT, TRANSACTION FEE"
class = "org.jpos.iso.IFA_AMOUNT"/>
<isofield
id = "29"
length = "9"
name = "AMOUNT, SETTLEMENT FEE"
class = "org.jpos.iso.IFA_AMOUNT"/>
<isofield
id = "30"
length = "9"
name = "AMOUNT, TRANSACTION PROCESSING FEE"
class = "org.jpos.iso.IFA_AMOUNT"/>
<isofield
id = "31"
length = "9"
name = "AMOUNT, SETTLEMENT PROCESSING FEE"
class = "org.jpos.iso.IFA_AMOUNT"/>
<isofield
id = "32"
length = "11"
name = "ACQUIRING INSTITUTION IDENT CODE"
class = "org.jpos.iso.IFA_LLNUM"/>
<isofield
id = "33"
length = "11"
name = "FORWARDING INSTITUTION IDENT CODE"
class = "org.jpos.iso.IFA_LLNUM"/>
<isofield
id = "34"
length = "28"
name = "PAN EXTENDED"
class = "org.jpos.iso.IFA_LLCHAR"/>
<isofield
id = "35"
length = "37"
name = "TRACK 2 DATA"
class = "org.jpos.iso.IFA_LLNUM"/>
<isofield
id = "36"
length = "104"
name = "TRACK 3 DATA"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "37"
length = "12"
name = "RETRIEVAL REFERENCE NUMBER"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "38"
length = "6"
name = "AUTHORIZATION IDENTIFICATION RESPONSE"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "39"
length = "2"
name = "RESPONSE CODE"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "40"
length = "3"
name = "SERVICE RESTRICTION CODE"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "41"
length = "8"
name = "CARD ACCEPTOR TERMINAL IDENTIFICACION"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "42"
length = "15"
name = "CARD ACCEPTOR IDENTIFICATION CODE"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "43"
length = "40"
name = "CARD ACCEPTOR NAME/LOCATION"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "44"
length = "25"
name = "ADITIONAL RESPONSE DATA"
class = "org.jpos.iso.IFA_LLCHAR"/>
<isofield
id = "45"
length = "76"
name = "TRACK 1 DATA"
class = "org.jpos.iso.IFA_LLCHAR"/>
<isofield
id = "46"
length = "999"
name = "ADITIONAL DATA - ISO"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "47"
length = "999"
name = "ADITIONAL DATA - NATIONAL"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "48"
length = "999"
name = "ADITIONAL DATA - PRIVATE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "49"
length = "3"
name = "CURRENCY CODE, TRANSACTION"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "50"
length = "3"
name = "CURRENCY CODE, SETTLEMENT"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "51"
length = "3"
name = "CURRENCY CODE, CARDHOLDER BILLING"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "52"
length = "8"
name = "PIN DATA"
class = "org.jpos.iso.IFA_BINARY"/>
<isofield
id = "53"
length = "16"
name = "SECURITY RELATED CONTROL INFORMATION"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "54"
length = "120"
name = "ADDITIONAL AMOUNTS"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "55"
length = "999"
name = "RESERVED ISO"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "56"
length = "999"
name = "RESERVED ISO"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "57"
length = "999"
name = "RESERVED NATIONAL"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "58"
length = "999"
name = "RESERVED NATIONAL"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "59"
length = "999"
name = "RESERVED NATIONAL"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "60"
length = "999"
name = "RESERVED PRIVATE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "61"
length = "999"
name = "RESERVED PRIVATE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "62"
length = "999"
name = "RESERVED PRIVATE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "63"
length = "999"
name = "RESERVED PRIVATE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "64"
length = "8"
name = "MESSAGE AUTHENTICATION CODE FIELD"
class = "org.jpos.iso.IFA_BINARY"/>
<isofield
id = "65"
length = "1"
name = "BITMAP, EXTENDED"
class = "org.jpos.iso.IFA_BINARY"/>
<isofield
id = "66"
length = "1"
name = "SETTLEMENT CODE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "67"
length = "2"
name = "EXTENDED PAYMENT CODE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "68"
length = "3"
name = "RECEIVING INSTITUTION COUNTRY CODE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "69"
length = "3"
name = "SETTLEMENT INSTITUTION COUNTRY CODE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "70"
length = "3"
name = "NETWORK MANAGEMENT INFORMATION CODE"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "71"
length = "4"
name = "MESSAGE NUMBER"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "72"
length = "4"
name = "MESSAGE NUMBER LAST"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "73"
length = "6"
name = "DATE ACTION"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "74"
length = "10"
name = "CREDITS NUMBER"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "75"
length = "10"
name = "CREDITS REVERSAL NUMBER"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "76"
length = "10"
name = "DEBITS NUMBER"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "77"
length = "10"
name = "DEBITS REVERSAL NUMBER"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "78"
length = "10"
name = "TRANSFER NUMBER"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "79"
length = "10"
name = "TRANSFER REVERSAL NUMBER"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "80"
length = "10"
name = "INQUIRIES NUMBER"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "81"
length = "10"
name = "AUTHORIZATION NUMBER"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "82"
length = "12"
name = "CREDITS, PROCESSING FEE AMOUNT"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "83"
length = "12"
name = "CREDITS, TRANSACTION FEE AMOUNT"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "84"
length = "12"
name = "DEBITS, PROCESSING FEE AMOUNT"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "85"
length = "12"
name = "DEBITS, TRANSACTION FEE AMOUNT"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "86"
length = "16"
name = "CREDITS, AMOUNT"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "87"
length = "16"
name = "CREDITS, REVERSAL AMOUNT"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "88"
length = "16"
name = "DEBITS, AMOUNT"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "89"
length = "16"
name = "DEBITS, REVERSAL AMOUNT"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "90"
length = "42"
name = "ORIGINAL DATA ELEMENTS"
class = "org.jpos.iso.IFA_NUMERIC"/>
<isofield
id = "91"
length = "1"
name = "FILE UPDATE CODE"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "92"
length = "2"
name = "FILE SECURITY CODE"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "93"
length = "6"
name = "RESPONSE INDICATOR"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "94"
length = "7"
name = "SERVICE INDICATOR"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "95"
length = "42"
name = "REPLACEMENT AMOUNTS"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "96"
length = "16"
name = "MESSAGE SECURITY CODE"
class = "org.jpos.iso.IFA_BINARY"/>
<isofield
id = "97"
length = "17"
name = "AMOUNT, NET SETTLEMENT"
class = "org.jpos.iso.IFA_AMOUNT"/>
<isofield
id = "98"
length = "25"
name = "PAYEE"
class = "org.jpos.iso.IF_CHAR"/>
<isofield
id = "99"
length = "11"
name = "SETTLEMENT INSTITUTION IDENT CODE"
class = "org.jpos.iso.IFA_LLNUM"/>
<isofield
id = "100"
length = "11"
name = "RECEIVING INSTITUTION IDENT CODE"
class = "org.jpos.iso.IFA_LLNUM"/>
<isofield
id = "101"
length = "17"
name = "FILE NAME"
class = "org.jpos.iso.IFA_LLCHAR"/>
<isofield
id = "102"
length = "28"
name = "ACCOUNT IDENTIFICATION 1"
class = "org.jpos.iso.IFA_LLCHAR"/>
<isofield
id = "103"
length = "28"
name = "ACCOUNT IDENTIFICATION 2"
class = "org.jpos.iso.IFA_LLCHAR"/>
<isofield
id = "104"
length = "100"
name = "TRANSACTION DESCRIPTION"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "105"
length = "999"
name = "RESERVED ISO USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "106"
length = "999"
name = "RESERVED ISO USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "107"
length = "999"
name = "RESERVED ISO USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "108"
length = "999"
name = "RESERVED ISO USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "109"
length = "999"
name = "RESERVED ISO USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "110"
length = "999"
name = "RESERVED ISO USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "111"
length = "999"
name = "RESERVED ISO USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "112"
length = "999"
name = "RESERVED NATIONAL USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "113"
length = "999"
name = "RESERVED NATIONAL USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "114"
length = "999"
name = "RESERVED NATIONAL USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "115"
length = "999"
name = "RESERVED NATIONAL USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "116"
length = "999"
name = "RESERVED NATIONAL USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "117"
length = "999"
name = "RESERVED NATIONAL USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "118"
length = "999"
name = "RESERVED NATIONAL USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "119"
length = "999"
name = "RESERVED NATIONAL USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "120"
length = "999"
name = "RESERVED PRIVATE USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "121"
length = "999"
name = "RESERVED PRIVATE USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "122"
length = "999"
name = "RESERVED PRIVATE USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "123"
length = "999"
name = "RESERVED PRIVATE USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "124"
length = "999"
name = "RESERVED PRIVATE USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "125"
length = "999"
name = "RESERVED PRIVATE USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "126"
length = "999"
name = "RESERVED PRIVATE USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "127"
length = "999"
name = "RESERVED PRIVATE USE"
class = "org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id = "128"
length = "8"
name = "MAC 2"
class = "org.jpos.iso.IFA_BINARY"/>
</isopackager>
Выход:
Message = 3038313082200000020000000400000000000000313132333039303233333037333135363030333031
MTI = 0810
Field (7) = 1123090233
Field (11) = 073156
Field (39) = 00
Field (70) = 301
@JimGarrison Да, на самом деле я это заметил. Но не смог решить проблему.
Я не вижу проблемы в том, что MTI этого сообщения действительно 0810
@AndrésAlcarraz MTI должно быть 3038, как это может быть 0810
потому что это так, 3038 не является допустимым MTI, 0810 является общим MTI и является MTI для ответов на сообщения 0800
@AndrésAlcarraz Я не понял, должны ли это быть первые четыре поля, я имею в виду, что обычно MTI - это первые четыре поля сообщения, что означает 3038.
30=0, 38=8, 31=1 30=0 в ASCII, это первые 4 байта, точно. у вас есть шестнадцатеричное представление байтов ASCII. В вашей входной строке каждые два символа представляют собой шестнадцатеричное представление байта.
@AndrésAlcarraz Pal, не могли бы вы взглянуть на этот пример .kodejava.org/how-do-i-unpack-an-iso-8583-message . Почему я не могу выполнить те же шаги, чтобы получить вывод. Я имею в виду, что вы можете видеть, что он использовал метод message.getBytes(). Но когда я использовал этот метод, он дает мне исключение во время выполнения. Итак, вместо этого метода Я использовал ISOUtil.hex2byte(сообщение); здесь. Я имею в виду, что вы можете видеть, что он получил первые 4 поля своей входной строки как значение MTI.
Все зависит от формата, в этом примере сообщение не является шестнадцатеричным представлением.




Это не полный ответ, но он слишком велик для комментария и может помочь вам разобраться в проблеме.
Примечание:
3038313082200000020000000400000000000000313132333039303233333037333135363030333031
Похоже, это строка ASCII в шестнадцатеричном кодировании с некоторыми двоичными элементами в начале.
Если я конвертирую в ASCII, предполагая, что двоичные биты представляют собой 32-битные целые числа с прямым порядком байтов, я получаю
"0810" ASCII
0x00002082
0x00000002
0x00000004
0x00000000
"112309023307315600301" ASCII
Надеюсь, это поможет вам разобраться в проблеме.
Да, но я не уверен, как получить 0810 в качестве вывода вместо 3038. Вы говорите о 30383130, а не о 3038.
Дело в том, что значение ЕСТЬ 0810. Эта длинная строка не является сообщением, это шестнадцатеричное представление фактического сообщения. Фактическое сообщение представляет собой набор двоичных и строковых объектов данных ASCII, которые я предоставил.
Это правильное и хорошо сформированное сообщение. MTI 0810 = ответ управления сетью, поле 70, код информации управления сетью, 301 означает эхо-тест, поле 39 = 00 означает ОК, поле 11 — номер аудита трассировки системы, идентификатор сообщения, которое связывает ответ с запросом, а поле 7 - дата и время, 23 ноября, 09:02:33.
Битовая карта 822000000200000004000000000000000. Подсчитайте биты, начиная с 1, и вы получите 1, 7, 11, 39 и 70. Поле 1 — это вторая битовая карта.
ISO 8583 — довольно свободный стандарт, и каждая его реализация немного отличается. Например, у каждого бренда карты есть своя версия. Но этот конкретный пример является стандартным.
Я сравнивал не со ссылкой, которую вы дали, а с версией стандарта.
Попробуй это:
package org.kodejava.example.jpos;
import org.jpos.iso.ISOException;
import org.jpos.iso.ISOMsg;
import org.jpos.iso.packager.GenericPackager;
import java.io.InputStream;
public class IsoUnpacker {
public static void main(String[] args) {
IsoUnpacker iso = new IsoUnpacker();
try {
String message = "02003220000000808000000010000000001500120604120000000112340001840";
ISOMsg isoMsg = iso.parseISOMessage(message);
iso.printISOMessage(isoMsg);
} catch (Exception e) {
e.printStackTrace();
}
}
private ISOMsg parseISOMessage(String message) throws Exception {
System.out.printf("Message = %s%n", message);
try {
// Load package from resources directory.
InputStream is = getClass().getResourceAsStream("C:\\Users\\Hasindu\\Documents\\ISO_Unpacker\\iso_unpacking\\src\\resources\\fields.xm");
GenericPackager packager = new GenericPackager(is);
ISOMsg isoMsg = new ISOMsg();
isoMsg.setPackager(packager);
isoMsg.unpack(message.getBytes());
return isoMsg;
} catch (ISOException e) {
throw new Exception(e);
}
}
private void printISOMessage(ISOMsg isoMsg) {
try {
System.out.printf("MTI = %s%n", isoMsg.getMTI());
for (int i = 1; i <= isoMsg.getMaxField(); i++) {
if (isoMsg.hasField(i)) {
System.out.printf("Field (%s) = %s%n", i, isoMsg.getString(i));
}
}
} catch (ISOException e) {
e.printStackTrace();
}
}
}
В вашем подходе все в порядке, все пытались объяснить одно и то же, но позвольте мне сначала прояснить для вас основы, а затем постараюсь ответить на все ваши вопросы, которые вы задали в ОП или в комментариях.
Понимание ISO 8583 (Отказ от ответственности: мои слова и из Википедии)
Это международный стандарт обмена сообщениями о финансовых транзакциях. Он поставляется с определенным форматом, и многие крупные схемы, такие как MasterCard, Visa, используют его. По определению первые 4 места это MTI -> Message Type Indicator. И так далее там цифры со своими местами имеют определенное значение.
В основном определяя, что это за сообщение? Теперь, как уже упоминалось, это стандартный протокол, который означает, что определены даже действительные MTI. Итак, изучая или понимая ISO 8583, вы должны начать изучать, что такое действительные MTI?
Теперь я настоятельно рекомендую прочитать этот раздел, прежде чем читать дальше: MTI_Wiki
После прочтения вы, возможно, поняли, что индикатор типа сообщения включает версию ISO 8583, класс сообщения, функцию сообщения и источник сообщения. То есть: эти 4 цифры объясняют вышеприведенные 3 вещи.
Взяв пример вашего сообщения: 303831xxxxxxxxxxxxxxxxxxxxxx
Теперь, если мы перейдем к вашему сообщению, а также посмотрим на ссылку, которой я поделился выше, первая цифра 3 в 3038xxсогласно ISO 8583 недоступна для использования и, скорее, зарезервирована самой ISO.
Это означает - то, что вы ожидали изначально как MTI 3038 - это даже не действительный MTI !!
что в дальнейшем должно было заставить вас понять, что это либо неправильное сообщение, либо каким-то образом закодированное сообщение.
И в вашем случае это последнее, так как это шестнадцатеричное закодированное сообщение, что совершенно нормально, поскольку многие бизнес-объекты могут иметь любой тип соглашения о выборе.
Сказав это, вы должны понимать, чтобы использовать любую библиотеку ISO чтобы упаковать или распаковать или что-нибудь еще, вы должны сначала перевести свой сообщение в допустимом формате ISO 8583.
Таким образом, ваше решение использовать isoMsg.unpack(ISOUtil.hex2byte(message)); абсолютно справедливо в этой ситуации, и, конечно, это isoMsg.unpack(message.getBytes()); обречено на неудачу, потому что, когда вы говорите message.getBytes(), вы не передаете действительное сообщение ISO 8583 стандартной функции распаковки.
Итак, в вашем сообщении:
Message = 3038313082200000020000000400000000000000313132333039303233333037333135363030333031
Наличие 30383130 (в шестнадцатеричном кодировании)
MTI = 0810
Как узнать, является ли сообщение базовым 16 (в шестнадцатеричном кодировании)?
Для этого настоятельно рекомендуется иметь соглашение от инициатора-эквайера/терминала/любого интерфейса, чтобы сообщить потребителю/банку/любому интерфейсу, в каком формате придет сообщение.
Это стандартная практика в организации, таким образом настраиваются ответчики. И я уверен, что от этого инициатора, где вы получаете 303831xxxxxxxxxx , завтра вы не начнете получать 0810xxxx (как в ASCII), если только они не изменят конфигурацию/настройку на своем конце, для чего вы/ваша компания должны быть информированный. Что касается финансовой сделки, чтобы быть успешным, все связанные стороны должны сыграть свою роль.
Я не могу вспомнить какую-либо библиотеку для обнаружения кодировки, конечно, у вас может быть что-то, что может обнаруживать, но все же я бы попросил стандартизировать это как соглашение между сторонами, как я сказал выше.
Совет для профессионалов: со временем вы сами сможете определить кодировку или тип сообщения, просто взглянув на MTI ;)! Поверьте мне!
Надеюсь, я ответил на все ваши сомнения, если больше, не стесняйтесь спрашивать. Удачи!
Большое спасибо за отличное объяснение. Без сомнения, это лучшее объяснение. Я полностью с вами согласен, после публикации этого вопроса в течение нескольких дней в сообществе и из-за отсутствия подробного ответа, подобного вашему, я наконец прояснил эти сомнения через компанию SE, которая является экспертом в этой области. Большинство объяснений (почти все), которые он дал, были такими же, как и ваши.
Рад, помогло! Спасибо за высокую оценку. Удачи с ISO 8583, многое еще впереди :) !
У вас, похоже, проблемы с репрезентацией. Вы обрабатываете входное сообщение как шестнадцатеричное, но где-то есть несоответствие. Обратите внимание, что
30383130— это шестнадцатеричное значение строки ASCII0810. Я ничего не знаю об ISO8583, поэтому не могу быть более конкретным, но несоответствие кодировки очевидно.