Перейти к содержимому

Фотография

Создание правильного сообщения формата iso8583 и отправка его с помощь


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 14

#1 alexanderTest

alexanderTest

    Новый участник

  • Members
  • Pip
  • 10 сообщений

Отправлено 14 ноября 2019 - 09:41

Здравствуйте. Кто нибудь работал с форматом iso8583. Нашел библиотеку https://github.com/i...age-Client-java .

 

Но правильно не собирает.

Передать:

Message size 30

Message type 0800
P0007 Transmission Date and Time LEN=10 OFFS=20 '1113085120'
P0011 Systems Trace Audit Number LEN=6 OFFS=25 '851694'
P0070 Network Management Code LEN=3 OFFS=28 '001'

 

Нужно собрать подобное сообщение (формат iso8583) :

00 1e 30 38 30 30 82 20 00 00 00 00 00 00 04 00 00 00 00 00 00 00 11 13 12 53 20 12 34 56 03 01

Сейчас формируется неправильное сообщение подобное этому:

3038303082200800222000000000000000000011130851201234560301

 

Можете подсказать может другие библиотеки или как формировать подобные сообщения средствами java ?

 


  • 0

#2 Freiman

Freiman

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 591 сообщений
  • ФИО:Андрей Адеркин
  • Город:Йошкар-Ола

Отправлено 14 ноября 2019 - 11:17

Да, что-то совсем не то сбилдилось.

А исходный код можете показать?


  • 0

#3 alexanderTest

alexanderTest

    Новый участник

  • Members
  • Pip
  • 10 сообщений

Отправлено 14 ноября 2019 - 12:08

Вот сбилдилось. Но как то неправильно формирует данные:

Вот код:

 

public class newClient2 {
public static void main(String[] args) throws ISOException, ISOClientException, IOException {
ISOMessage isoMessage = ISOMessageBuilder.Packer(VERSION.V1987)
.networkManagement()
.mti(MESSAGE_FUNCTION.Request, MESSAGE_ORIGIN.Acquirer)
.processCode("000000")
.setField(FIELDS.F7_TransmissionDataTime, "1113085120")
.setField(FIELDS.F11_STAN, "1234560301")
.setHeader("303830308220")
.build();

ISOClient client = ISOClientBuilder.createSocket("172.20.104.69", 5803)
.build();
System.out.println(isoMessage.toString());

client.connect();
String response = Arrays.toString(client.sendMessageSync(isoMessage)) ;
System.out.println("response = " + response);
client.disconnect();

}
}

 

Формируется такое сообщение :

3038303082200800222000000000000000000011130851201234560301

 

А я хочу вот такое сообщение:

00 1e 30 38 30 30 82 20 00 00 00 00 00 00 04 00 00 00 00 00 00 00 11 13 12 53 20 12 34 56 03 01

 

И вообще цель написать такой конвертер который из обычных данных (десятичного формата, обычных букв, времени) конвертировал бы в iso8583


  • 0

#4 alexanderTest

alexanderTest

    Новый участник

  • Members
  • Pip
  • 10 сообщений

Отправлено 14 ноября 2019 - 14:37

Да, что-то совсем не то сбилдилось.

А исходный код можете показать?

Исходный код на java сверху


  • 0

#5 alexanderTest

alexanderTest

    Новый участник

  • Members
  • Pip
  • 10 сообщений

Отправлено 15 ноября 2019 - 15:27

На сервере ошибка Error message: TParser::GetMMDDHHMMSSFieldBCD: could not ParseMMDDHHMMSSbcd. Что то не так с полем номер 7. Подскажите пожалуйста как решить это.


  • 0

#6 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 16 ноября 2019 - 17:21

Вот сбилдилось. Но как то неправильно формирует данные:
Вот код:
 
public class newClient2 {
public static void main(String[] args) throws ISOException, ISOClientException, IOException {
ISOMessage isoMessage = ISOMessageBuilder.Packer(VERSION.V1987)
.networkManagement()
.mti(MESSAGE_FUNCTION.Request, MESSAGE_ORIGIN.Acquirer)
.processCode("000000")
.setField(FIELDS.F7_TransmissionDataTime, "1113085120")
.setField(FIELDS.F11_STAN, "1234560301")
.setHeader("303830308220")
.build();

ISOClient client = ISOClientBuilder.createSocket("172.20.104.69", 5803)
.build();
System.out.println(isoMessage.toString());

client.connect();
String response = Arrays.toString(client.sendMessageSync(isoMessage)) ;
System.out.println("response = " + response);
client.disconnect();

}
}
 
Формируется такое сообщение :
3038303082200800222000000000000000000011130851201234560301
 
А я хочу вот такое сообщение:
00 1e 30 38 30 30 82 20 00 00 00 00 00 00 04 00 00 00 00 00 00 00 11 13 12 53 20 12 34 56 03 01
 
И вообще цель написать такой конвертер который из обычных данных (десятичного формата, обычных букв, времени) конвертировал бы в iso8583

Нифига не смыслю в вашем протоколе, но у вас явно в header не хватает 00 1e в начале
и посчитайте количество байт, если оно у вас съехало из за пропущенных символов, то у вас минуты попадают в месяцы,а парсер не знает 53 месяца.

ЗЫЖ у вас там 3-х пар символов не хватает, если исходить из предположения что длина сообщения фиксированная.

ЗЫЗЫЖ возможно 001e добавится автоматически на транспортном уровне, тогда у вас просто где-то продолбалась пара символов.
  • 0

#7 alexanderTest

alexanderTest

    Новый участник

  • Members
  • Pip
  • 10 сообщений

Отправлено 18 ноября 2019 - 07:47

Должно получиться:
30 38 30 30 82 20 00 00 00 00 00 00 04 00 00 00 00 00 00 00 11 13 12 53 20 12 34 56 03 01 data
 
Формируется: 
30 38 30 30 82 20 08 00 22 20 00 00 00 00 00 00 00 00 00 00 11 13 12 53 20 12 34 56 03 01
 
Не понимаю откуда берутся : 08 00 22 20

  • 0

#8 alexanderTest

alexanderTest

    Новый участник

  • Members
  • Pip
  • 10 сообщений

Отправлено 19 ноября 2019 - 15:05

Попробовал другой клиент:

public static void main (String[] args) throws Exception {
Logger logger = new Logger();
logger.addListener (new SimpleLogListener (System.out));
ISOChannel channel = new ASCIIChannel (
"172.20.104.69", 5803, new ISO87APackager()
);
((LogSource)channel).setLogger (logger, "test-channel");
channel.connect ();
ISOMsg m = new ISOMsg ();
m.setMTI ("0800");
m.set (3, "000000");
m.set (41, "00000001");
m.set (70, "301");
channel.send (m);
ISOMsg r = channel.receive ();
channel.disconnect ();
}

 

Выдает исключение:

Exception in thread "main" java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:197)
at org.jpos.iso.channel.ASCIIChannel.getMessageLength(ASCIIChannel.java:111)
at org.jpos.iso.BaseChannel.receive(BaseChannel.java:712)
at JposClient.main(JposClient.java:29)
 
Может подскажите пожалуйста, кто может знает, рабочие клиенты для работы с iso8583 ?

  • 0

#9 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 20 ноября 2019 - 09:32

Я подозреваю что оба клиента рабочие.
Вернитесь лучше к первому, он у вас как минимум ответ от сервера получал. И разберитесь что это за поля, почему в них есть какие-то значения и в какой момент они ставятся.
  • 0

#10 alexanderTest

alexanderTest

    Новый участник

  • Members
  • Pip
  • 10 сообщений

Отправлено 20 ноября 2019 - 13:53

Вроде разобрался теперь ответ не распаковывается ответ

 

public class ClientSocket {
//Должно получиться 30 38 30 30 82 20 00 00 00 00 00 00 04 00 00 00 00 00 00 00 11 13 12 53 20 12 34 56 03 01
//Сейчас 30 38 30 30 82 20 08 00 22 20 00 00 00 00 00 00 00 00 00 00 11 13 12 53 20 12 34 56 03 01
public static void main(String[] args) throws ISOException, ISOClientException, IOException, org.jpos.iso.ISOException {
ISOMessage isoMessage = ISOMessageBuilder.Packer(VERSION.V1987)
.defaultMan()
.mti(MESSAGE_FUNCTION.Request, MESSAGE_ORIGIN.Acquirer)
.processCode("0000000")
.setField(FIELDS.F7_TransmissionDataTime, "1113125320")
.setField(FIELDS.F11_STAN, "1234560301")
.setHeader("303830308220")
.build();

ISOClient client = ISOClientBuilder.createSocket("172.20.104.69", 5803)
.build();
System.out.println("isoMessage " + isoMessage);


client.connect();
byte[] response = client.sendMessageSync(isoMessage);
System.out.println("responseByte " + response);
System.out.println("response = " + Arrays.toString(response));
String hexString = StringUtil.fromByteArray(response);
System.out.println("response(hexString) = " + hexString);
client.disconnect();
// ParseISOMsg.parseISOMsg(hexString);
ISOMessage isoMessageUnpack = ISOMessageBuilder.Unpacker()
.setMessage(hexString)
.build();
byte[] body = isoMessage.getBody();
System.out.println("isoMessageUnpack " + isoMessageUnpack.getField(7));
}
}

 

response = [48, 56, 49, 48, -126, 32, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 17, 19, 18, 83, 32, 18, 52, 86, 48, 48, 3, 1]
response(hexString) = 3038313082200000020000000400000000000000111312532012345630300301
Exception in thread "main" com.imohsenb.ISO8583.exceptions.ISOException: Field No 7 does not exists
at com.imohsenb.ISO8583.entities.ISOMessage.getField(ISOMessage.java:84)
at ClientSocket.main(ClientSocket.java:49)
 
Может специальная кодировка. Может подскажете направление как это перевести примерно вот в такое:
 
Догадываюсь что там это, так как вижу ответ этот в логах :
Message type 0810
P0007 Transmission date and time LEN=10 OFFS=20 '0000000000'
P0011 Systems Trace Audit Number LEN=6 OFFS=30 '000000'
P0039 Response code LEN=2 OFFS=36 '00'
P0006 Network Management Code LEN=3 OFFS=38 '000'

  • 0

#11 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 20 ноября 2019 - 14:42

isoMessageUnpack.getField(7) а точно просто цифрой 7, а не FIELDS.F7_TransmissionDataTime
  • 0

#12 alexanderTest

alexanderTest

    Новый участник

  • Members
  • Pip
  • 10 сообщений

Отправлено 21 ноября 2019 - 10:16

isoMessageUnpack.getField(7) а точно просто цифрой 7, а не FIELDS.F7_TransmissionDataTime

так null выдает. 


  • 0

#13 alexanderTest

alexanderTest

    Новый участник

  • Members
  • Pip
  • 10 сообщений

Отправлено 21 ноября 2019 - 15:45

Еще вот такой код распарсивания iso 8583 попробывал:

import org.jpos.iso.packager.ISO87BPackager;
import org.jpos.iso.ISOException;
import org.jpos.iso.ISOMsg;
import org.jpos.iso.ISOUtil;

public class ParseISOMsg {
public static void main(String[] args) throws ISOException {
String hexmsg = "3038313082200000020000000400000000000000111312532012345630300301";
// convert hex string to byte array
byte[] bmsg =ISOUtil.hex2byte(hexmsg);
ISOMsg m = new ISOMsg();
// set packager, change ISO87BPackager for the matching one.
m.setPackager(new ISO87BPackager());
//unpack the message using the packager
m.unpack(bmsg);
//dump the message to standar output
m.dump(System.out, "");
}
}

 

Выдает :

Exception in thread "main" org.jpos.iso.ISOException: org.jpos.iso.IFB_NUMERIC: Problem unpacking field 23 (java.lang.ArrayIndexOutOfBoundsException: 32) unpacking field=23, consumed=31
at org.jpos.iso.ISOBasePackager.unpack(ISOBasePackager.java:340)
at org.jpos.iso.ISOMsg.unpack(ISOMsg.java:468)
at ParseISOMsg.main(ParseISOMsg.java:17)

  • 0

#14 AZ_Testing

AZ_Testing

    Новый участник

  • Members
  • Pip
  • 1 сообщений

Отправлено 30 декабря 2019 - 11:21

 

Должно получиться:
30 38 30 30 82 20 00 00 00 00 00 00 04 00 00 00 00 00 00 00 11 13 12 53 20 12 34 56 03 01 data
 
Формируется: 
30 38 30 30 82 20 08 00 22 20 00 00 00 00 00 00 00 00 00 00 11 13 12 53 20 12 34 56 03 01
 
Не понимаю откуда берутся : 08 00 22 20

 

Сообщение состоит из  хидера, кода сообщения (в твоем случае 0800) и после идет битовая маска (2220000000000000) это как правило 16 символов которые и определяют какие  поля заполнены. В частности эта битовая маска означает что заполнены поля 3, 7, 11. Сообщение составлено верно.


  • 0

#15 alexanderTest

alexanderTest

    Новый участник

  • Members
  • Pip
  • 10 сообщений

Отправлено 30 декабря 2019 - 11:22

Можете закрывать, я разобрался. Спасибо всем.


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных