nemiah / phpFinTS

PHP library to communicate with FinTS/HBCI servers
MIT License
131 stars 40 forks source link

Postbank: Name des TAN-Medium erforderlich #394

Closed NoteToSelfFindGoodNickname closed 1 year ago

NoteToSelfFindGoodNickname commented 1 year ago

Hallo!

Ich habe ein Problem mit libfintx (einer C#-Implementierung), aber dieses Projekt ist ziemlich verlassen. Könnte ich bitte deshalb bei Euch fragen? Ich habe gesehen, dass ihr auch mit diesem Problem zu tun hattet (möglicherweise https://github.com/nemiah/phpFinTS/pull/116/commits/4ef83436f2ef7027822eaa64c515f3c8bb510345).

Ich versuche, meinen Kontostand bei der Postbank abzufragen und bekomme diese Fehlermeldung:

3076: Keine starke Authentifizierung erforderlich., 9050: Teilweise fehlerhaft., 0020: Information fehlerfrei entgegengenommen., 1040: BPD nicht mehr aktuell. Aktuelle Version folgt., 3920: Meldung unterstützter Ein- und Zwei-Schritt-Verfahren:920:930, 1050: UPD nicht mehr aktuell. Aktuelle Version folgt., 9210: Name des TAN-Medium erforderlich.

Kann mir jemand sagen, was ihr geändert habt, damit es geht? Ich bin leider nicht gut in php-Lesen.

Möglicherweise handelt es sich um das selbe Problem, das ihr hier behoben hattet.

Danke!

Philipp91 commented 1 year ago

9210: Name des TAN-Medium erforderlich.

Du musst das Äquivalent von selectTanMode() mit einem TanMedium aufrufen.

https://github.com/iamtorsten/libfintx/blob/de3cb976d96532c7087d5190d3da0ccbf4dcde70/src/libfintx.Sample.Ui/MainForm.cs#L189

NoteToSelfFindGoodNickname commented 1 year ago

Das hier wird aufgerufen:

    private async Task<bool> InitTANMedium(FinTsClient client)
    {
        // TAN-Medium-Name
        var accounts = await client.Accounts(CreateTANDialog(client));

Er kehrt nach 1 Sekunde zurück. "accounts.IsSuccess" ist True.

In den messages steht: "{3076: Keine starke Authentifizierung erforderlich., 9050: Teilweise fehlerhaft., 0020: Information fehlerfrei entgegengenommen., 1040: BPD nicht mehr aktuell. Aktuelle Version folgt., 3920: Meldung unterstützter Ein- und Zwei-Schritt-Verfahren:920:930, 1050: UPD nicht mehr aktuell. Aktuelle Version folgt., 9210: Name des TAN-Medium erforderlich.}"

Also geht in wait client.Accounts(CreateTANDialog(client)); wohl etwas schief. Aber das ist so schwer zu lesen, dass ich nicht verstehe, was.

Wenn man es weiterverfolgt, kommt man zu:

    private TANDialog CreateTANDialog(FinTsClient client)
    {
        var dialog = new TANDialog(WaitForTanAsync, pBox_tan);
        if (client.HIRMS == "922")
            dialog.IsDecoupled = true;

        return dialog;
    }

Und dann zu

    public TANDialog(Func<TANDialog, Task<string>> waitForTanAsync, PictureBox pictureBox)
        : this(waitForTanAsync)
    {
        PictureBox = pictureBox;
    }

Und dann zu

    /// <summary>
    /// Enter a TAN without any visual components, e.g. pushTAN or mobileTAN.
    /// </summary>
    /// <param name="waitForTanAsync">Function which takes a </param>
    /// <param name="dialogResult"></param>
    /// <param name="matrixImage"></param>
    public TANDialog(Func<TANDialog, Task<string>> waitForTanAsync)
    {
        _waitForTanAsync = waitForTanAsync;
    }

Und dann zu

    /// <summary>
    /// Wait for the user to enter a TAN.
    /// </summary>
    /// <param name="dialogResult">The <code>HBCIDialogResult</code> from the bank which requests the TAN. Can be used to display bank messages in the dialog.</param>
    /// <returns></returns>
    internal async Task<string> WaitForTanAsync()
    {
        return await _waitForTanAsync.Invoke(this);
    }

Mir ist unklar, was da passieren sollte. Sollte eine Grafik angezeigt werden? Das kenne ich von der Postbank nicht. Ich benutze den Fingerabdrucksensor.

Mir ist außerdem unklar, warum es schon nach 1 Sekunde zurückkehrt. In der Funktionsbeschreibung heißt es ja, er würde auf eine Eingabe warten.

Philipp91 commented 1 year ago

Oh, InitTANMedium() klang vielversprechend, ruft aber die Accounts ab??

Ich glaube RequestTANMediumName() geht in die richtige Richtung. Dann ist aber die Frage, wo man das Ergebnis hin tut. Ich glaube, man muss es in client.HITAB schreiben, so wie hier.

Ich denke, man kann auch client.HITAB setzen ohne die Accounts vorher abzurufen. Mag sein, dass manche Banken einen Accounts-Abruf auch ohne TAN-Medium erlauben, aber aus der obigen Fehlermeldung entnehme ich, dass die Postbank das nicht erlaubt. (Und nur weil man ein TAN-Medium verlangt, heißt das noch nicht, dass man es auch benutzen und mühsam eine TAN eingeben muss.) Und spätestens für den Abruf der Kontostände braucht es dann auf jeden Fall ein TAN-Medium.

Also ich würde rauskriegen, was valide Werte für client.HITAB sind, die Variable dann möglichst früh zuweisen und dann wieder den Kontoabruf probieren. Ohne client.Accounts(...).

NoteToSelfFindGoodNickname commented 1 year ago

OMG, Danke!!!

Ich habe es jetzt so geändert:

    private async Task<bool> InitTANMedium(FinTsClient client)
    {
        // TAN-Medium-Name

        client.HITAB = txt_tan_medium.Text;
        var accounts = await client.Accounts(CreateTANDialog(client));
        if (!accounts.IsSuccess)
        {

Jetzt geht es!!!