Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Probleme beim Volksbank getStatements #448

Closed
seem2810 opened this issue Jul 27, 2024 · 9 comments
Closed

Probleme beim Volksbank getStatements #448

seem2810 opened this issue Jul 27, 2024 · 9 comments

Comments

@seem2810
Copy link
Contributor

Hallo zusammen,

mein Code funktioniert mit Sparkassen und Deutschen Banken.
Jetzt haben wir ein Konto bei der Volksbank und auf einmal klappt es nicht, die Statements zu laden.

Nutze ich SecureTan Push, erhalte ich einen Fehler.
Nutze ich nur SecureTan muss ich dauerhaft in einer Endlos-Schleife einen TAN eingeben.

Jemand eine Idee?

 'message' => 'FinTS errors:
9050 (global): Die Nachricht enthält Fehler.
9800 (global): Dialog abgebrochen
9120 (global): Die Nachricht hat nicht die erwartete Nachrichtennummer.
9010 (wrt seg 3): Auftrag wegen genereller Fehler in Auftragsnachricht nicht verarbeitet.
Request segments:
HKTAN:3:7+S++++egV40vM/9JABAADga2wOh7BCCgQA+N\'',
@ampaze
Copy link
Contributor

ampaze commented Aug 1, 2024

Klingt als würdest du die "Session" nicht korrekt speichern.

Grob sieht das so aus:

Nach TAN-benötigt-Antwort der Bank

$session = $fints->persist(true);

Vor dem Senden der TAN

$fints->loadPersistedInstance($session)

@seem2810
Copy link
Contributor Author

seem2810 commented Aug 5, 2024

Danke! Nun erhalte ich die meldung, dass nur der Push-Tan freigeschaltet ist.
Hier erhalte ich nach der Freigabe nach wie vor einen Fehler..

[2024-08-05 08:37:48] developing.ERROR: Fhp\BaseAction::getNextRequest(): Argument #1 ($bpd) must be of type Fhp\Protocol\BPD, null given, called in nemiah/php-fints/lib/Fhp/PaginateableAction.php on line 104 {"userId":1,"exception":"[object] (Exception(code: 0): Fhp\\BaseAction::getNextRequest(): Argument #1 ($bpd) must be of type Fhp\\Protocol\\BPD, null given, called in nemiah/php-fints/lib/Fhp/PaginateableAction.php on line 104 at /src/Connectors/HBCI.php:324)

@Philipp91
Copy link
Contributor

Philipp91 commented Aug 5, 2024

Das scheint mit 4e12ffb und 4c1104f zusammenzuhängen. Hier wird aus ?BPD ein BPD ohne weitere Prüfung.

@ampaze

@ampaze
Copy link
Contributor

ampaze commented Aug 5, 2024

@seem2810

Auf die Schnelle könntest du $session = $fints->persist(); nutzen d.h. ohne Parameter aufrufen, dann werden die Bankparameterdaten auch in der Session gespeichert.


@Philipp91

Meine Idee den Fehler zu beheben, wäre in FinTs::execute bei paginierbaren Actions, die BPD frisch abzurufen, wenn sie nicht da sind.

if ($action instanceof PaginateableAction) {
    $this->ensureBpdAvailable();
}

$requestSegments = $action->getNextRequest($this->bpd, $this->upd);

@seem2810
Copy link
Contributor Author

seem2810 commented Aug 5, 2024

Habe ich schon versucht...

        // SAVE TAN REQUEST:
        $persistedAction = serialize($action);
        $persistedFints = $this->fints->persist();
        \Cache::put('crBaRe', serialize([$persistedFints, $persistedAction]), now()->addMinutes(10));

Dann der load in handleDecoupleCheck()

        $currentTanRequest = \Cache::get('crBaRe');
        if (!empty($currentTanRequest)) {
            list($persistedInstance, $persistedAction) = unserialize($currentTanRequest);

            if ($this->credentials == null) {
                $this->handleException('missing_login');
            }

            $this->fints = \Fhp\FinTs::new($this->options, $this->credentials, $persistedInstance);
            $action = unserialize($persistedAction);
            $timeout = 30;

            $tanMode = $this->fints->getSelectedTanMode();
            $tanRequest = $action->getTanRequest();

            try {
                if ($tanMode->getMaxDecoupledChecks() !== 0 && $this->attempt >= $tanMode->getMaxDecoupledChecks()) {
                    return $this->handleException();
                }

                if (!$this->fints->checkDecoupledSubmission($action)) {
                    if ($tanMode->allowsAutomatedPolling()) $timeout = $tanMode->getPeriodicDecoupledCheckDelaySeconds();

                    if ($timeout < 5) $timeout = 5;

                    $this->attempt++;

                    return [
                        'result' => 'tan_confirm',
                        'tanMode' => $tanMode,
                        'tanRequest' => $tanRequest,
                        'attempt' => $this->attempt,
                        'timeout' => $timeout
                    ];
                }
            } catch (\Throwable $exception) {
                return $this->handleException($exception->getMessage());
            }
        }

@Philipp91
Copy link
Contributor

Hier erhalte ich nach der Freigabe nach wie vor einen Fehler..

Bitte schick uns noch den kompletten Stack Trace von dem Fehler. Offenbar wird ja execute() aufgerufen, aber von wo genau?

@Philipp91
Copy link
Contributor

Meine Idee den Fehler zu beheben, wäre in FinTs::execute bei paginierbaren Actions, die BPD frisch abzurufen, wenn sie nicht da sind.

Ist einen Versuch wert: #449

Wenn es damit funktioniert, können wir es vielleicht noch an die korrekte Stelle schieben (anhand vom Stack Trace). Weil an dieser zentralen Stelle sollte es eigentlich nicht nötig sein, die BPD abzurufen. Ich frage mich, ob das hier in einem submitTan()-Aufruf passiert, wo nach der TAN-Eingabe die erste von mehreren Seiten zurückkommt. Normalerweise senden Banken dann die BPD auch gleich mit und wir extrahieren sie hier, aber das kann auch false zurückgeben und nichts tun. Wenn das das Szenario hier ist, sollte nwir den ensureBpdAvailable() Aufruf lieber hier einfügen.

Ah und ich glaube, beides wird nicht funktionieren. Weil execute() setzt voraus, dass ein Dialog offen ist (außer man ruft es zum Dialog-Öffnen auf) und ensureBpdAvailable() setzt das Gegenteil voraus. Also können wir nicht ensureBpdAvailable() aus execute() aufrufen.

Wenn es wirklich das oben beschriebene Szenario ist, sollten wir dafür sorgen, dass die Bank uns die BPD liefert wenn wir die TAN schicken. execute() verwendet buildMessage() und daher createWrappedMessage(). Irgendwo dort könnten wir evtl. ein HKVVB hinzufügen, so wie in ensureBpdAvailable(). Nur dass letzteres mit createPlainMessage() arbeitet. D.h. man müsste sich erst schlaumachen, ob das HKVVB in die innere Message oder in den Wrapper gehört.

@seem2810
Copy link
Contributor Author

seem2810 commented Aug 6, 2024

Okay! Nun, keine Ahnung warum, erhalte ich keinen Fehler mehr... (Ein bug in meiner Software war, dass beim decoubleCheck die neue Session nicht gespeichert wird)
Aber unabhänig davon, erhalte ich nun ein true beim $check, sobald ich freigegeben habe.
Warum auch immer, führt er die restliche Transaktion dennoch nicht aus - bzw. ich gehe davon aus, dass er ausführt, aber anschließend fehlt der Programmcode der das verarbeitet.

Da muss ich mir dann mal überlegen, wie ich das hin kriege..
Bei der Volksbank muss ich auch jeden Bankabruf freigeben, bei der Sparkasse & DB nicht.. Vermutlich geht deswegen mein Code bei den anderen Banken.

     $check = $this->fints->checkDecoupledSubmission($this->action);

                \Log::debug('handleDecoupledRequest', [
                    'state' => $check,
                    'request' => request()->all()
                ]);
                if (!$check) {

@seem2810
Copy link
Contributor Author

seem2810 commented Aug 7, 2024

Okay! Yes.
Damit geht es nun. Ich calle meine readTransactions methode anschließend und kriege die Transaktionen.

Vorgang daher closed.

@seem2810 seem2810 closed this as completed Aug 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants