ISO8583전문파싱 프로그램
프로그램용도 | 구현할 인터페이스 | 적용할 설정화면 |
---|---|---|
사용자호출프로그램 |
Iso8583ParsingProcess |
전문관리 > ISO8583 전문정보 |
BXI에서 제공하는 ISO8583 전문 파싱 프로그램으로 처리할 수 없는 경우, ISO8583 전문 파싱 프로그램을 개발하여 적용할 수 있다.
해당 기능은 가급적 사용하지 않고, 필드를 전송하고 특수 파싱을 처리하는 로직은 내부 업무 시스템에서 업무로직으로 구현하는 것을 권장한다. |
1. ISO8583 전문파싱 프로그램 호출순서
-
BXI에서 제공하는 ISO8583 파싱 프로그램을 통하여 등록된 ISO8583 파싱 정보를 이용하여 입력 데이터를 파싱한다.
-
BXI에서 파싱이 끝나면 ISO8583 전문 정보 등록 시 등록한 사용자 프로그램을 호출하여 추가적인 파싱을 처리한다.
2. 개발방법
BXI는 ISO8583 전문 처리를 헤더부와 개별부로 나누어서 처리한다. 즉, 아래 설명하는 API는 헤더부 처리 시 한번 호출되고, 개별부 처리 시 다시 한번 호출된다.
2.1. 전문 Unmarshal API
대외 기관에서 수신한 ISO8583 전문을 내부 처리 전문으로 변환하는 API이다.
아래 예제는 ISO8583 전문을 전문 규약에 따라서 처리할 수 없는 55번 필드에 대해 특수하게 처리하는 예제이다.
@Override
public Map<String, Object> unmarshal(String headerBodyDscd, Map<String, Object> data,
Map<Integer, BxiIso8583MsgTrnsfrmIO> is8583MsgTrnsfrms) {
// Exclude header
if (headerBodyDscd.equals("H")) {
return data;
}
// 1. Unmarshal data
byte[] field55 = (byte[]) data.get("field55");
Map<String, Object> map = new HashMap();
// 2. 55 field separation
for (int i = 0; i < field55; i++) {
if (field55[i] == 0x5f) {
int length = (int)field55[i+1];
byte[] buffer = new byte[length];
System.arraycopy(field55, i+2, buffer, 0, length);
map.put("currCode", new String(buffer, CharsetUtil.DEFAULT_CHARSET));
i += (length + 1);
} else {
// TODO: Process the following code
}
}
// 3. Store 55 field data
data.put("field55", map);
// 4. Return
return data;
}
-
ISO8583 전문은 1차적으로 등록된 전문정보에 따라서 Unmarshal된 데이터이다.
-
55번 필드 전체를 하나의 필드 데이터로 Unmarshal 되었으므로 코드에 따라서 각각 분리하여 map 저장한다.
-
55번 필드의 처리가 완료되면 map을 다시 55번 필드 자리에 저장한다.
-
예제와 같이 ISO8583 전문 규약으로 처리할 수 없는 특수 필드를 처리하고 data를 리턴한다.
2.2. 전문 Marshal API
Marshal API는 반대로 대내 시스템에서 대외 기관에 ISO8583 전문을 전송하기 위해 ISO8583 전문으로 생성하는 API이다. Unmarshal API와 반대로 55번 필드를 Marshal하는 예제이다.
@Override
public Map<String, Object> marshal(String headerBodyDscd, Map<String, Object> data,
Map<Integer, BxiIso8583MsgTrnsfrmIO> is8583MsgTrnsfrms) {
// Exclude header
if (headerBodyDscd.equals("H")) {
return data;
}
Map<String, Object> map = new HashMap();
byte[] buffer = new byte[2048];
int length = 0;
// 2. 55 field merge
for (Entry<String, Object> entry : map.entrySet()) {
String name = entry.getKey();
String fieldData = (String) entry.getValue();
if (name.equals("currCode")) {
buffer[length++] = 0x5f;
buffer[length++] = (byte) fieldData.length();
byte[] array = fieldData.getBytes();
System.arraycopy(array, 0, buffer, length, array.length);
length += array.length;
} else {
// TODO: Process the following code
}
}
// 3. Store 55 field data
byte[] temp = new byte[length];
System.arraycopy(buffer, 0, temp, 0, length);
data.put("field55", temp);
return data;
}
-
1차적으로 사용자 프로그램을 통하여 특수 필드에 대해서 처리한다.
-
각각의 필드로 구성된 55번 필드 전체를 하나의 필드 데이터로 생성한다.
-
55번 필드의 처리가 완료되면 map을 다시 55번 필드 자리에 저장한다.
-
예제와 같이 ISO8583 전문 규약으로 처리할 수 없는 특수 필드를 처리하고 data를 리턴한다.
-
1차적으로 완료된 데이터를 기준으로 BXI는 전문 생성을 위해 Marshal 한다.