Beispiel Code funktioniert, Maven hingegen nicht

161 views
Skip to first unread message

Dorian

unread,
Feb 15, 2018, 10:02:05 AM2/15/18
to hbci4java
Hey,

ich bin vor kurzem auf hbci4j aufmerksam geworden und wollte es gerade einmal ausprobieren.

Wenn ich den Beispiel Code, mit meiner Kontonummer etc., ausführe funktioniert es wie erwartet. Mir werden meine letzen Transaktionen anzeigt und Konten angezeigt.

Allerdings wollte ich das ganze logischerweise über Maven benutzen, also habe ich ein neues Projekt erstellt und hbci4j eingebunden.

Wenn ich es allerdings ausführen möchte erhalte ich folgenden Fehler:

Exception in thread "main" org.kapott.hbci.exceptions.HBCI_Exception: Fehler beim Erzeugen eines HBCIHandler Objektes
at org.kapott.hbci.manager.HBCIHandler.<init>(HBCIHandler.java:142)
at UmsatzAbrufPinTan.main(UmsatzAbrufPinTan.java:105)
Caused by: org.kapott.hbci.exceptions.HBCI_Exception: Fehler beim Registrieren der Nutzerdaten
at org.kapott.hbci.manager.HBCIHandler.registerUser(HBCIHandler.java:281)
at org.kapott.hbci.manager.HBCIHandler.<init>(HBCIHandler.java:133)
... 1 more
Caused by: org.kapott.hbci.exceptions.HBCI_Exception: Fehler beim Ermitteln einer neuen System-ID
at org.kapott.hbci.manager.HBCIUser.fetchSysId(HBCIUser.java:474)
at org.kapott.hbci.manager.HBCIUser.updateUserData(HBCIUser.java:665)
at org.kapott.hbci.manager.HBCIUser.register(HBCIUser.java:690)
at org.kapott.hbci.manager.HBCIHandler.registerUser(HBCIHandler.java:279)
... 2 more
Caused by: org.kapott.hbci.exceptions.ProcessException: Fehler beim Ermitteln einer neuen System-ID
at org.kapott.hbci.manager.HBCIUser.fetchSysId(HBCIUser.java:461)
... 5 more

Process finished with exit code 1

Ich hatte das ganze eigentlich selbst geschrieben, dachte allerdings ich habe einen Fehler gemacht also habe ich zum testen einfach den Source der UmsatzAbrufPinTan.java in mein Projekt kopiert und ausgeführt. 

Unten ist noch einmal der gesamte Debug Log, was mich allerdings wundert ist dass der Log sagt mein PIN wäre falsch (ist exakt der selbe wie wenn ich den Beispiel Code nutze), der Stacktrace hingegen sagt die System-ID konnte nicht ermittelt werden.
Ich habe im Log einiges durch Sterne ersetzt weil ich nicht weiß inwiefern man Informationen gebrauchen könnte, falls etwas fehlt einfach schreiben.

Getestet habe ich es in meinem Projekt mit Version 3.0.12, allerdings auch mit der 3.0.13-SNAPSHOT (also von GitHub gecloned und compiled).

using default system locale de_DE
initialized HBCI4Java for thread group main
hbci4java 3.0.13-SNAPSHOT
trying to load BLZ data
creating new instance of a PinTan passport
loading data from file ***\testpassport.dat
registering institute
[BPD] max age: 7 days
[BPD] last update: Thu Feb 15 14:38:22 CET 2018
checking if requested hbci parameters are supported
autosecfunc: (re)checking selected pintan secmech
supported: pintan-onestep
registering user
fetching new sys-id from institute
checking whether passport is supported (but ignoring result)
autosecfunc: (re)checking selected pintan secmech
supported: pintan-onestep
passport supported: true
creating new raw message Synch
setting raw property Synch.Idn.KIK.blz to "76030080"
setting raw property Synch.Idn.KIK.country to "DE"
setting raw property Synch.Idn.customerid to "XXXXXXXXX"
setting raw property Synch.Idn.sysid to "0"
setting raw property Synch.Idn.sysStatus to "1"
setting raw property Synch.MsgHead.dialogid to "0"
setting raw property Synch.MsgHead.msgnum to "1"
setting raw property Synch.MsgTail.msgnum to "1"
setting raw property Synch.ProcPrep.BPD to "1"
setting raw property Synch.ProcPrep.UPD to "0"
setting raw property Synch.ProcPrep.lang to "0"
setting raw property Synch.ProcPrep.prodName to "36792786FA12F235F04647689"
setting raw property Synch.ProcPrep.prodVersion to "3"
setting raw property Synch.Sync.mode to "0"
generating raw message Synch
trying to insert signature
setting secfunc to 999
setting cid to 
setting role to 1
setting range to 1
setting keyblz to 76030080
setting keycountry to DE
setting keyuserid to XXXXXXXXX
setting keynum to 0
setting keyversion to 0
setting sysid to 0
setting sigid to 1
setting sigalg to 10
setting sigmode to 16
setting hashalg to 999
writing to passport file ***\testpassport.dat_7602278326538856920
saving two step mechs: []
saving current tan method: 999
closing output stream
saving passport file ***\testpassport.dat
deleting old passport file ***\testpassport.dat
renaming testpassport.dat_7602278326538856920 to testpassport.dat
new passport file now exists: ***\testpassport.dat
onestep method - checking GVs to decide whether or not we need a TAN
sending message: ***
trying to encrypt message
creating new crypt factory
checking if crypt available in pool
no, creating new crypt
adding to used pool
crypt acquired
setting secfunc to 998
setting keytype to 5
setting blz to 76030080
setting country to DE
setting keyuserid to XXXXXXXXX
setting keynum to 0
setting keyversion to 0
setting cid to 
setting sysId to 0
setting role to 1
setting alg to 13
setting mode to 2
setting compfunc to 0
encrypted message to be sent: ***
communicating dialogid/msgnum 0/1
using filter: MIM (base64)
Verbinde mit https://brokerage-hbci.consorsbank.de:443/hbci und prüfe Zertifikat
using system socket factory
connecting to server
writing data to output stream
closing output stream
warte auf Antwortdaten
can not determine message size, trying to detect automatically
received 28 bytes
read 28 bytes, looking for more
received 207 bytes
read 207 bytes, looking for more
closing communication line
received message: ***::Der Dialog wurde abgebrochen.+9942::PIN ungültig.'HNHBS:3:1+1'
trying to parse message as crypted message
message seems not to be encrypted; tring to parse it as SynchRes message
received message after decryption: ***::Der Dialog wurde abgebrochen.+9942::PIN ungültig.'HNHBS:3:1+1'
extracting data from received message
HBCI error code: 9800:Der Dialog wurde abgebrochen.
HBCI error code: 9942:PIN ungültig.
looking for a signature
message has no signature
looking if message is encrypted
org.kapott.hbci.exceptions.HBCI_Exception: Nachricht ist nicht verschlüsselt
at org.kapott.hbci.manager.HBCIKernelImpl.rawDoIt(HBCIKernelImpl.java:462)
at org.kapott.hbci.manager.HBCIKernelImpl.rawDoIt(HBCIKernelImpl.java:178)
at org.kapott.hbci.manager.HBCIUser.fetchSysId(HBCIUser.java:442)
at org.kapott.hbci.manager.HBCIUser.updateUserData(HBCIUser.java:665)
at org.kapott.hbci.manager.HBCIUser.register(HBCIUser.java:690)
at org.kapott.hbci.manager.HBCIHandler.registerUser(HBCIHandler.java:279)
at org.kapott.hbci.manager.HBCIHandler.<init>(HBCIHandler.java:133)
at UmsatzAbrufPinTan.main(UmsatzAbrufPinTan.java:107)
dialog init ended with errors - searching for return code 'wrong PIN'
detected 'invalid PIN' error - clearing passport PIN
autosecfunc: search for 3920s in response to detect allowed twostep secmechs
autosecfunc: (re)checking selected pintan secmech
Exception in thread "main" org.kapott.hbci.exceptions.HBCI_Exception: Fehler beim Erzeugen eines HBCIHandler Objektes
at org.kapott.hbci.manager.HBCIHandler.<init>(HBCIHandler.java:142)
at UmsatzAbrufPinTan.main(UmsatzAbrufPinTan.java:107)
Caused by: org.kapott.hbci.exceptions.HBCI_Exception: Fehler beim Registrieren der Nutzerdaten
at org.kapott.hbci.manager.HBCIHandler.registerUser(HBCIHandler.java:281)
at org.kapott.hbci.manager.HBCIHandler.<init>(HBCIHandler.java:133)
... 1 more
Caused by: org.kapott.hbci.exceptions.HBCI_Exception: Fehler beim Ermitteln einer neuen System-ID
at org.kapott.hbci.manager.HBCIUser.fetchSysId(HBCIUser.java:474)
at org.kapott.hbci.manager.HBCIUser.updateUserData(HBCIUser.java:665)
at org.kapott.hbci.manager.HBCIUser.register(HBCIUser.java:690)
at org.kapott.hbci.manager.HBCIHandler.registerUser(HBCIHandler.java:279)
... 2 more
Caused by: org.kapott.hbci.exceptions.ProcessException: Fehler beim Ermitteln einer neuen System-ID
at org.kapott.hbci.manager.HBCIUser.fetchSysId(HBCIUser.java:461)
... 5 more

Process finished with exit code 1



Olaf Willuhn

unread,
Feb 15, 2018, 10:21:20 AM2/15/18
to hbci...@googlegroups.com
Hallo,

Ich hatte das ganze eigentlich selbst geschrieben, dachte allerdings ich habe einen Fehler gemacht also habe ich zum testen einfach den Source der UmsatzAbrufPinTan.java in mein Projekt kopiert und ausgeführt.
Also die Meldung im Log "9942::PIN ungültig" kommt direkt von der Bank. Irgendwo muss es da einen Unterschied zwischen dem Beispielcode und deinem Code geben, der sich auf die Benutzerdaten (Benutzerkennung, PIN, etc) bezieht. Die Bank ist jedenfalls der Meinung, dass die PIN falsch sei.

Unten ist noch einmal der gesamte Debug Log, was mich allerdings wundert ist dass der Log sagt mein PIN wäre falsch (ist exakt der selbe wie wenn ich den Beispiel Code nutze), der Stacktrace hingegen sagt die System-ID konnte nicht ermittelt werden.

Das mit der System-ID ist einfach ein Folgefehler. HBCI4Java versucht da gerade, die BPD und UPD von der Bank abzurufen. Das schlaegt wegen vermeintlich falscher PIN fehl und daher meldet HBCI4Java im Stacktrace, dass die System-ID nicht abgerufen werden konnte. Die eigentliche Ursache ist schon die Fehlermeldung der Bank.


Getestet habe ich es in meinem Projekt mit Version 3.0.12, allerdings auch mit der 3.0.13-SNAPSHOT (also von GitHub gecloned und compiled).
Die Änderungen zwischen 3.0.12 und 3.0.13-snapshot sind marginal bzw. sollten hier nicht im Zusammenhang mit dem Problem stehen. Zumal in deinem folgenden Log der Fehler ja auch in 3.0.13-snapshot auftritt:


using default system locale de_DE
initialized HBCI4Java for thread group main
hbci4java 3.0.13-SNAPSHOT
HBCI error code: 9800:Der Dialog wurde abgebrochen.
HBCI error code: 9942:PIN ungültig.

Vergleiche mal deinen eigenen Code mit dem aus dem Beispiel. Da muss sich irgendwo ein Unterschied finden. Oder poste mal deinen Code.

Gruss
Olaf

Dorian

unread,
Feb 15, 2018, 10:43:40 AM2/15/18
to hbci4java
Danke erst einmal für die schnelle Antwort.


Die Änderungen zwischen 3.0.12 und 3.0.13-snapshot sind marginal bzw. sollten hier nicht im Zusammenhang mit dem Problem stehen
Das habe ich mir schon gedacht, wollte es nur erwähnt haben.

Vergleiche mal deinen eigenen Code mit dem aus dem Beispiel.
Ich habe gerade nochmal *exakt* den selben Code genommen, heißt die Klasse direkt als Datei kopiert und nur das Package geändert und es funktioniert nicht (selber Fehler wie oben). Ich verstehe es ehrlich gesagt selbst nicht so ganz. Nur um das festzuhalten; Ich binde das Artifact hbci4j-core in der Version 3.0.13-SNAPSHOT mit dem Scope compile in meiner pom.xml ein, richtig? Die Klassen werden offensichtlich ja richtig geladen, allerdings scheint irgendwas dazwischen nicht zu passen. Ich programmiere auch nicht gerade seit 5 Minuten und arbeite ebenso schon einige Jahre mit Maven daher verwirrt mich das ganze ein wenig.

Hier nochmal der Code, ist das Beispiel von GitHub mit geänderten Login Daten und Logging aktiviert

import org.kapott.hbci.GV.HBCIJob;
import org.kapott.hbci.GV_Result.GVRKUms;
import org.kapott.hbci.GV_Result.GVRKUms.UmsLine;
import org.kapott.hbci.GV_Result.GVRSaldoReq;
import org.kapott.hbci.callback.AbstractHBCICallback;
import org.kapott.hbci.manager.BankInfo;
import org.kapott.hbci.manager.HBCIHandler;
import org.kapott.hbci.manager.HBCIUtils;
import org.kapott.hbci.manager.HBCIVersion;
import org.kapott.hbci.passport.AbstractHBCIPassport;
import org.kapott.hbci.passport.HBCIPassport;
import org.kapott.hbci.status.HBCIExecStatus;
import org.kapott.hbci.structures.Konto;
import org.kapott.hbci.structures.Value;

import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;

/**
 * Demo zum Abruf von Umsaetzen per PIN/TAN-Verfahren.
 * <p>
 * Die folgende Demo zeigt mit dem minimal noetigen Code, wie eine Umsatz-Abfrage
 * fuer ein Konto durchgefuehrt werden kann. Hierzu wird der Einfachheit halber
 * das Verfahren PIN/TAN verwendet, da es von den meisten Banken unterstuetzt wird.
 * <p>
 * Trage vor dem Ausfuehren des Programms die Zugangsdaten zu deinem Konto ein.
 */
public class UmsatzAbrufPinTan {
   
/**
     * Die BLZ deiner Bank.
     */
    private final static String BLZ = "76030080";

    /**
     * Deine Benutzerkennung.
     */
    private final static String USER = "XXX";

    /**
     * Deine PIN.
     */
    private final static String PIN = "XXX";

    /**
     * Die zu verwendende HBCI-Version.
     */
    private final static HBCIVersion VERSION = HBCIVersion.HBCI_300;

    /**
     * Main-Methode.
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
       
// HBCI4Java initialisieren
        // In "props" koennen optional Kernel-Parameter abgelegt werden, die in der Klasse
        // org.kapott.hbci.manager.HBCIUtils (oben im Javadoc) beschrieben sind.
        Properties props = new Properties();
        props.put("log.loglevel.default", "5");
        HBCIUtils.init(props, new MyHBCICallback());

        // In der Passport-Datei speichert HBCI4Java die Daten des Bankzugangs (Bankparameterdaten, Benutzer-Parameter, etc.).
        // Die Datei kann problemlos geloescht werden. Sie wird beim naechsten mal automatisch neu erzeugt,
        // wenn der Parameter "client.passport.PinTan.init" den Wert "1" hat (siehe unten).
        // Wir speichern die Datei der Einfachheit halber im aktuellen Verzeichnis.
        final File passportFile = new File("testpassport.dat");

        // Wir setzen die Kernel-Parameter zur Laufzeit. Wir koennten sie alternativ
        // auch oben in "props" setzen.
        HBCIUtils.setParam("client.passport.default", "PinTan"); // Legt als Verfahren PIN/TAN fest.
        HBCIUtils.setParam("client.passport.PinTan.filename", passportFile.getAbsolutePath());
        HBCIUtils.setParam("client.passport.PinTan.init", "1");
        HBCIUtils.setParam("log.loglevel.default", "5");

        // Erzeugen des Passport-Objektes.
        HBCIPassport passport = AbstractHBCIPassport.getInstance();

        // Konfigurieren des Passport-Objektes.
        // Das kann alternativ auch alles ueber den Callback unten geschehen

        // Das Land.
        passport.setCountry("DE");

        // Server-Adresse angeben. Koennen wir entweder manuell eintragen oder direkt von HBCI4Java ermitteln lassen
        BankInfo info = HBCIUtils.getBankInfo(BLZ);
        passport.setHost(info.getPinTanAddress());

        // TCP-Port des Servers. Bei PIN/TAN immer 443, da das ja ueber HTTPS laeuft.
        passport.setPort(443);

        // Art der Nachrichten-Codierung. Bei Chipkarte/Schluesseldatei wird
        // "None" verwendet. Bei PIN/TAN kommt "Base64" zum Einsatz.
        passport.setFilterType("Base64");

        // Das Handle ist die eigentliche HBCI-Verbindung zum Server
        HBCIHandler handle = null;

        try {
           
// Verbindung zum Server aufbauen
            handle = new HBCIHandler(VERSION.getId(), passport);

            // Wir verwenden einfach das erste Konto, welches wir zur Benutzerkennung finden
            Konto[] konten = passport.getAccounts();
            if (konten == null || konten.length == 0)
               
error("Keine Konten ermittelbar");

            log("Anzahl Konten: " + konten.length);

            for (Konto k : konten) {

               
// 1. Auftrag fuer das Abrufen des Saldos erzeugen
                HBCIJob saldoJob = handle.newJob("SaldoReq");
                saldoJob.setParam("my", k); // festlegen, welches Konto abgefragt werden soll.
                saldoJob.addToQueue(); // Zur Liste der auszufuehrenden Auftraege hinzufuegen

                // 2. Auftrag fuer das Abrufen der Umsaetze erzeugen
                HBCIJob umsatzJob = handle.newJob("KUmsAll");
                umsatzJob.setParam("my", k); // festlegen, welches Konto abgefragt werden soll.
                umsatzJob.addToQueue(); // Zur Liste der auszufuehrenden Auftraege hinzufuegen

                // Hier koennen jetzt noch weitere Auftraege fuer diesen Bankzugang hinzugefuegt
                // werden. Z.Bsp. Ueberweisungen.

                // Alle Auftraege aus der Liste ausfuehren.
                HBCIExecStatus status = handle.execute();

                // Pruefen, ob die Kommunikation mit der Bank grundsaetzlich geklappt hat
                if (!status.isOK())
                   
error(status.toString());

                // Auswertung des Saldo-Abrufs.
                GVRSaldoReq saldoResult = (GVRSaldoReq) saldoJob.getJobResult();
                if (!saldoResult.isOK())
                   
error(saldoResult.toString());

                Value s = saldoResult.getEntries()[0].ready.value;
                log("Saldo: " + s.toString());


                // Das Ergebnis des Jobs koennen wir auf "GVRKUms" casten. Jobs des Typs "KUmsAll"
                // liefern immer diesen Typ.
                GVRKUms result = (GVRKUms) umsatzJob.getJobResult();

                // Pruefen, ob der Abruf der Umsaetze geklappt hat
                if (!result.isOK())
                   
error(result.toString());

                // Alle Umsatzbuchungen ausgeben
                List<UmsLine> buchungen = result.getFlatData();
                for (UmsLine buchung : buchungen) {
                   
StringBuilder sb = new StringBuilder();
                    sb.append(buchung.valuta);

                    Value v = buchung.value;
                    if (v != null) {
                        sb
.append(": ");
                        sb.append(v);
                    }

                   
List<String> zweck = buchung.usage;
                    if (zweck != null && zweck.size() > 0) {
                        sb
.append(" - ");
                        // Die erste Zeile des Verwendungszwecks ausgeben
                        sb.append(zweck.get(0));
                    }

                   
// Ausgeben der Umsatz-Zeile
                    log(sb.toString());
                }
           
}
       
} finally {
           
// Sicherstellen, dass sowohl Passport als auch Handle nach Beendigung geschlossen werden.
            if (handle != null)
                handle
.close();

            if (passport != null)
                passport
.close();
        }

   
}

   
/**
     * Gibt die angegebene Meldung aus.
     *
     * @param msg die Meldung.
     */
    private static void log(String msg) {
       
System.out.println(msg);
    }

   
/**
     * Beendet das Programm mit der angegebenen Fehler-Meldung.
     *
     * @param msg die Meldung.
     */
    private static void error(String msg) {
       
System.err.println(msg);
        System.exit(1);
    }

   
/**
     * Ueber diesen Callback kommuniziert HBCI4Java mit dem Benutzer und fragt die benoetigten
     * Informationen wie Benutzerkennung, PIN usw. ab.
     */
    private static class MyHBCICallback extends AbstractHBCICallback {
       
/**
         * @see org.kapott.hbci.callback.HBCICallback#log(java.lang.String, int, java.util.Date, java.lang.StackTraceElement)
         */
        @Override
        public void log(String msg, int level, Date date, StackTraceElement trace) {
           
System.out.println(msg);
            // Ausgabe von Log-Meldungen bei Bedarf
            // System.out.println(msg);
        }

       
/**
         * @see org.kapott.hbci.callback.HBCICallback#callback(org.kapott.hbci.passport.HBCIPassport, int, java.lang.String, int, java.lang.StringBuffer)
         */
        @Override
        public void callback(HBCIPassport passport, int reason, String msg, int datatype, StringBuffer retData) {
           
// Diese Funktion ist wichtig. Ueber die fragt HBCI4Java die benoetigten Daten von uns ab.
            switch (reason) {
               
// Mit dem Passwort verschluesselt HBCI4Java die Passport-Datei.
                // Wir nehmen hier der Einfachheit halber direkt die PIN. In der Praxis
                // sollte hier aber ein staerkeres Passwort genutzt werden.
                // Die Ergebnis-Daten muessen in dem StringBuffer "retData" platziert werden.
                case NEED_PASSPHRASE_LOAD:
               
case NEED_PASSPHRASE_SAVE:
                    retData
.replace(0, retData.length(), PIN);
                    break;

                // PIN wird benoetigt
                case NEED_PT_PIN:
                    retData
.replace(0, retData.length(), PIN);
                    break;

                // BLZ wird benoetigt
                case NEED_BLZ:
                    retData
.replace(0, retData.length(), BLZ);
                    break;

                // Die Benutzerkennung
                case NEED_USERID:
                    retData
.replace(0, retData.length(), USER);
                    break;

                // Die Kundenkennung. Meist identisch mit der Benutzerkennung.
                // Bei manchen Banken kann man die auch leer lassen
                case NEED_CUSTOMERID:
                    retData
.replace(0, retData.length(), USER);
                    break;

                // Manche Fehlermeldungen werden hier ausgegeben
                case HAVE_ERROR:
                   
UmsatzAbrufPinTan.log(msg);
                    break;

                default:
                   
// Wir brauchen nicht alle der Callbacks
                    break;

            }
       
}

       
/**
         * @see org.kapott.hbci.callback.HBCICallback#status(org.kapott.hbci.passport.HBCIPassport, int, java.lang.Object[])
         */
        @Override
        public void status(HBCIPassport passport, int statusTag, Object[] o) {
           
// So aehnlich wie log(String,int,Date,StackTraceElement) jedoch fuer Status-Meldungen.
        }

   
}

}


Olaf Willuhn

unread,
Feb 16, 2018, 3:28:37 AM2/16/18
to hbci...@googlegroups.com
Hallo,
> Danke erst einmal für die schnelle Antwort.
>
> Ich habe gerade nochmal *exakt* den selben Code genommen, heißt die
> Klasse direkt als Datei kopiert und nur das Package geändert und es
> funktioniert nicht (selber Fehler wie oben). Ich verstehe es ehrlich
> gesagt selbst nicht so ganz. Nur um das festzuhalten; Ich binde das
> Artifact hbci4j-core in der Version 3.0.13-SNAPSHOT mit dem Scope
> compile in meiner pom.xml ein, richtig?

Ich kenne mich ehrlich gesagt nicht wirklich mit Maven aus (ich selbst
verwende bei neuen Projekten Gradle) - von daher weiss ich nicht, was es
mit dem Scope auf sich hat. Aber egal - sobald der Code compiliert und
sich HBCI4Java initialisieren laesst (was bei dir der Fall ist), gehe
ich davon aus, dass das bei dir schon richtig eingerichtet ist. Sonst
waere der Code gar nicht zur Kommunikation mit der Bank gelaufen.

Ich bin ehrlich gesagt etwas ratlos, was jetzt noch die Ursache sein
koennte. Also es ist so, dass der Beispiel-Code funktioniert, wenn du es
direkt innerhalb von HBCI4Java (von Github ausgeheckt?) laufen laesst?
Aber es funktioniert nicht mehr, wenn du den Beispielcode innerhalb
deines Projektes laufen laesst, in dem du HBCI4Java per Maven
eingebunden hast?

Mir faellt hier auch nur noch "rumprobieren" zur weiteren Analyse ein.
Also dass du deinen Code stattdessen mal in HBCI4Java kopierst und dort
laufen laesst. Oder es mal mit der hbci4j-core-3.0.13-SNAPSHOT.jar von
Hibiscus
(https://github.com/willuhn/hibiscus/blob/master/lib/hbci4j-core-3.0.13-SNAPSHOT.jar)
probierst.

Gruss
Olaf

Dorian

unread,
Feb 16, 2018, 3:47:02 AM2/16/18
to hbci4java
Hallo,

was es mit dem Scope auf sich hat

Das Scope legt grundsätzlich nur fest wie eine Dependency genutzt wird. 
'provided' würde nur innerhalb der IDE und während des compilen zur Verfügung stehen, nicht aber in der compilten JAR vorhanden sein.
Bei 'compile' würde es ebenfalls in die finale JAR mit reinkopiert werden (Ähnlich Fat JARs).


ich selbst verwende bei neuen Projekten Gradle
Ich möchte nichts falsches behaupten allerdings meine ich nutzt Gradle das Maven Repository, ergo das sollte eigentlich keinen großen Unterschied machen wie ich hbci4java einbinde.


Also dass du deinen Code stattdessen mal in HBCI4Java kopierst und dort laufen laesst. 
Da ich bisher auch nicht anders testen konnte habe ich es genauso gemacht. Das funktioniert ohne Probleme, habe drei Überweisungen abgeschlossen (Geld kam gerade) und ich kann den Kontostand abfragen (und kürzliche Zahlungen).

Oder es mal mit der hbci4j-core-3.0.13-SNAPSHOT.jar von Hibiscus 

Habe ich gerade probiert (JAR runtergeladen, ins lokale Repository kopiert und wieder mit Maven eingebunden), allerdings tritt ebenfalls der selbe Fehler auf. 

Ich bin auch ganz ehrlich ein wenig ratlos. Ich habe mich nicht groß mit dem Code von hbci4java auseinander gesetzt dass ich sagen könnte wo der Fehler liegt.
Ich habe, wie du geschrieben hast, das ganze von GitHub ausgecheckt und direkt das Beispiel von euch laufen lassen - das funktioniert ohne Probleme.
Wenn ich hingegen das ganze per Maven einbinde funktioniert es nicht mehr mit besagter Fehlermeldung.


Nur noch einmal für mich; hbci4j hat keine weiteren Dependencies die ich ebenfalls einbinden müsste oder derartiges, richtig?

Vielen Dank schonmal,
Dorian

Olaf Willuhn

unread,
Feb 16, 2018, 4:08:09 AM2/16/18
to hbci...@googlegroups.com
Hallo,

Ich möchte nichts falsches behaupten allerdings meine ich nutzt Gradle das Maven Repository, ergo das sollte eigentlich keinen großen Unterschied machen wie ich hbci4java einbinde.
Ja, das stimmt.
Zum Scope: Ich gebe bei Gradle Dependencies mittels "compile"- und "testCompile" an - jetzt sehe ich auch die Parallele ;)


Ich bin auch ganz ehrlich ein wenig ratlos. Ich habe mich nicht groß mit dem Code von hbci4java auseinander gesetzt dass ich sagen könnte wo der Fehler liegt.
Ich habe, wie du geschrieben hast, das ganze von GitHub ausgecheckt und direkt das Beispiel von euch laufen lassen - das funktioniert ohne Probleme.
Wenn ich hingegen das ganze per Maven einbinde funktioniert es nicht mehr mit besagter Fehlermeldung.

Noch eine Idee: Vielleicht kommt eine falsche Instanz des HBCICallback zum Einsatz. Kannst du mal in deiner Methode "callback(HBCIPassport, int, String, int, StringBuffer)" einen Breakpoint setzen und pruefen, ob der da wirklich reingeht und die PIN zurueckliefert. Vielleicht liegt es einfach daran, dass HBCI4Java die PIN nicht erhaelt und es daher mit einer leeren PIN versucht?


Nur noch einmal für mich; hbci4j hat keine weiteren Dependencies die ich ebenfalls einbinden müsste oder derartiges, richtig?
Korrekt. Keine weiteren Abhaengigkeiten.

Gruss
Olaf

Dorian

unread,
Feb 16, 2018, 4:09:22 AM2/16/18
to hbci4java
Hallo nochmal,

ich habe ehrlich gesagt keine Ahnung wie ich das geschafft habe, aber ich denke dass es irgendwie mit dem Problem ansich zutun hat. 

Ich habe mehrere Bankkonten, eines bei der Consorsbank und eins bei einer lokalen Volksbank.

Eigentlich probiere ich es die ganze Zeit mit meinem Consorsbank Konto, allerdings wollte ich gerade nur mal schauen ob es mit dem VB Konto auch geht.
Das tut es auch beim ersten Versuch ohne Probleme (innerhalb von dem GitHub Projekt). Login wird durchgeführt und kürzliche Zahlungen/Transaktionen werden angezeigt. Allerdings bekomme ich im Log folgendes angezeigt:
HNHBK:1:3+000000016494+300+SU8021609550072+1+SU8021609550072:1'HIRMG:2:2+3060::Bitte beachten Sie die enthaltenen Warnungen/Hinweise. (TRE)'HIRMS:3:2:3+3050::BPD nicht mehr aktuell, aktuelle Version enthalten. (TRE)

Es ist nur eine Warnung und es funktioniert ja auch im eigentlichen, nur jetzt kommt das komische. Als ich es zuvor mit dem CB Konto probierte ging es auch, allerdings hatte ich eine ähnliche Meldung. Ich meine es war das gleiche nur mit UPD anstelle von BPD. Ich kenne mich mit dem HBCI Protokoll nicht aus daher weiß ich nicht wofür das steht bzw ob dies überhaupt relevant ist.

Jedenfalls wollte ich gerade noch einmal diese Warnung sehen (für das CB Konto mit dem "UPD nicht mehr aktuell") um sie hier zu posten, aber nun will auch das CB Konto innerhalb des GitHub Projektes nicht mehr. Ich bekomme den selben Fehler wie in meinem Projekt wenn ich hbci4j über Maven einbinde ("PIN ist ungültig", daraufhin "Nachricht ist nicht verschlüsselt" und dann der "System-ID" Fehler der ja aber wohl daraus folgt). 

Es gibt eine Sache die ich geändert habe; Die Passport Datei. 
Ich musste ja für zwei Bankkonten zwei verschiedene Passports nutzen, da ich allerdings nicht die ganze Zeit den Passport Namen (also den Datei Namen) ändern wollte, habe ich es zu folgendem geändert:
new File(System.currentTimeMillis() + ".dat");

Ist natürlich ziemlich billig aber zum Testen reicht es ja, jedenfalls; Damit, also mit einer neuen Passport Datei funktioniert es nicht. Wechsle ich hingegen zu meiner "alten" Passport Datei zurück ("testpassport.dat") funktioniert es wieder ohne Probleme.

Übersehe ich hier irgendwas oder mag hbci4j einfach keine Passports mit Zeitbasierten Namen?

Grüße,
Dorian


Olaf Willuhn

unread,
Feb 16, 2018, 4:20:38 AM2/16/18
to hbci...@googlegroups.com
Hallo,

Es gibt eine Sache die ich geändert habe; Die Passport Datei. 
Ich musste ja für zwei Bankkonten zwei verschiedene Passports nutzen, da ich allerdings nicht die ganze Zeit den Passport Namen (also den Datei Namen) ändern wollte, habe ich es zu folgendem geändert:
new File(System.currentTimeMillis() + ".dat");

Das kann natürlich eine mögliche Ursache sein. Pro Bankzugang muss ja eine eigene Passport-Datei verwendet werden.  Zu Fehlern kommt es, wenn man z.Bsp. die selbe Passport-Datei für unterschiedliche Bankzugänge verwendet. Oder innerhalb der HBCI4Java-Session für den selben Bankzugang neue Passport-Dateien erzeugt. In letzterem Fall verlässt sich HBCI4Java ja darauf, dass die abgerufenen BPD und UPD anschließend in der Datei verfügbar sind. Wenn die Datei dann aber einen neuen Namen hat, werden die abgerufenen BPD/UPD nicht mehr gefunden.

Übersehe ich hier irgendwas oder mag hbci4j einfach keine Passports mit Zeitbasierten Namen?

Ich würde keine zeitbasierten Dateinamen nehmen, weil die dann unnötig immer wieder neu angelegt werden müssen und dadurch immer wieder BPD/UPD neu von der Bank abgerufen werden. Stattdessen besser:
  • Als Dateiname einen wählen, der eindeutig dem Bankzugang zugeordnet werden kann. Z.Bsp. die SHA1-Checksumme von BLZ+Benutzerkennung
  • Sobald die Passport-Datei existiert, bei den folgenden HBCI4Java-Aufrufen den Parameter "HBCIUtils.setParam("client.passport.PinTan.init","0"); setzen, damit HBCI4Java die Passport-Datei nicht jedesmal neu initialisiert (was auch dazu führt, dass die BPD/UPD) wieder neu abgerufen werden

Gruss
Olaf

Dorian

unread,
Feb 16, 2018, 4:39:21 AM2/16/18
to hbci4java
Hallo,

Zum Scope

Hab gerade in die gradle Datei einer deiner Projekte geschaut und das auch gesehen :P
Ich habe gradle bis dato nie wirklich benutzt und kenne mich damit auch nicht wirklich aus aber es scheint von den dependencies her gleich zu funktionieren wie Maven, also sollte das schon mal nicht das Problem sein. 

Vielleicht kommt eine falsche Instanz des HBCICallback zum Einsatz.

Setze NEED_PT_PIN auf *****

Jep, es wird das richtige Callback benutzt. PIN wird korrekt gesetzt.

Ich würde keine zeitbasierten Dateinamen nehmen

War primär gerade nur zum Testen, später würde ich es so machen wie du beschrieben hast.

(Hab das hier seit 10 Minuten offen und habe folgendes getestest nachdem ich das andere oben geschrieben habe)

Ich habe gerade aber folgendes Problem, vorweg; Ich denke dass es irgendein Problem mit meiner Bank gibt. Ich weiß nicht was meine Bank tut, aber es weicht wohl von dem ab was hbci4j erwartet.
Also, ich bin innerhalb des ausgecheckten GitHub Projektes. Ich verwende als Passport die Datei "consorsbank.dat" welche bis dato noch nicht existiert. client.passport.PinTan.init ist auf 1 gestellt, also Passport erstellen (wenn ich mich nicht täusche).
Es funktioniert nicht - der selbe Fehler, der die ganze Zeit bereits auftritt nicht; "PIN ungültig".
Okay, also nutze ich wieder testpassport.dat und nicht consorsbank.dat. 
"testpassport.dat" gelöscht und ausgeführt. Selber Fehler.
(Falls es unverständlich ist; Mit der testpassport.dat welche ich gestern Abend erstellt hatte, hat es ohne Probleme funktioniert)

Wir halten fest; hbci4j mag meinen Consorsbank Account nun gar nicht mehr, egal ob innerhalb des Projektes oder außerhalb (also per Maven eingebunden).

Ich wechsel auf den Volksbank Account, und siehe da; Es funktioniert direkt beim ersten mal ohne jegliche Probleme.

Daher scheint es wohl kein direktes Problem mit hbci4j zu sein. Die Frage ist demnach nur wieso hbci4j ein Problem mit Consorsbank Konten hat.

Auch wenn ich mich normal mit meinem PIN anmelde ("PIN/TAN") nutze ich kein "normales" TAN Gerät. Bei der Volksbank habe ich z.B. SmartTan oder mTAN. Bei der Consorsbank habe ich einen kleinen Code Generator der ohne die Karte funktioniert. Ich muss nur bei z.B. einer Überweisung, die letzen 6 Ziffern des Empfängers eingeben und erhalte dafür einen Zeitbasierten TAN. Gestern, als ich noch innerhalb des GitHub Projektes auf mein Konto zugreifen konnte ging das auch ohne Probleme, habe wie gesagt 3 Überweisungen durchgeführt. 

Kann das TAN Verfahren irgendwas damit zutun haben? Ist unwahrscheinlich aber nur dass wir alle Möglichkeiten beachten.

Grüße,
Dorian


 
Message has been deleted

Olaf Willuhn

unread,
Feb 16, 2018, 4:50:47 AM2/16/18
to hbci...@googlegroups.com
Hallo,
>
> Daher scheint es wohl kein direktes Problem mit hbci4j zu sein. Die
> Frage ist demnach nur wieso hbci4j ein Problem mit Consorsbank Konten hat.
Es ist in der Tat so, dass es bei einigen Banken gehäuft zu Problemen
kommt. Die Consorsbank ist mir da bisher aber nicht negativer als andere
Banken aufgefallen. Hast du mal unter
https://www.willuhn.de/wiki/doku.php?id=support:list:banken:misc:pintan#consorspin_tan
geschaut - vielleicht ist da noch ein nuetzlicher Hinweis dabei.
Vielleicht hast du auch versehentlich durch die Versuche den
HBCI-Account bei der Consorsbank gesperrt und die Bank meldet daher,
dass die PIN falsch sei. Bei einigen Banken ist es durchaus moeglich,
durch falsche PIN-Eingabe nur den Zugang per HBCI zu sperren - der
normale Zugang per Bankwebseite geht dann aber noch.
>
> Auch wenn ich mich normal mit meinem PIN anmelde ("PIN/TAN") nutze ich
> kein "normales" TAN Gerät. Bei der Volksbank habe ich z.B. SmartTan
> oder mTAN. Bei der Consorsbank habe ich einen kleinen Code Generator
> der ohne die Karte funktioniert. Ich muss nur bei z.B. einer
> Überweisung, die letzen 6 Ziffern des Empfängers eingeben und erhalte
> dafür einen Zeitbasierten TAN. Gestern, als ich noch innerhalb des
> GitHub Projektes auf mein Konto zugreifen konnte ging das auch ohne
> Probleme, habe wie gesagt 3 Überweisungen durchgeführt. 
>
> Kann das TAN Verfahren irgendwas damit zutun haben? Ist
> unwahrscheinlich aber nur dass wir alle Möglichkeiten beachten.
Mhh. Vielleicht es dadurch zu einer Zugangssperre per HBCI gekommen?

Gruss
Olaf

Dorian

unread,
Feb 16, 2018, 4:53:21 AM2/16/18
to hbci4java
Hallo,

okay das ist mir nun wirklich ein wenig Peinlich und ich frage mich gerade wie Doof ich doch manchmal sein kann.

Das Problem lag tatsächlich "bei" der Consorsbank.
Man muss bei der Consorsbank bei dem Nutzernamen zusätzlich die Berechtigtennummer anhängen, also meistens 001.

Das ganze habe ich gestern auch getan, weswegen der Passport erstellt werden konnte. Das habe ich später aber wohl wieder vergessen mit reinzunehmen weswegen kein (neuer) Login mehr möglich war.
Nun funktioniert das ganze ohne jegliche Probleme sowohl in meinem Projekt als auch logischerweise im GitHub Projekt.

Danke für deine ganze Mühe und den unnötigen Stress den ich dir beschert habe.

Liebe Grüße,
Dorian

Olaf Willuhn

unread,
Feb 16, 2018, 4:54:54 AM2/16/18
to hbci...@googlegroups.com
Kein Problem - Hauptsache das Problem ist gelöst ;)

Gruss
Olaf

Dorian

unread,
Feb 16, 2018, 4:56:48 AM2/16/18
to hbci4java
Danke auch nochmal für die Liste, sowas in der Art hatte ich gesucht.

Grüße,
Dorian

Dorian

unread,
Feb 16, 2018, 6:15:34 AM2/16/18
to hbci4java
Hallo,

ich habe dir diesbezüglich eine Pull Request auf GitHub geschickt, kannst du dir später mal anschauen wenn du magst.

Schönen Tag noch,
Dorian
Reply all
Reply to author
Forward
0 new messages