ISO8583電文パーシングプログラム
プログラムの用途 | 実装するJavaインターフェース | 適用する設定画面 |
---|---|---|
ユーザー呼び出しプログラム | Iso8583ParsingProcess | Message Management > ISO8583 Message Layout Information |
BXIで提供するISO8583電文パーシングプログラムで処理できない場合、ISO8583電文パーシングプログラムを開発して適用することができる。
caution
当該機能はできるだけ使用せず、フィールドを送信して特殊パーシングを処理するロジックは内部業務システムで業務ロジックに実装することを推奨する。
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電文は、一次的に登録された電文情報に従ってUnmarshalされたデータである。
- 55番フィールド全体を1つのフィールドデータとして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番フィールド全体を、1つのフィールドデータとして作成する。
- 55番フィールドの処理が完了したら、mapを再び55番フィールドの位置に保存する。
- 例のように、ISO8583電文規約で処理できない特殊フィールドを処理し、dataを返す。
- 1次的に完了したデータを基準に、BXIは電文作成のためにMarshalする。
☑ 入力
- headerBodyDscd : ヘッダー部・個別部区分コード
- data : 電文をMarshalする前のヘッダー部や個別部Mapデータ
- is8583MsgTrnsfrms : 登録されたISO8583電文情報
☑ 出力
- 特殊処理が完了したMapデータ