Как исправить ошибку сокета Java ISO8583: ОШИБКА ПЕРЕДАЧИ - PullRequest
0 голосов
/ 15 мая 2019

Я работаю над проектом, и эта ошибка вызывает у меня головную боль. Я использую библиотеку Java J8583 для создания сообщения ISO8583 и отправки на удаленный сервер. Ответ сервера является шестнадцатеричным значением: 5452414E53414354494F4E204552524F52, которое при преобразовании в ASCII: ОШИБКА ПЕРЕДАЧИ.

// function to construct Message
public IsoMessage createLoadRequest(String tag) {
IsoMessage nManagementMsg = messageFactory.newMessage(0x0800);
Date date = new Date();

String terminalID = new Utils().retrieveTerminalID(); 


nManagementMsg.setField(3, new IsoValue<Object>(IsoType.ALPHA, tag, 6));
nManagementMsg.setField(7, new IsoValue<Object>(IsoType.NUMERIC, utcTime.format(date), 10));
lastTransactionAuditCode = Utils.randomAlphaNumeric(6);
nManagementMsg.setField(11, new IsoValue<Object>(IsoType.NUMERIC, lastTransactionAuditCode, 6)); // System Trace Audit Number
nManagementMsg.setField(12, new IsoValue<>(IsoType.NUMERIC, localTime.format(date), 6));
nManagementMsg.setField(13, new IsoValue<>(IsoType.DATE_EXP, localDate.format(date), 4));
nManagementMsg.setField(41, new IsoValue<Object>(IsoType.ALPHA, terminalID, 8));

return nManagementMsg;
}

//function to make send Message to server
public boolean retrieveData() throws UnsupportedEncodingException {

IsoMessage networkManagementMsg = this.createLoadRequest("567YUY");

String strToSend = new String(networkManagementMsg.writeData());

if (!start()) {
    return false;
}

try {

        logger.info(strToSend);

    outputStream.writeUTF(strToSend);
    IsoMessage response = readMessage();
    final String result = response.getAt(39).toString();

    if (!result.equals("00")) {
        logger.log(Level.WARNING, "Network Management Response contains a non-zero result code {0}", result);
        return false;
    }

    // parse and get required data
    String value = response.getAt(62).toString();
    System.out.println(value);


    return true;
 } catch (Exception ex) {
    logger.severe("Exception while loading terminal info");
    ex.printStackTrace();
    return false;
} finally {
    stop();
}
}

Я ожидал, что ISOMessage вернул ошибку:

INFO: 08002238000000800000567YUY0515135835Q56U46135835051520390013

INFO: Received response: 5452414E53414354494F4E204552524F52

INFO: IsoMessage: null

java.io.IOException: Failed to parse iso message string: 

5452414E53414354494F4E204552524F52

1 Ответ

0 голосов
/ 23 мая 2019

Трудно сказать без более широкого контекста вашего проекта и значений каждого поля, которое вы хотите упаковать, но ваш запрос выглядит странно. STAN (поле 11) должен быть числовым, но содержит альфа. Кроме того, вам следует проверить кодировку идентификатора терминала (поле 41), так как он может составлять 8 байтов напрямую, как вы его построили, но в некоторых системах я видел 16 байтов, использующих шестнадцатеричное кодирование.

...