AbstractMessage::OPT_PINTAN_MECH is an array but used as string
In Dialog::submitTAN wird $tanMechanism immer zu einem Array konvertiert. Dieses wird in Message als $option mit dem Key AbstractMessage::OPT_PINTAN_MECH übergeben. Dieses landet dann in AbstractSegment::toString bei dem probiert wird das Array zu einem String zu casten: $string .= '+' . (string) $de; was natürlich fehlschlägt.
Stimmt :/
Die Konvertierung zu array kann raus. Kannst du das vlt. zu deinem anderen Pull Request #145 hinzufügen?
Da mach ich lieber einen neuen, weil das beides nicht zusammen gehört ;)
Hab in dem PR auch gleich mal einen DocBlock hinzugefügt. Was mir bei dieser Library aufgefallen ist, an vielen Stellen ist nicht ersichtlich welche Datentypen überhaupt erlaubt und erwartet werden. Das führt dann am Ende zu Fehlern wie oben. Ich würde Euch deshalb empfehlen DocBlocks stärker als bisher zu nutzen und am besten sogar PHP TypeHints verwenden, wo möglich,
Nachtrag: Sehe gerade das die lib "php": ">=7.1". in dem Fall wären PHP Typehints natürlich noch besser.
Stimmt. Es ist momentan sehr viel im Umbruch, siehe z.B. #109
Der Fehler ist leider wieder da. FinTsInternal::getUsedPinTanMechanism($dialog) gibt ein Array zurück. Das wird in FinTS::finishStatementOfAccount() verwendet um $response = $dialog->submitTAN($response, $this->getUsedPinTanMechanism($dialog), $tan); aufzurufen. Dort wird aber ein String erwartet....
Ich bin immer noch der Meinung das Ihr zumindest bei allen neuen Code mit TypHints arbeiten sollten oder zumindest überall einen DocBlock hinzufügen solltet, welcher Datentyp jeweils erwartet wird. Gerade für eine Library bei der es rein um Datenumwandlung von einer Struktur in eine andere geht erachte ich das als wirklich sinnvoll.
Du kannst das ersetzen durch $this->tanMechanism und einen Pull Request machen. Und auch gerne TypeHints nachtragen.
Außerdem solltest du dir schonmal FinTsNew angucken.
Mein Problem ist, dass ich gar nicht durchblicke, was jetzt richtig ist... also an welcher Stelle aus dem Array ein String werden muss. Hab das deshalb nur bei mir Lokal gehackt, weil ich nur meinen Anwendungsfall überblicken kann. Aber den Hinweis mit dem FinTsNew nehme ich gerne an und werde die nächsten Tage mal mein Tool darauf umstellen.
Gibt es zu FinTsNew irgendwo Beispielcode? In Samples ist nocht nichts, oder?
also an welcher Stelle aus dem Array ein String werden muss.
Es sollte an keiner Stelle mehr ein Array sein bzw. getUsedPinTanMechanism nicht mehr verwendet werden.
Gibt es zu FinTsNew irgendwo Beispielcode?
Noch nicht, für deinen Fall mit CLI in etwa so
$fints = new FinTsNew($options, $credentials);
$fints->selectTanMode(942);
$login = $fints->login();
$login->maybeThrowError();
if ($login->needsTan()) {
$fints->submitTan($login, readline('TAN Eingeben: '));
}
$getAccountsAction = new GetSEPAAccounts();
$fints->execute($getAccountsAction);
if ($getAccountsAction->needsTan()) {
$fints->submitTan($getAccountsAction, readline('TAN Eingeben: '));
}
$accounts = $getAccountsAction->getAccounts();
$getStatementOfAccount = GetStatementOfAccount::create($accounts[0], new \DateTime('2019-12-09'));
$fints->execute($getStatementOfAccount);
$getStatementOfAccount->maybeThrowError();
if ($getStatementOfAccount->needsTan()) {
$fints->submitTan($getStatementOfAccount, readline('TAN Eingeben: '));
}
dump($getStatementOfAccount->getStatement())
$fints->close();
Der Code oben funktioniert sehr gut für DKB. Hab ihn testweise mal für die IngDiba ausprobiert (die mit der alten Version nicht ging). Ich bekomme jetzt einen neuen/anderen Fehler:
HNHBK:1:3+000000000145+300+0+1'HKIDN:2:2+280:50010517+9999999999+0+0'HKVVB:3:3+0+0+0+0A752F3285FAFEB168FACB5D8+1.0'HKTAN:4:6+4+HKIDN'HNHBS:5:1+1'
HNHBK:1:3+000000000201+300+000006NRJE2S7TB6IUHB2O74P6HBC7+1+000006NRJE2S7TB6IUHB2O74P6HBC7:1'HIRMG:2:2:+9800::Der Dialog wurde abgebrochen.+9400::Der anonyme Dialog wird nicht unterst�tzt.'HNHBS:3:1+1'
Error thrown while running command. Message: "FinTS errors: 9800 (global): Der Dialog wurde abgebrochen. 9400 (global): Der anonyme Dialog wird nicht unterstützt."
Soweit ich weiß, hat IngDiba immer noch keine PSD2 FinTs 3.0 Implementation und auch nicht vor eine zu machen. Da würde ich also nicht unbedingt einen Fehler in phpFinTs sehen. Siehe #57
Sie haben HBCI 2.2 und FinTS 3.0: https://www.ing.de/kundenservice/konto-und-depot-verwalten/banking-und-brokerage/#05780 Das interessante ist, das es jetzt ein anderer Fehler ist als zuvor. Weiß leider nicht ob wir einen Schritt weiter sind, oder einen Schritt weiter entfernt. Zumindest funktioniert die Ing mit anderer HBCI Software nur leider nicht mit dieser Library.
Das was bei der Ing nicht mehr geht ist eine Überweisung über HBCI zu machen (und sie haben sehr lange gebraucht bis die HBCI Schnittstelle überhaupt wieder ging.) Aber jetzt funktioniert sie eigentlich wieder. Siehe Punkt "Häufige Fragen zu FinTS/HBCI": https://www.ing.de/kundenservice/sicherheit/psd2/
In dem Falle, kann vlt @Philipp91 etwas dazu sagen. Die Fehlermeldung ist ja ziemlich eindeutig eigentlich. Vermutlich ist das der Versuch die TAN-Modes zu ermitteln.
Von der oben verlinkten ing.de-Seite:
FinTS/HBCI steht für Girokonten nur noch lesend zur Verfügung. Aufträge sind nicht mehr möglich.
Mit Ihrer Zugangsnummer und Ihrer Internetbanking PIN melden Sie sich im Internetbanking und auch in Ihrer Finanzsoftware an. Den DiBa Key brauchen Sie nur bei der Anmeldung in unserem Internetbanking. Der zweite Faktor wird im Internetbanking überprüft. Das heißt: Ein Log-in über FinTS/HBCI ist nur möglich, wenn Sie sich innerhalb der letzten 90 Tage erfolgreich im Internetbanking angemeldet haben.
Im Klartext heißt das: Die Ing unterstützt den PSD2-Teil der FinTS-Spezifikation nicht. Um trotzdem den gesetzlichen PSD2-Regelungen zu entsprechen, kann sie also keine Überweisungen mehr über FinTS entgegennehmen. Und die TAN, die alle 90 Tage beim Login fällig wird, kann sie nur über das Web-Interface entgegennehmen, "kopiert" diese 90-Tage-Autorisierung dann aber auch auf den FinTS-Zugang. (Meine persönliche Meinung: Das unterläuft das Sicherheitskonzept -- ob jemand sich per FinTS einhackt ist ja unabhängig davon, wie regelmäßig sich der rechtmäßige Anwender per Web-Interface einloggt, möglicherweise an einem ganz anderen Rechner. Naja, solange es nur lesend ist ...).
Die alte Implementierung in dieser Bibliothek kommt damit zurecht, weil sie noch vor PSD2-Zeiten entwickelt wurde. Für die neue Implementierung bin ich stets davon ausgegangen, dass die Bank PSD2 unterstützt. Und in der Spezifikation (Abschnitt B.4.3.1) steht eindeutig: " Daher muss ein Kreditinstitut das Abholen der BPD über einen anonymen Dialog zulassen, wenn es starke Authentifizierung verwenden möchte." Wohingegen der anonyme Dialog früher optional war.
Vmtl. kriegen wir das irgendwie reingehackt. Was wohl nicht gehen wird, ist $fints->getTanModes(). D.h. der Nutzer muss irgendwoher schon wissen, welchen TAN-Modus er verwenden muss. @Metabor Weißt du, woher die alte Implementierung der Bibliothek den TAN-Modus kriegt? Vielleicht kannst du die Kommunikation der alten Bibliothek mit der Bank loggen (auch wenn es dann beim submitTan() abbricht), bei dir speichern falls wir noch mehr Fragen haben, und uns erstmal alle HITANS-Segmente schicken? Da sind keine persönlichen Daten drin.
Und wie kommt's, dass du bei der alten Bibliothek überhaupt submitTan() aufrufst? Wenn ich die FAQ der Bank richtig verstehe, werden über FinTS eh keine TANs akzeptiert.
Hi, gibt's hier irgendwelche News? Hat jemand von euch die Library mit einem ING-Konto zum Laufen gebracht? Wenn ja: mit welcher Version/welchem Stand?
Danke und liebe Grüße!
P.S. Mir geht es tatsächlich nur um das Abholen der Umsätze.
Die ING-DiBa geht seit diesem Commit, also können wir diesen Issue schließen.