ISO8583전문파싱 프로그램
프로그램용도 | 구현할 Java인터페이스 | 적용할 설정화면 |
---|---|---|
사용자호출프로그램 | Iso8583ParsingProcess | 전문관리 > ISO8583 전문정보 |
BXI에서 제공하는 ISO8583 전문 파싱 프로그램으로 처리할 수 없는 경우, ISO8583 전문 파싱 프로그램을 개발하여 적용할 수 있다.
주의
해당 기능은 가급적 사용하지 않고, 필드를 전송하고 특수 파싱을 처리하는 로직은 내부 업무 시스템에서 업무로직으로 구현하는 것을 권장한다.
ISO8583 전문파싱 프로그램 호출순서
- BXI에서 제공하는 ISO8583 파싱 프로그램을 통하여 등록된 ISO8583 파싱 정보를 이용하여 입력 데이터를 파싱한다.
- BXI에서 파싱이 끝나면 ISO8583 전문 정보 등록 시 등록한 사용자 프로그램을 호출하여 추가적인 파싱을 처리한다.
개발방법
BXI는 ISO8583 전문 처리를 헤더부와 개별부로 나누어서 처리한다. 즉, 아래 설명하는 API는 헤더부 처리 시 한번 호출되고, 개별부 처리 시 다시 한번 호출된다.
전문 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<String, Object>();
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를 리턴한다.
☑ 입력
- headerBodyDscd : 헤더부 개별부 구분코드
- data : 전문을 Unmarshal한 헤더부나 개별부 Map 데이터
- is8583MsgTrnsfrms : 등록된 ISO8583 전문정보
☑ 출력
- Unmarshal이 완료된 전문의 Map 데이터
전문 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<String, Object>();
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 한다.
☑ 입력
- headerBodyDscd : 헤더부 개별부 구분코드
- data : 전문을 Marshal하기 전 헤더부나 개별부 Map 데이터
- is8583MsgTrnsfrms : 등록된 ISO8583 전문정보
☑ 출력
- 특수 처리가 완료된 Map 데이터