phpFinTS
phpFinTS copied to clipboard
Installation
Hallo zusammen, ich freue mich, dass nemiah ein Script für SEPA-Lastschriften erstellt hat und pflegt. Vielleicht kann mir Jemand einen Tipp bei der Installation geben. Die Installation per Composer hat geklappt.
composer require nemiah/php-fints Using version ^1.6 for nemiah/php-fints ./composer.json has been created Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 2 installs, 0 updates, 0 removals Installing psr/log (1.1.3): Downloading (100%) Installing nemiah/php-fints (1.6.0): Downloading (100%) nemiah/php-fints suggests installing monolog/monolog (Allow sending log messages to a variety of different handlers) nemiah/php-fints suggests installing nemiah/php-sepa-xml (dev-master) Writing lock file Generating autoload files
Jetzt bekomme ich aber leider einen Fehler beim Aufruf von /SamplesNew/statementOfAccount.php In der login.php habe ich natürlich Anpassungen vorgenommen.
Fatal error: Uncaught Error: Class 'Fhp\Options\FinTsOptions' not found in /www/htdocs/xxx/xxx/api_sepa/SamplesNew/login.php:14 Stack trace: #0 /www/htdocs/xxx/xxx/api_sepa/SamplesNew/statementOfAccount.php(11): require_once() #1 {main} thrown in /www/htdocs/xxx/xxx/api_sepa/SamplesNew/login.php on line 14
Hier meine login.php
$options = new \Fhp\Options\FinTsOptions(); $url = 'https://hbci.postbank.de/banking/hbci.do'; // HBCI / FinTS Url can be found here: https://www.hbci-zka.de/institute/institut_auswahl.htm (use the PIN/TAN URL) $bankCode = '10010010'; // Your bank code / Bankleitzahl $productName = 'meine Nummer steht hier natürlich drin'; // The number you receive after registration / FinTS-Registrierungsnummer $productVersion = '1.0'; // Your own Software product version $username = 'xxx'; $pin = 'xxx'; // This is NOT the PIN of your bank card! $fints = new \Fhp\FinTsNew($url, $bankCode, $username, $pin, $productName, $productVersion); $fints->setLogger(new \Tests\Fhp\CLILogger());
Muss ich noch weitere Pakete per composer installieren oder muss ich aus $options = new \Fhp\Options\FinTsOptions(); irgendwo noch ein New eintragen für die neuen Funktionen? Ich würde gleich die neuen Funktionen unter SamplesNew verwenden. Gruß Klaus
Der Beispielcode auf master hat einen kleinen Bug, Fix ist hier. Aber viel wichtiger ist, dass er nicht zur Version 1.6
passt, die du heruntergeladen hast. Außerdem willst du vermutlich 2.0
runterladen. Auch dazu passt der Code auf master aber nicht, du musst das SamplesNew-Verzeichnis aus deiner Installation öffnen -- oder eben den Code von master installieren.
Ich kümmere mich dieses Wochenende darum, dass wir ein endgültigeres Release kriegen, wo FinTsNew
dann auch wieder FinTs
heißt.
Das wäre super. Dann würde ich per Composer das phpFinTS erneut installieren.
Ich hatte natürlich den Code aus dem SamplesNew-Verzeichnis genommen. Dort kam aber der Fehler, dass dieses Script somit nicht mit dem restlichen Code kompatibel ist. Und im Master-Code gibt es keine DirectDebit-Datei im SamplesNew-Ordner. Kann ich eine Version herunterladen, womit ich Lastschriften per SEPA nach dem aktuellen Verfahren einreichen kann?
Hier ist der Beispielcode auf master: https://github.com/nemiah/phpFinTS/blob/master/Samples/directDebit_Sephpa.php https://github.com/nemiah/phpFinTS/blob/master/Samples/directDebit_phpSepaXml.php Es gibt zwei Beispiele, weil man eine externe Bibliothek benötigt, um das XML zu erzeugen, und da gibt es (mindestens) diese beiden zur Auswahl.
Die sind kompatibel mit dem Code auf master.
Ich habe ja per Composer die Version 1.6 installiert und die hiermit installierten Samples verwendet.
composer require nemiah/php-fints Using version ^1.6 for nemiah/php-fints ./composer.json has been created Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 2 installs, 0 updates, 0 removals
- Installing psr/log (1.1.3): Downloading (100%)
- Installing nemiah/php-fints (1.6.0): Downloading (100%) nemiah/php-fints suggests installing monolog/monolog (Allow sending log messages to a variety of different handlers) nemiah/php-fints suggests installing nemiah/php-sepa-xml (dev-master) Writing lock file Generating autoload files
Ich scheitere immer noch beim Login und komme hier nicht weiter. Erstmal nur Saldo.php aufgerufen.
Fatal error: Uncaught TypeError: Return value of testLogger::log() must be an instance of void, none returned in /www/htdocs/w00ed9bc/ronxxx.net/vendor/nemiah/php-fints/Samples/saldo.php:13 Stack trace: #0 /www/htdocs/w00ed9bc/ronxxx.net/vendor/psr/log/Psr/Log/AbstractLogger.php(126): testLogger->log('debug', 'Fhp\FinTs:getSE...', Array) #1 /www/htdocs/w00ed9bc/ronxxx.net/vendor/nemiah/php-fints/lib/Fhp/FinTs.php(214): Psr\Log\AbstractLogger->debug('Fhp\FinTs:getSE...') #2 /www/htdocs/w00ed9bc/ronxxx.net/vendor/nemiah/php-fints/Samples/saldo.php(42): Fhp\FinTs->getSEPAAccounts() #3 {main} thrown in /www/htdocs/w00ed9bc/ronxxx.net/vendor/nemiah/php-fints/Samples/saldo.php on line 13
Oder kann ich für die Version 1.6 auch diese Samples verwenden? https://github.com/nemiah/phpFinTS/tree/master/Samples
Welche PHP-Version wird für die Scripte benötigt? Ich habe 7.0 installiert.
Das könnte auch der Grund sein, warum er bei dir eine alte Version auswirft. Derzeit wird PHP 7.1 vorausgesetzt.
Der Extended Support für PHP 7.0 ist bereits im Januar letzten Jahres ausgelaufen, siehe: https://www.php.net/supported-versions.php
Den aktuellen master könntest du mit dem Composer wie folgt erhalten:
composer require nemiah/php-fints dev-master
Genau, PHP 7.1 und am besten dev-master
im Moment, wenn du noch keine Anwendung programmiert hast, die auf eine ältere Version aufgelegt ist. (1.6
is uralt und passt in keiner Art und Weise mehr zu den Beispielen auf master).
Mein Webspace läuft auch unter PHP 7.4. Konnte nun auch die PHP-Version für die Shell anpassen. Klappt nun. Version 2.1.0 ist drauf :-))))
Ich konnte nun auch mit ein wenig Tricksen den Tanmode und Tanmedium raus bekommen. Er schickt mir nun eine SMSTan beim Aufruf von login.php. Aber wie gebt ihr diese ein? Ich benutzte den Firefox unter Windows. Und vor allem bekomme ich ja erst nach dem Aufruf von login.php die SMS-Tan zugeschickt. Bin hier für einen Hinweis dankbar :-)
So wie es ist, funktioniert das Skript nur auf der Kommandozeile, weil es fgets()
verwendet um auf die TAN-Eingabe zu warten. Alles weitere ist Sache der jeweiligen Anwendung -- phpFinTS ist nur eine Bibliothek und keine vollständige Lösung für UI, Datenbank und so weiter. Siehe auch hier und hier.
Es hat neulich schonmal jemand gefragt, wie man die Bibliothek in eine Anwendung (in dem Fall mit REST-API) einbinden kann. Vielleicht sollten wir eine vollständige Beispielanwendung in den Samples
-Ordner tun?
Oh ok. Ich habe jetzt aber sogar zwei Lösungen dafür gefunden. A: man gibt per FTP-Programm parallel zum Aufruf von login.php die TAN direkt in die Datei ein B: man installiert eine Subdomain auf dasselbe Verzeichnis und ruft per 2. TAB im Browser die TAN-Eingabe auf.
In der login.php tausche ich
$tan = trim(fgets(STDIN));
gegen den code ein:
`echo "
<a href="https://yoursubdomain.domain.net/SamplesNew/taninput.php" target="_blank">open second tab for tan input or write the tan directly to the file via ftp
";
//normally the browser has a connection limit to one domain. the browser will wait till the first tab(this script) is finished executing. but than it's too late for the input of your tan.
//a solution is to install a new subdomain for your webserver to the exact same directory. i.e. www.domain.com/login.php and sub.domain.com/taninput.php to open the taninput.
//both domains are pointing to the same directory of the webserver.
//tan input with file
$filename="tan.txt";
//test, if file is writeable
$content=file_get_contents($filename).".";
file_put_contents($filename, $content);
$content_compare=file_get_contents($filename);
if($content_compare!=$content){
echo "file access error!";
exit;
}else{
//init
file_put_contents($filename, "...");
}
for ($i = 0; $i < 60; $i++) {
//check for tan
$content=file_get_contents($filename);
if($content!="..."){
$tan=$content;
file_put_contents($filename, "...");
echo "tan found!<br>";
flush();
ob_flush();
break;
}
echo "$i...";
flush();
ob_flush();
sleep(1);
}`
die Datei taninput.php sieht dann so aus:
<?php
$filename="tan.txt";
if($_POST['tan']){
echo "Thank you!
";
echo '';
file_put_contents($filename, $_POST['tan']);
}else{ echo 'TAN:
'; } ?>
Dass man die Verbindung nicht bestehen lassen muss, war doch eigentlich der Startschuss für die Neuimplementierung durch @Philipp91. Imho keine gute Lösung.
Wir machen es so:
Serialisiere das FinTs Objekt und die Action als hidden Fields in einem Formular zusätzlich zu dem TAN Eingabefeld. Also z.B. folgende Parameter für das Tan-Eingabe-Template.
[
'challenge' => $tanMode->getChallengeLabel() . ': '. $action->getTanRequest()->getChallenge(),
'fints' => base64_encode($fints->persist(true)),
'action' => base64_encode(serialize($action)),
'tan_max_length' => $tanMode->getMaxTanLength(),
'tan_format_numerical' => $tanMode->getTanFormat() === TanMode::FORMAT_NUMERICAL
]
Nach dem Abschicken kann man dann damit die Sitzung fortsetzen, beispielhaft so
$action = unserialize(base64_decode($request->request->get('action')));
$fints = $this->getFinTsForAccount($account);
$fints->loadPersistedInstance(base64_decode($request->request->get('fints')));
$fints->submitTan($action, trim($request->request->get('tan')));
$action->ensureSuccess();
Das ist sicher die bessere Lösung. Dafür kannte ich die Scripte aber nicht gut genug, um das zu implementieren. Ich schaue mir das einmal an. Danke.
Ja, so Tricks wie FTP oder Subdomains oder Multithreading sollten alle nicht nötig sein. Man kann zwei ganz normale PHP Funktionen haben, die von zwei unterschiedlichen Requests angesteuert werden. Siehe auch #271. Zum Beispiel ist es ohne große Tricks (nur eine Datenbank) möglich, es zu implementieren, dass diese Requests funktionieren:
GET /fetchtransactions
200 OK
Sorry brauche eine TAN, bitte eingeben <form action="/submittan"><input name="tan">
POST /submittan | tan=12345
200 OK
Danke, hier kommen die Umsätze: <JSON mit den abgeholten Umsätzen>
Hinter den Kulissen läuft beim ersten Request die erste Hälfte von handleTan() und beim zweiten Request die zweite Hälfte. Dazwischen werden nur diese zwei $persisted..
-Strings irgendwo zwischengelagert.
Vielen Dank für den Hinweis. So genau hatte ich mir den Code in login.php noch nicht angesehen. Werde ich machen. Klar.
Hallo zusammen. Ich hänge mich hier mal mit ran und hoffe, dass mir jemand helfen kann. Wäre sehr dankbar.
Habe ein neues Verzeichnis erstellt und dann mit composer require nemiah/php-fints
das Projekt installiert. Meldungen:
No composer.json in current directory, do you want to use the one at /var/www/clients/client1/web11/web? [Y,n]? n Using version ^1.6 for nemiah/php-fints ./composer.json has been created Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 2 installs, 0 updates, 0 removals
- Installing psr/log (1.1.3): Loading from cache
- Installing nemiah/php-fints (1.6.0): Loading from cache nemiah/php-fints suggests installing monolog/monolog (Allow sending log messages to a variety of different handlers) nemiah/php-fints suggests installing nemiah/php-sepa-xml (dev-master) Writing lock file Generating autoload files
Danach gibt es aber nicht wie oben beschrieben eine lohin.php, init.php oder SamplesNew.
Auch erscheint beim Aufruf von https://meine-url.xyz/fin/vendor/nemiah/php-fints/Samples/accounts.php die Meldung require(../vendor/autoload.php): failed to open stream: ....
Kann mir jemand unter die Arme greifen?
Gruss, Tomili
- Die Version 1.6 ist zu alt. Bitte lese dir mal die Beiträge in diesem Thread ab https://github.com/nemiah/phpFinTS/issues/251#issuecomment-615273217 durch.
- Ich würde empfehlen, Require Verweise stets absolut anzulegen, beispielsweise:
require(dirname(dirname(__FILE__)) . '/vendor/autoload.php');
OK. Hatte noch andere Probleme zu lösen.
beim Aufruf von tanModesAndMedia.php erscheint
[962] => Smart-TAN plus manuell [972] => Smart-TAN plus optisch / USB [982] => Smart-TAN photo )
Wie hinterlegt man den Tan Mode dann bei den anderen Scripten?
Beim Aufruf (accounts.php, balance.php, etc.) der Fehler:
<b>Fatal error</b>: Uncaught InvalidArgumentException: Unknown TAN mode: 900 in /var/www/clients/client1/web11/web/fin/vendor/nemiah/php-fints/lib/Fhp/FinTs.php:658 Stack trace: #0 /var/www/clients/client1/web11/web/fin/vendor/nemiah/php-fints/lib/Fhp/FinTs.php(690): Fhp\FinTs->getSelectedTanMode() #1 /var/www/clients/client1/web11/web/fin/vendor/nemiah/php-fints/lib/Fhp/FinTs.php(257): Fhp\FinTs->requireTanMode() #2 /var/www/clients/client1/web11/web/fin/vendor/nemiah/php-fints/Samples/login.php(96): Fhp\FinTs->login() #3 /var/www/clients/client1/web11/web/fin/vendor/nemiah/php-fints/Samples/accounts.php(11): require_once('/var/www/client...') #4 {main} thrown in <b>/var/www/clients/client1/web11/web/fin/vendor/nemiah/php-fints/lib/Fhp/FinTs.php</b> on line <b>658</b><br />
Hat dazu jemand eine Idee? Freue mich über jede Hilfe.
Gruss, Tomili
Bei den Beispielen siehe login.php
https://github.com/nemiah/phpFinTS/blob/278152dcab7258dc388a0db6f7c0d4c83ee6b3f3/Samples/login.php#L90-L93
Danke! Gerade gefunden. Wollte soeben meine Kommentar löschen ... :-)