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 moreCaused 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 moreCaused 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
using default system locale de_DEinitialized HBCI4Java for thread group mainhbci4java 3.0.13-SNAPSHOTtrying to load BLZ datacreating new instance of a PinTan passportloading data from file ***\testpassport.datregistering institute[BPD] max age: 7 days[BPD] last update: Thu Feb 15 14:38:22 CET 2018checking if requested hbci parameters are supportedautosecfunc: (re)checking selected pintan secmechsupported: pintan-onestepregistering userfetching new sys-id from institutechecking whether passport is supported (but ignoring result)autosecfunc: (re)checking selected pintan secmechsupported: pintan-onesteppassport supported: truecreating new raw message Synchsetting 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 Synchtrying to insert signaturesetting secfunc to 999setting cid to setting role to 1setting range to 1setting keyblz to 76030080setting keycountry to DEsetting keyuserid to XXXXXXXXXsetting keynum to 0setting keyversion to 0setting sysid to 0setting sigid to 1setting sigalg to 10setting sigmode to 16setting hashalg to 999writing to passport file ***\testpassport.dat_7602278326538856920saving two step mechs: []saving current tan method: 999closing output streamsaving passport file ***\testpassport.datdeleting old passport file ***\testpassport.datrenaming testpassport.dat_7602278326538856920 to testpassport.datnew passport file now exists: ***\testpassport.datonestep method - checking GVs to decide whether or not we need a TANsending message: ***trying to encrypt messagecreating new crypt factorychecking if crypt available in poolno, creating new cryptadding to used poolcrypt acquiredsetting secfunc to 998setting keytype to 5setting blz to 76030080setting country to DEsetting keyuserid to XXXXXXXXXsetting keynum to 0setting keyversion to 0setting cid to setting sysId to 0setting role to 1setting alg to 13setting mode to 2setting compfunc to 0encrypted message to be sent: ***communicating dialogid/msgnum 0/1using filter: MIM (base64)Verbinde mit https://brokerage-hbci.consorsbank.de:443/hbci und prüfe Zertifikatusing system socket factoryconnecting to serverwriting data to output streamclosing output streamwarte auf Antwortdatencan not determine message size, trying to detect automaticallyreceived 28 bytesread 28 bytes, looking for morereceived 207 bytesread 207 bytes, looking for moreclosing communication linereceived message: ***::Der Dialog wurde abgebrochen.+9942::PIN ungültig.'HNHBS:3:1+1'trying to parse message as crypted messagemessage seems not to be encrypted; tring to parse it as SynchRes messagereceived message after decryption: ***::Der Dialog wurde abgebrochen.+9942::PIN ungültig.'HNHBS:3:1+1'extracting data from received messageHBCI error code: 9800:Der Dialog wurde abgebrochen.HBCI error code: 9942:PIN ungültig.looking for a signaturemessage has no signaturelooking if message is encryptedorg.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 PINautosecfunc: search for 3920s in response to detect allowed twostep secmechsautosecfunc: (re)checking selected pintan secmechException 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 moreCaused 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 moreCaused 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.
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_DEinitialized HBCI4Java for thread group mainhbci4java 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.
Die Änderungen zwischen 3.0.12 und 3.0.13-snapshot sind marginal bzw. sollten hier nicht im Zusammenhang mit dem Problem stehen
Vergleiche mal deinen eigenen Code mit dem aus dem Beispiel.
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.
}
}
}
was es mit dem Scope auf sich hat
ich selbst verwende bei neuen Projekten Gradle
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
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.
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?
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)
new File(System.currentTimeMillis() + ".dat");
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");
Übersehe ich hier irgendwas oder mag hbci4j einfach keine Passports mit Zeitbasierten Namen?
Zum Scope
Vielleicht kommt eine falsche Instanz des HBCICallback zum Einsatz.
Ich würde keine zeitbasierten Dateinamen nehmen