IBAN Validierung aus Österreich

“Ba-Ba-Banküberfall … Ba-Ba-Banküberfall … Ba-Ba-Banküberfall …
Das Böse ist immer und überall!”

Erste Allgemeine Verunsicherung

Die bank-account-validator Bibliothek validiert bislang BIC und IBAN Angaben auf syntaktische Korrektheit. Bei deutschen BIC und IBAN werden die Angaben zusätzlich gegen eine Bankenliste der Deutschen Bundesbank geprüft. Damit wird zwar nicht die Existenz der Bankverbindung bewiesen, aber die Korrektheit der Bankangaben innerhalb des BIC und der IBAN.

Erfreulicherweise bietet die Österreichische Nationalbank eine Liste von Banken in Österreich an. Damit kann auch die Validierung von österreichischen Bankangaben verbessert werden. Bislang wird der EASYATW1 als valider österreichische BIC akzeptiert. Dies soll nun verhindert werden.

Die Österreichische Nationalbank stellt eine tagesaktuelle Liste der Banken in Form einer CSV-Datei bereit. Die ersten beiden Zeilen der Datei vom 22. September 2023 zeigt die Spaltenüberschriften in der ersten Zeile und die Angaben zur Raiffeisenbank Matrei am Brenner und Umgebung eGen.

Kennzeichen;Identnummer;Bankleitzahl;Institutsart;Sektor;Firmenbuchnummer;Bankenname;Straße;PLZ;Ort;Postadresse / Straße;Postadresse / PLZ;Postadresse / Ort;Postfach;Bundesland;Telefon;Fax;E-Mail;SWIFT-Code;Homepage;Gründungsdatum;LEI
Hauptanstalt;263451;36273;KI;Raiffeisen;39856m;Raiffeisenbank Matrei am Brenner und Umgebung eGen;Raiffeisenplatz 43a;6143;Matrei am Brenner;;;;;Tirol;05273/6111;05999/3688872090;info@raibamatrei.at;RZTIAT22273;www.raibamatrei.at;02.05.1897;529900NPXLPY9ZGPM933

Interessant für die Validierung sind nur die Spalten 2 (Bankleitzahl), 6 (Bankname) und 18 (SWIFT-Code).

Die BankService Implementierung für Österreich wird mit @CountryCode("AT") annotiert und in der convert Methode wird aus jeder Zeile der CSV-Datei eine Bank Instanz erzeugt.

@CountryCode("AT")
public class AustriaBankServiceImpl extends BankService {
    public static final String FILE_NAME = "sepa-zv-vz_gesamt-2023-09-22.csv";
    private final Map<String, List<Bank>> byBankIdentifierCode;
    private final Map<String, Bank> byBankCode;

    public AustriaBankServiceImpl() {
        List<Bank> banks = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(FILE_NAME), StandardCharsets.UTF_8))
                .lines().skip(1L).map(AustriaBankServiceImpl::convert).toList();
        byBankCode = banks.stream().collect(Collectors.toMap(Bank::getBankCode, b -> b, (a, b) -> a));
        byBankIdentifierCode = banks.stream().collect(Collectors.groupingBy(Bank::getBankIdentifierCode));
    }

    private static Bank convert(String x) {
        String[] parts = x.split(";");
        return new Bank(parts[6], parts[2], parts[18]);
    }

    @Override
    public List<Bank> byBankIdentifierCode(String bankIdentifierCode) {
        return byBankIdentifierCode.getOrDefault(bankIdentifierCode.length() == 8 ? bankIdentifierCode + "XXX" : bankIdentifierCode, List.of());
    }

    @Override
    public Bank byBankCode(String bankCode) {
        return byBankCode.get(bankCode);
    }

    @Override
    public Bank byBasicBankAcountNumber(String basicBankAccountNumber) {
        return byBankCode(basicBankAccountNumber.substring(0, 5));
    }
}

Damit die AustriaBankServiceImpl Klasse verwendet wird, muss sie außerdem in der Datei META-INF/services/de.schegge.bank.BankService aufgeführt werden.

Mit diesen Änderungen ist die Bibliothek nun in der Lage auch österreichische BIC und IBAN besser zu validieren. Im lenient-Mode werden weiterhin die BICs EASYATW1 und RLNWATWW als valide erkannt, ansonsten wird der BIC EASYATW1 abgelehnt.

Wer es selbst ausprobieren möchte, findet die aktuelle Bibliothek auf Maven Central.

<dependency>
    <groupId>de.schegge</groupId>
    <artifactId>bank-account-validator</artifactId>
    <version>0.3.1</version>
</dependency>

Leave a Comment