Code Beispiel bei der deutschen Bank

270 views
Skip to first unread message

Max

unread,
Apr 12, 2018, 3:22:04 PM4/12/18
to hbci4java
Hallo,
ich habe das CodeBeispiel auf Github getestet und es hat überall funktioniert außer bei der Deutschen Bank bzw. maxblue.
Habe verschiedenste Kontonummer-Kombinationen ausprobiert - mit und ohne Filialnummer - mit Zugangsnummer (00 oder 01 am Ende) oder ohne.

Doch immer tritt folgende Fehlermeldung auf:

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 test.test.main(test.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.InvalidUserDataException: *** selected pintan method not supported!

at org.kapott.hbci.passport.AbstractPinTanPassport.getCurrentTANMethod(AbstractPinTanPassport.java:522)

at org.kapott.hbci.passport.AbstractPinTanPassport.postInitResponseHook(AbstractPinTanPassport.java:256)

at org.kapott.hbci.manager.HBCIUser.fetchSysId(HBCIUser.java:445)

... 5 more


Ich lösche die Passport-Datei nach jeder Ausführung. Es hat mit der Consorsbank und DKB funktioniert, aber der deutschen Bank bzw. maxblue gar nicht. Bzw. aus irgendwelchen Gründen hat es einmal funktioniert und dann ab dem nächsten Tag nie wieder. HBCI ist im Online-Banking aktiviert. BLZ ist die richtige und PIN wie im online-Banking. Ich lasse mir auch immer die PinTan-Adresse mit ausgeben - es ist die richtige, die er findet. Komischerweise kann ich sogar die HBCI-Versionen ändern und es kommt die gleiche Fehlermeldung.

Woran könnte das liegen?

Vielleicht könnt Ihr mir helfen - Danke im Voraus.

Hier der Code:
 

package test;


import java.io.File;

import java.util.Date;

import java.util.List;

import java.util.Properties;


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;


/**

 * Demo zum Abruf von Umsaetzen per PIN/TAN-Verfahren.

 * 

 * 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.

 * 

 * Trage vor dem Ausfuehren des Programms die Zugangsdaten zu deinem Konto ein.

 */

public class test

{

  /**

   * Die BLZ deiner Bank.

   */

  private final static String BLZ = "86070024";

  

  /**

   * Deine Benutzerkennung.

   */

  private final static String USER = "XXXXXXX";

  

  /**

   * Deine PIN.

   */

  private final static String PIN = "XXXXX";

  

  /**

   * 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();

    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");

    passportFile.delete();


    // 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");


    // 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);

    System.out.println(info.getPinTanAddress());

    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);

      Konto k = konten[0];


      // 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();

    }

    

  }

  

  /**

   * 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)

    {

      // 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:

          test.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.

    }

    

  }


  /**

   * 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);

  }


}

Olaf Willuhn

unread,
Apr 12, 2018, 3:27:29 PM4/12/18
to hbci4java
Hallo,

Also der Fehlermeldung zufolge wählst du da scheinbar jedesmal ein TAN-Verfahren aus, welches die Bank nicht unterstuetzt. Das ist eine 3-stellige Ziffer, die in aller Regel mit 9 beginnt und festlegt, ob man z.Bsp. smsTAN oder chipTAN nutzen möchte.

Gruss
Olaf

--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "hbci4java" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an hbci4java+...@googlegroups.com.
Wenn Sie in dieser Gruppe einen Beitrag posten möchten, senden Sie eine E-Mail an hbci...@googlegroups.com.
Gruppe besuchen: https://groups.google.com/group/hbci4java
Wenn Sie diese Diskussion im Web verfolgen möchten, rufen Sie https://groups.google.com/d/msgid/hbci4java/2b54de40-4ea8-473f-afe6-f08a93b74856%40googlegroups.com auf.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.

Max

unread,
Apr 12, 2018, 4:20:24 PM4/12/18
to hbci4java
Hm, wo gebe ich denn den Parameter mit? Bzw wo kann ich anderes Tan Verfahren auswählen? Sehe ich die verfügbaren Nummern dazu irgendwo?

Olaf Willuhn

unread,
Apr 12, 2018, 4:23:19 PM4/12/18
to hbci4java
Es gibt einen HBCI-Callback, der NEED_PT_SECHMECH (habs jetzt nicht genau
im Kopf) heisst. Ueber den wird das zu verwendende TAN-Verfahren abgefragt.
Als Parameter werden die verfügbaren TAN-Verfahren uebergeben.

Am 12. April 2018 22:20:26 schrieb Max <mxh....@gmail.com>:

> Hm, wo gebe ich denn den Parameter mit? Bzw wo kann ich anderes Tan
> Verfahren auswählen? Sehe ich die verfügbaren Nummern dazu irgendwo?
>
> --
> Sie erhalten diese Nachricht, weil Sie Mitglied der Google Groups-Gruppe
> "hbci4java" sind.
> Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser
> Gruppe erhalten möchten, senden Sie eine E-Mail an
> hbci4java+...@googlegroups.com.
> Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine
> Besuchen Sie
> https://groups.google.com/d/msgid/hbci4java/789028d0-534b-44ce-8038-b3de09b6cf6a%40googlegroups.com,
> um diese Diskussion im Web anzuzeigen.
> Weitere Optionen: https://groups.google.com/d/optout



Max

unread,
Apr 12, 2018, 4:50:48 PM4/12/18
to hbci4java
Ok, alles klar. Das sollte ich ausprobieren können, wenn ich denn herausfinden kann, welche Verfahren die Bank verfügbar macht und die entsprechende 9er Nummer?

Olaf Willuhn

unread,
Apr 13, 2018, 12:21:40 AM4/13/18
to hbci4java
Wie gesagt: Die TAN-Verfahren, die die Bank anbietet, werden dir als
Parameter in dem Callback im Stringbuffet übergeben.
> --
> Sie erhalten diese Nachricht, weil Sie Mitglied der Google Groups-Gruppe
> "hbci4java" sind.
> Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser
> Gruppe erhalten möchten, senden Sie eine E-Mail an
> hbci4java+...@googlegroups.com.
> Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine
> E-Mail an hbci...@googlegroups.com.
> Gruppe besuchen: https://groups.google.com/group/hbci4java
> Besuchen Sie
> https://groups.google.com/d/msgid/hbci4java/eee70b54-73ad-4a8b-915c-2238ee3e7de4%40googlegroups.com,
Message has been deleted

Olaf Willuhn

unread,
Apr 13, 2018, 8:37:39 AM4/13/18
to hbci4java
Korrekt. Ich werd den Beispielcode dahingehend mal erweitern.

Am 13. April 2018 14:34:24 schrieb Max <mxh....@gmail.com>:

Ok, so funktionierts jetzt: im Callback neuen case

--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "hbci4java" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an hbci4java+...@googlegroups.com.
Wenn Sie in dieser Gruppe einen Beitrag posten möchten, senden Sie eine E-Mail an hbci...@googlegroups.com.
Gruppe besuchen: https://groups.google.com/group/hbci4java
Wenn Sie diese Diskussion im Web verfolgen möchten, rufen Sie https://groups.google.com/d/msgid/hbci4java/5445963a-5e5d-487a-b255-421ea955586f%40googlegroups.com auf.

Max

unread,
Apr 13, 2018, 8:38:39 AM4/13/18
to hbci4java
OK so funktionierts: 

        case NEED_PT_SECMECH:

          retData.replace(0,retData.length(),TANMETHOD);

          break;

im Callback eingefügt und entsprechend vorher die Variable TANMETHOD mit "902" (= PhotoTAN) initialisiert.
Die verfügbaren Tan-Arten der Bank kann man vor dem Reason-Switch einfach Printen lassen (Variable: retData)

Letzte Frage: Wie kann ich den Wert des gesamten Depots und eine Liste der enthaltenden Wertpapiere abrufen?

Olaf Willuhn

unread,
Apr 14, 2018, 9:11:11 AM4/14/18
to hbci4java
Hallo,

Letzte Frage: Wie kann ich den Wert des gesamten Depots und eine Liste der enthaltenden Wertpapiere abrufen?

Hierfuer gibt es keinen fertigen Beispielcode in HBCI4Java. Allerdings gibt es ein Hibiscus-Addon zum Abruf der Depots, welches ebenfalls Opensource ist. Dieses verwendet die entsprechenden HBCI-Geschaeftsvorfaelle zum Abruf der Depots und Umsaetze "WPDepotList" und "WPDepotUms". Schau mal bei Github unter


und


Das ist zwar wie gesagt Hibiscus-spezifischer Code. Er enthaelt aber auch die relevanten Teile aus HBCI4Java.

Gruss
Olaf

Olaf Willuhn

unread,
Apr 16, 2018, 3:52:20 AM4/16/18
to hbci...@googlegroups.com
> OK so funktionierts: 
>
>         caseNEED_PT_SECMECH:
>
>           retData.replace(0,retData.length(),TANMETHOD);
>
>           break;
>
> im Callback eingefügt und entsprechend vorher die Variable TANMETHOD mit
> "902" (= PhotoTAN) initialisiert.

Ich wuerde das Verfahren nicht hart codieren. Die Nummern der
TAN-Verfahren koennen sich bei der Bank durchaus mal aendern. Besser
waere hier, eine interaktive Benutzerauswahl anzuzeigen. Oder zumindest
zu pruefen, ob das festhinterlegte TAN-Verfahren in "retData" ueberhaupt
noch enthalten ist und in dem Fall u.U. automatisch auf das naechste
passende zu wechseln.

> Die verfügbaren Tan-Arten der Bank kann man vor dem Reason-Switch
> einfach Printen lassen (Variable: retData)

Ich habe den Beispielcode mal dahingehend erweitert und die
TAN-relevanten Callbacks hinzugefuegt und ausfuehrlich beschrieben:

https://github.com/hbci4j/hbci4java/commit/6b104a1864035f32c34834f9d7eb24b28f135157

Max

unread,
Apr 17, 2018, 9:20:43 AM4/17/18
to hbci4java
Hierfuer gibt es keinen fertigen Beispielcode in HBCI4Java.

Im alten github repository gibt es einen Code-Beispiel, welches immer noch sehr gut funktioniert. 
Habe damit relativ leicht Depotumsatzliste und Depotstand abgerufen:

Ich wuerde das Verfahren nicht hart codieren.

Das stimmt natürlich, aber für Test-Zwecke hats gereicht und ich wollte es erstmal ohne Interaktion testen.

 Ich habe den Beispielcode mal dahingehend erweitert und die TAN-relevanten Callbacks hinzugefuegt und ausfuehrlich beschrieben

 Das ist super! Vielen Dank für deine Hilfe und tolle Arbeit an dem Projekt.

Olaf Willuhn

unread,
Apr 17, 2018, 9:24:13 AM4/17/18
to hbci...@googlegroups.com
> Im alten github repository gibt es einen Code-Beispiel, welches immer
> noch sehr gut funktioniert. 
> Habe damit relativ leicht Depotumsatzliste und Depotstand abgerufen:
> https://github.com/willuhn/hbci4java/blob/master/src/org/kapott/hbci/tools/DepotAbrufTest.java

Den gibt es auch im neuen Repo noch:

https://github.com/hbci4j/hbci4java/blob/master/src/main/java/org/kapott/hbci/tools/DepotAbrufTest.java

Allerdings ist dieser Beispielcode schon Jahre lang nicht mehr gepflegt
worden. Wusste daher nicht, ob der noch geht.

Max

unread,
Apr 17, 2018, 11:03:12 AM4/17/18
to hbci4java
Der funktioniert noch wunderbar. Bzw. zumindest versteht man wie es funktioniert.


// 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


// Auftrag 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());

return saldoResult.getEntries()[0].ready.value;


Kann man da irgendwie kurz und knackig nen double Wert als Saldo zurückgeben und nicht den String mit Währung?

Und bei dem Callback bezüglich TAN-Verfahren, diese werden auch nur als String in Form von: "900:Indizierte-TAN|901:Mobile-TAN|902:photoTAN-Verfahren" geliefert oder? D.h. "umständliches" Parsen?
 

Olaf Willuhn

unread,
Apr 18, 2018, 2:48:25 AM4/18/18
to hbci...@googlegroups.com
> Kann man da irgendwie kurz und knackig nen double Wert als Saldo
> zurückgeben und nicht den String mit Währung?

"saldoResult.getEntries()[0].ready" ist ein Objekt vom Typ "Value",
welches eine Methode "getBigDecimalValue()" besitzt, um den eigentlichen
Wert zu erahlten und eine Methode "getCurr()" fuer den Waehrungstext.

> Und bei dem Callback bezüglich TAN-Verfahren, diese werden auch nur als
> String in Form von:
> "900:Indizierte-TAN|901:Mobile-TAN|902:photoTAN-Verfahren" geliefert
> oder? D.h. "umständliches" Parsen?

Korrekt. Die Daten werden im Callback ja ueber einen Stringbuffer
uebergeben. Da gibt es halt keine weiteren Moeglichkeiten, die Daten
strrukturiert abzulegen, ohne die API aendern zu muessen.

Reply all
Reply to author
Forward
0 new messages