phpFinTS icon indicating copy to clipboard operation
phpFinTS copied to clipboard

Installation

Open 2nd-Moon opened this issue 4 years ago • 20 comments

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

2nd-Moon avatar Apr 08 '20 11:04 2nd-Moon

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.

Philipp91 avatar Apr 08 '20 19:04 Philipp91

Das wäre super. Dann würde ich per Composer das phpFinTS erneut installieren.

2nd-Moon avatar Apr 09 '20 08:04 2nd-Moon

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?

2nd-Moon avatar Apr 14 '20 12:04 2nd-Moon

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.

Philipp91 avatar Apr 14 '20 17:04 Philipp91

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

2nd-Moon avatar Apr 17 '20 11:04 2nd-Moon

Welche PHP-Version wird für die Scripte benötigt? Ich habe 7.0 installiert.

2nd-Moon avatar Apr 17 '20 11:04 2nd-Moon

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

fbett avatar Apr 17 '20 14:04 fbett

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

Philipp91 avatar Apr 17 '20 17:04 Philipp91

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

2nd-Moon avatar Apr 20 '20 15:04 2nd-Moon

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?

Philipp91 avatar Apr 20 '20 15:04 Philipp91

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:

'; } ?>

2nd-Moon avatar Apr 21 '20 08:04 2nd-Moon

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

ampaze avatar Apr 21 '20 12:04 ampaze

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.

2nd-Moon avatar Apr 21 '20 12:04 2nd-Moon

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.

Philipp91 avatar Apr 21 '20 17:04 Philipp91

Vielen Dank für den Hinweis. So genau hatte ich mir den Code in login.php noch nicht angesehen. Werde ich machen. Klar.

2nd-Moon avatar Apr 22 '20 07:04 2nd-Moon

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

Tomili777 avatar May 29 '20 08:05 Tomili777

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

fbett avatar May 29 '20 08:05 fbett

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-&gt;getSelectedTanMode() #1 /var/www/clients/client1/web11/web/fin/vendor/nemiah/php-fints/lib/Fhp/FinTs.php(257): Fhp\FinTs-&gt;requireTanMode() #2 /var/www/clients/client1/web11/web/fin/vendor/nemiah/php-fints/Samples/login.php(96): Fhp\FinTs-&gt;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

Tomili777 avatar Jun 09 '20 08:06 Tomili777

Bei den Beispielen siehe login.php

https://github.com/nemiah/phpFinTS/blob/278152dcab7258dc388a0db6f7c0d4c83ee6b3f3/Samples/login.php#L90-L93

ampaze avatar Jun 09 '20 08:06 ampaze

Danke! Gerade gefunden. Wollte soeben meine Kommentar löschen ... :-)

Tomili777 avatar Jun 09 '20 08:06 Tomili777