본문으로 건너뛰기
버전: 3.4.4

ISO8583전문파싱 프로그램

프로그램용도구현할 Java인터페이스적용할 설정화면
사용자호출프로그램Iso8583ParsingProcess전문관리 > ISO8583 전문정보

BXI에서 제공하는 ISO8583 전문 파싱 프로그램으로 처리할 수 없는 경우, ISO8583 전문 파싱 프로그램을 개발하여 적용할 수 있다.

주의

해당 기능은 가급적 사용하지 않고, 필드를 전송하고 특수 파싱을 처리하는 로직은 내부 업무 시스템에서 업무로직으로 구현하는 것을 권장한다.

ISO8583 전문파싱 프로그램 호출순서

  1. BXI에서 제공하는 ISO8583 파싱 프로그램을 통하여 등록된 ISO8583 파싱 정보를 이용하여 입력 데이터를 파싱한다.
  2. 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;
}
  1. ISO8583 전문은 1차적으로 등록된 전문정보에 따라서 Unmarshal된 데이터이다.
  2. 55번 필드 전체를 하나의 필드 데이터로 Unmarshal 되었으므로 코드에 따라서 각각 분리하여 map 저장한다.
  3. 55번 필드의 처리가 완료되면 map을 다시 55번 필드 자리에 저장한다.
  4. 예제와 같이 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. 1차적으로 사용자 프로그램을 통하여 특수 필드에 대해서 처리한다.
  2. 각각의 필드로 구성된 55번 필드 전체를 하나의 필드 데이터로 생성한다.
  3. 55번 필드의 처리가 완료되면 map을 다시 55번 필드 자리에 저장한다.
  4. 예제와 같이 ISO8583 전문 규약으로 처리할 수 없는 특수 필드를 처리하고 data를 리턴한다.
  5. 1차적으로 완료된 데이터를 기준으로 BXI는 전문 생성을 위해 Marshal 한다.

☑ 입력

  • headerBodyDscd : 헤더부 개별부 구분코드
  • data : 전문을 Marshal하기 전 헤더부나 개별부 Map 데이터
  • is8583MsgTrnsfrms : 등록된 ISO8583 전문정보

☑ 출력

  • 특수 처리가 완료된 Map 데이터