Sonntag, 27. Oktober 2019
Aus Rodro-Programmierung wird MaRo-Programmierung
Als Geschäftsführer und Inhaber der MaRo-Pflegedienste stand nun fest, dass auch der Bereich der Datenbankentwicklung unter dem Label "MaRo" stehen soll.
Sonntag, 26. Mai 2013
FileMaker und PHP (Teil 1 Server Einrichtung)
FileMaker kann seine Daten problemlos auf verschiedenen Clients auf Mac OS, Windows, iOS oder gar Android darstellen. Was passiert aber wenn dem Nutzer dem ich die Daten zur Verfügung stellen möchte keinen FileMaker-Client besitzt oder installieren möchte bzw. darf. Was ist wenn unzählige Nutzer sich nur kurzzeitig auf einem FileMaker System einlochen um Daten zu erfassen oder zu administrieren? Dann benötigen wir eine Lösung im Web-Browser. Na das ist ja mit FileMaker eigentlich kein Problem. Es braucht ja nichts mal einen Server. Die entsprechende Datei einfach über einen Client oder über einen FileMaker Server per IWP zur Verfügung stellen. Das geht extrem schnell, die zu sehenden Webseiten werden einfach innerhalb von FileMaker editiert. Aber diese Lösung stellt einen vor verschieden Probleme.
z.B.
-keine Passwortsterne
-kein Return um die Webseite zu aktualisieren
-läuft nicht innerhalb eines Frames
-Button des Browsers für VOR und ZURÜCK können bei Benutzung
dazu führen das Benutzer im falschen Datensatz landen.
-Nur eine Einstiegs-Seite für die Datenbank
Diese Liste kann noch um einige Punkte erweitert werden, aber sind das die Punkte für die sich keine wirkliche Ersatzlösung findet. Also dann nutzen wir halt einfach FileMaker in Kombination mit PHP. Da ich persönlich immer auf einem Remote-Server (FileMaker 11 oder 12 Adv. auf auf Windows Shared Hyper-V VM) entwickle habe ich die endsprechenden Vorraussetzungen schon geschaffen um PHP mit FileMaker zu kombinieren.
Die Einrichtung des FileMaker Servers ist eigentlich über die Einsatzplanung und den Wizzard des FileMaker Servers leicht zu bewerkstelligen und soll nicht Thema der kleinen Einführung sein.
Wichtig ist das nach der Einrichtung des Servers die entsprechenden PHP Eigenschaften als OK gekennzeichnet sind. Die Entscheidung ob man den vorhandenen IIS oder einen Apache Server nutzt bleibt einem überlassen. Ich persönlich nutze den schon vorhandenen IIS.
Um später schnellen Zugriff auf den Ordner der die PHP Dateien enthält zu haben sollte man sich einen FTP Zugang einrichten. Ich nutze dafür FileZilla. Damit umgehe ich die ganze relativ komplexe Einrichtung des FTP Zuganges über den IIS-Manager.
Als Home Verzeichnis dient dabei der Ordner in den wir unsere PHP Dateien legen werden. Standard ist beim IIS das Verzeichnis C:\inetpub\wwwroot\…. und den Ordner wwwroot legen wir dann einfach einen Projektordner mit der Bezeichnung unserer Wahl.
Nun sind wir soweit das wir unsere Werkzeuge für die PHP Bearbeitung und auch den FileMaker Client für die Nutzung mit dem Server vorbereiten. Als erstes benötigen wir natürlich eine Datei die wir über den FileMaker Server zur Verfügung stellen können. Wichtig ist dabei das wir dieser Datei die Berechtigung für den Zugriff über PHP zuweisen. Dies geschieht über Ablage/Verwalten/Sicherheit/Konten/Berechtigung bearbeiten. Dabei benötigt z.B. der User „WEB“ den Zugriff über Acres via PHP Web Publishing (fmphp).
Anschliessend schiebe ich die Datei entweder per FTP oder einfach über den RDP Client über mein Remote-Zugriff auf den Server. Dort einfach über die FileMaker-Server Konsole zur Verfügung stellen.
Ich persönlich nutze für die Bearbeitung der PHP Dateien eine IDE mit der Bezeichnung PHPStorm. Diese besitzt den Vorteil eines integrierten FTP-Clients. Somit kann ich jede Änderung einer Datei Offline durchführen und sofort per Upload in meinen Projektordner laden. In einem extern geöffneten Browser habe ich dann immer die Möglichkeit sofort den Erfolg oder Misserfolg meiner Arbeit zu begutachten.
Voraussetzung?
Erstellen Sie erstmal ein neues Projekt innerhalb der IDE, legen einen Offline Projektordner fest. Anschliessend können Sie unter Toll/Deployment/Configuration einen FTP Zugang anlegen. Wichtig ist nachdem dieser Zugang funktioniert unter Mappings die Ofline Dateien und die Online Dateien zusammenzuführen. Dabei legen Sie den Local Path und Web Path fest.
z.B.
Local Path: /Users/ronny/Documents/PHP-Developer/PHPStorm/TNM/FileTNM2
Web Path: /FileTNM2/FileTNM2
Deployment Pat: FileTNM2
Nun steht dem automatischen Upload der Dateien nichts mehr im Weg.
Was benötigen wir sonst noch? Die FileMaker API s oder Klassen. Diese befinden sich auf dem Server im Ordner C:\Program Files\FileMaker\FileMaker Server\Web Publishing\publishing-engine\php. Von dort kopieren wir uns den Ordner FileMaker und die Datei FileMaker.php in unseren Projektordner.
Sonntag, 30. Dezember 2012
FileMaker Synchronisation...
Ab 7 Januar stellen wir eine neue Synchronisations-Lösung für FileMaker vor. Ob Server - Client oder FileMaker Go - Server und umgekehrt. Diese Lösung funktioniert ohne Plugin.
Donnerstag, 13. Dezember 2012
Kreditkartenabrechnung mit FileMaker Teil 2
Für die Anzeige der Daten vom Zahlungs-Dienstleister nutzen wir ein kleines Feld vom Typ WebViewer. Die URL des WebViewers ergibt sich aus dem Pfad zum PHP-Script auf dem Webserver und unseren Parametern die wir aus FileMaker auslesen:
URL.Parameter= "http://www……………………com/Semicon2012/request.php"
&
"?"&"LastName=" & KONTAKT.T_Last_Name & "&" &"Price="&Preis_Heidel_Uebertragung&"&" & "Street=" & KONTAKT.T_Adress & "&" & "Zip=" & KONTAKT.Z_ZIP & "&" & "Stadt=" & KONTAKT.T_City & "&" & "Land=" & KONTAKT.T_Country & "&" & "Mail=" & KONTAKT.T_EMail & "&" & "Buchung=" & INVOICE.BUCHUNG.Nr_1_2 & "&" & "FirstName=" & KONTAKT.T_First_Name&"&" & "Code=" & KONTAKT.SICHERHEIT.CODE
Als Webadresse vergeben wir das Feld URL.Parameter
Rufen wir nun das Layout auf und der WebViewer wird aktiv erscheint die Eingabemaske vom Zahlungs-Dienstleister incl. der eingegeben Parameter wie Zahlungsbetrag, Adresse und anderer Werte.
Nun gibt der Kreditkarteninhaber nur noch seine Kartennummer ein und die Verifikation Number. Nach dem Klick auf Pay Now wird vom Zahlungs-Dienstleister die Zahlung verarbeitet. Im Anschluss wird das PHP-Script "http://www...………………...com/Semicon2012/response.php" aufgerufen.
Das Script ruft je nach Wunsch eine URL auf die dann wieder in unserem WebViewer angezeigt wird.
<?php
//this page is called after the customer finishes
//payment with the Web Payment Frontend.
//It must be hosted YOUR system and accessible
//to the outside world.
//It always must respond with a URL that defines
//which page the WPF should redirect to.
//this new page also MUST be hosted on your system
//AND it musst be accessible so that the WPF can
//redirect the users browser to it.
// PROCESSING.RESULT gets PROCESSING_RESULT when posting back (URL encoding)
$returnvalue=$_POST['PROCESSING_RESULT'];
if ($returnvalue)
{
if (strstr($returnvalue,"ACK"))
{
print "Location: http://www…………………………com/Semicon2012/success.html";
}
else
{
print "http://www……………………………com/Semicon2012/error.html";
}
}
?>
Wird als Wert ACK vom Zahlungs-Dienstleister an das Script zurückgegeben wird die URL für die erfolge Transaktion aufgerufen. ACK ist immer der Wert für erfolgte Transaktionen.
Nun da wir wissen welcher Wert im WebViewer auftaucht, müssen wir diesen nur noch überprüfen.
Über GetLayoutObjectAttribute("Webviewer" ; "Source") können wir den Inhalt des WebViewers abfragen. Vergleichen wir diesen ausgelesenen Inhalt z.B. mit der Funktion Exakt (InhaltWebViewer; Vergleichsfeld) können wir bestimmen ob eine Transaktion erfolgt ist oder nicht.
Mit dieser Methode kann man Kreditkartenlösungen ohne Plugin realisieren.
Montag, 3. Dezember 2012
Kreditkartenabrechnung mit FileMaker
Mit FileMaker eine Kreditkartenabrechnung zu starten ist auf den ersten Blick nicht trivial. Für eines meiner letzten Projekte musste ich aber eine Schnittstelle zu einem Anbieter implementieren. Nun gibt es eine Hand voll Plugin-Anbieter die sich dem Thema angenommen haben. Leider arbeiten diese Plugin,s meist nur mit einem speziellem Zahlungsanbieter. Der von mir benötigte war natürlich nicht dabei.
Wichtig ist in diesem Zusammenhang zu wissen das es mir gar nicht erlaubt ist Daten wie Kreditkarten-Nummer in FileMaker vorzuhalten, zu verarbeiten und dann wie von mir im ersten Ansatz angedacht per XML-Transaktion zu übertragen. Der Zahlungs-Dienstleister akzeptiert nur Daten die auch in seinem Front-End auftauchen. Also blieb mir nur noch PHP für die Transaktionen.
Also war wieder Handarbeit angesagt. Im ersten Schritt habe ich mir vom Zahlungs-Dienstleister an die 20 PDF Dokumente geladen um anschliessend erstmal frustriert in den Feierabend zu gehen. Nichts aber auch rein gar nichts habe ich verstanden. Aber halt, da gab es das Stichwort PHP.
Nun jetzt hatte ich endlich einen Ansatz, den WebViewer von FileMaker.
Was benötigen wir:
- Webserbver ISS oder Apache
- Zahlungs-Dienstleister wie z.B. Heidelpay
- FileMaker Datenbank
- Zeit…
Zum testen benötigen wir nur eine einfache FileMaker Datenbank, die Felder enthält für Namen, Vornamen, Straße usw.
Hinzu kommen genau zwei PHP-Scripte. Ein request.php und ein response.php und nicht so wichtig eine CSS. Diese hält Informationen über das Äussere des HeidelPay Front-End bereit.
Dabei gilt dem request.php unser besonderes Augenmerk.
Die Request-Datei:
<?php
//URL fuer Testsystem
$url = "https://heidelpay.hpcgw.net/sgw/gtw";
$parameters['SECURITY.SENDER'] = "…………………………………………………..";
$parameters['USER.LOGIN'] = "……………………………………...";
$parameters['USER.PWD'] = "…………………..";
// Channel fÔøΩr CC, OT Sofort, DC, DD, PayPal
$parameters['TRANSACTION.CHANNEL'] = "………………………...…………….";
////////////////////////////////////
$parameters['ACCOUNT.HOLDER'] = $_GET['LastName'];
$parameters['ACCOUNT.NUMBER'] = "";
//$parameters['ACCOUNT.BRAND'] = "PAYPAL";
$parameters['ACCOUNT.BRAND'] = "";
$parameters['ACCOUNT.EXPIRY_MONTH'] = "";
$parameters['ACCOUNT.EXPIRY_YEAR'] = "";
$parameters['ACCOUNT.VERIFICATION'] = "";
//Payment Code -- Auswahl Bezahlmethode und Typ
//$parameters['PAYMENT.CODE'] = "DD.RG";
//$parameters['PAYMENT.CODE'] = "CC.RG";
$parameters['PAYMENT.CODE'] = "CC.DB";
//$parameters['PAYMENT.CODE'] = "OT.PA";
//$parameters['PAYMENT.CODE'] = "VA.DB";
$parameters['PRESENTATION.CURRENCY'] = "EUR";
//Response URL angeben
$parameters['FRONTEND.RESPONSE_URL'] = "http://www...………………...com/Semicon2012/response.php";
//CSS- und/oder Jscript-Datei angeben
$parameters['FRONTEND.CSS_PATH'] = "https://....…………………....de/style/onlycarddetails.css";
$parameters['PRESENTATION.AMOUNT'] = $_GET['Price'];
$parameters['IDENTIFICATION.TRANSACTIONID'] = $_GET['Buchung'];
$parameters['PRESENTATION.USAGE'] = 'SEMICON 2012 Transaktion '.date("d.m.Y");
//$parameters['FRONTEND.MODE'] = "DEFAULT";
$parameters['FRONTEND.MODE'] = "WPF_LIGHT";
// Modus auswÔøΩhlen
$parameters['TRANSACTION.MODE'] = "LIVE";
//$parameters['TRANSACTION.MODE'] = "INTEGRATOR_TEST";
//$parameters['TRANSACTION.MODE'] = "CONNECTOR_TEST";
$parameters['FRONTEND.ENABLED'] = "true";
$parameters['FRONTEND.POPUP'] = "false";
$parameters['FRONTEND.SHOP_NAME'] = 'SEMICON 2012';
$parameters['FRONTEND.REDIRECT_TIME'] = "0";
$parameters['FRONTEND.LANGUAGE_SELECTOR'] = "false";
$parameters['FRONTEND.LANGUAGE'] ="en";
$parameters['REQUEST.VERSION'] = "1.0";
/*
$parameters['NAME.GIVEN'] = "";
$parameters['NAME.FAMILY'] = "";
*/
$parameters['NAME.GIVEN'] = $_GET['FirstName'];
$parameters['NAME.FAMILY'] = $_GET['LastName'];
$parameters['ADDRESS.STREET'] = $_GET['Street'];
$parameters['ADDRESS.ZIP'] = $_GET['Zip'];
$parameters['ADDRESS.CITY'] = $_GET['Stadt'];
$parameters['ADDRESS.COUNTRY'] = $_GET['Land'];
$parameters['ADDRESS.STATE'] = "";
$parameters['CONTACT.EMAIL'] = $_GET['Mail'];
$parameters['CRITERION.CODE']= $_GET['Code'];
//building the postparameter string to send into the WPF
$result = '';
foreach ($parameters AS $key => $value)
$result .= strtoupper($key).'='.urlencode($value).'&';
$strPOST = stripslashes($result);
//echo $strPOST;
//open the request url for the Web Payment Frontend
$cpt = curl_init();
curl_setopt($cpt, CURLOPT_URL, $url);
curl_setopt($cpt, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($cpt, CURLOPT_USERAGENT, "php ctpepost");
curl_setopt($cpt, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cpt, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($cpt, CURLOPT_POST, 1);
curl_setopt($cpt, CURLOPT_POSTFIELDS, $strPOST);
$curlresultURL = curl_exec($cpt);
$curlerror = curl_error($cpt);
$curlinfo = curl_getinfo($cpt);
curl_close($cpt);
// here you can get all variables returned from the ctpe server (see post integration transactions documentation for help)
//print $strPOST;
// parse results
$r_arr=explode("&",$curlresultURL);
foreach($r_arr AS $buf)
{
$temp=urldecode($buf);
$temp=split("=",$temp,2);
$postatt=$temp[0];
$postvar=$temp[1];
$returnvalue[$postatt]=$postvar;
//print "<br>var: $postatt - value: $postvar<br>";
}
$processingresult=$returnvalue['POST.VALIDATION'];
$redirectURL=$returnvalue['FRONTEND.REDIRECT_URL'];
// everything ok, redirect to the WPF,
if ($processingresult=="ACK")
{
if (strstr($redirectURL,"http")) // redirect url is returned ==> everything ok
{
header("Location: $redirectURL");
}
else // error-code is returned ... failure
{
//header("Location: http://127.0.0.1/livesystem/error.php");
print_r($returnvalue);
}
}// there is a connection-problem to the ctpe server ... redirect to error page (change the URL to YOUR error page)
else
{
// header("Location: http://127.0.0.1/livesystem/connection.php");
print_r($returnvalue);
//print_r($returnvalue);
}
?>
Dabei sind auch Parameter von Relevanz die aus unserer Datenbank stammen.
$parameters['NAME.GIVEN'] = $_GET['FirstName']; FirstName = Feld KONTAKT.T_First_Name aus unserer FileMaker-Datenbank
$parameters['NAME.FAMILY'] = $_GET['LastName']; LastName = Feld KONTAKT.T_Last_Name aus unserer FileMaker-Datenbank
Diese Übergeben wir dem WebViewer in Form:
"?"&"LastName=" & KONTAKT.T_Last_Name & "&" &"Price="&Preis_Heidel_Uebertragung&"&" & "Street=" & KONTAKT.T_Adress & "&" &
"Zip=" & KONTAKT.Z_ZIP & "&" & "Stadt=" & KONTAKT.T_City & "&" & "Land=" & KONTAKT.T_Country & "&" & "Mail=" & KONTAKT.T_EMail & "&" & "Buchung=" & INVOICE.BUCHUNG.Nr_1_2 & "&" & "FirstName=" & KONTAKT.T_First_Name&"&" & "Code=" & KONTAKT.SICHERHEIT.CODE
Wobei sich die URL noch aus einem Feld mit dem Inhalt der URL zum PHP-Script auf unserem Server zusammensetzt:
URL.Parameter= "http://www……………………com/Semicon2012/request.php"
Das Feld ACCOUNT.USER.Parameter besteht aus dem Inhalt "?"&"LastName=" & KONTAKT.T_Last_Name & "&" &"Price="&Preis_Heidel_Uebertragung&"&" & "Street=" & KONTAKT.T_Adress & "&" &
"Zip=" & KONTAKT.Z_ZIP & "&" & "Stadt=" & KONTAKT.T_City & "&" & "Land=" & KONTAKT.T_Country & "&" & "Mail=" & KONTAKT.T_EMail & "&" & "Buchung=" & INVOICE.BUCHUNG.Nr_1_2 & "&" & "FirstName=" & KONTAKT.T_First_Name&"&" & "Code=" & KONTAKT.SICHERHEIT.CODE
Beide Felder URL.Parameter&ACCOUNT.USER.Parameter ergeben dann die URL mit den zu übergebenden Parametern an das PHP-Script auf dem Webserver.
Teil 2 in wenigen Tagen
Dienstag, 1. Mai 2012
PDF-Erzeugung per IWP
Jeder der eine Datenbank im Web über IWP freigibt, kommt irgendwann an einen Punkt wo er die Entscheidung IWP zu verwenden bereut.
Nun ich erreichte den Punkt als es darum ging Dateien zu exportieren, oder nur eine PDF zu erzeugen. Viele Script-Schritte funktionieren über IWP nicht. Kein als Excel-Speichern, kein Datensätze als PDF speichern.
Was also tun wenn man z.B. Teilnehmer über IWP erfassen möchte und Diese im Anschluss eine Anmeldebestätigung erhalten sollen?
Die Antwort habe ich im FileMaker-Forum erhalten. Einfach einen Client auf dem Server mitlaufen lassen. Einen Client auf dem Server laufen lassen?
Was steckt dahinter. Nun der Client übernimmt die Aufgaben die der Server nicht kann. Also speichern, exportieren oder gar importieren von Dateien. Alles was eine Client im Netzwerk kann, geht mit diesem Ansatz.
Wie aber sage ich nun dem Client was zu tun ist? Über gesetzte Feldwerte. Die Funktion Feldwert setzen geht auch über IWP basierte Webseiten. Das bedeutet z.B. wenn die Anmeldung eines Teilnehmers durchlaufen ist, wird über ein Script der Feldwert „FLAG.MAIL.Anmeldung_1“ auf den Wert 1 gesetzt.
Jetzt beginnt die Arbeit des Clients. Über ein „BeiTimer-Script“ setzen überprüft der Client regelmäßig ob der Feldwert „FLAG.MAIL.Anmeldung_1“ den Wert 1 enthält. Tut er dies, wird einfach ein Script zu Versenden einer EMail angestossen. Um nun nicht im Minutentakt immer wieder eine Mail an den Teilnehmer zu versenden gibt es noch ein zweites Statusfeld. Dieses erhält nach Versendung der Mail den Status 1. Ist der Wert dieses Feldes auf 1, wird keine Mail versendet.
Auf diese Weise kann ich alle Funktionen die ein Client beherrscht auch über den Server ansteuern.
Montag, 20. Februar 2012
Datenimport und Export im IWP
Seit einigen Wochen stecke ich einem Projekt bei dem die Dateneingabe über ein Web Front-End erfolgen wird. Da der Kunde die meisten Einstellungen selbständig durchführen möchte und ein jedes Datenfeld seine Bedeutung ändern wird, erschien mir IWP als die richtige Lösung für die Darstellung der Webseiten. Kein DreamWeaver oder anderer Editor wird im Nachgang bei Änderungen im Layout benötigt.
Was ist aber mit dem Import und Export von Datensätzen. Bei der Nutzung des IWP geht mit den Bordmitteln von FileMaker nichts. Kein Import oder speichern. Nach einigen Recherchen im Netz bin ich auf die Seite des Herrn Cristian Stüben geraten.
Nun ist es möglich Daten zu exportieren und zu importieren.