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.
Sonntag, 30. Dezember 2012
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.
Montag, 6. Februar 2012
Nachtrag Synchronisation mit FileMaker Go
Ich hatte ja schon vor einiger Zeit über die Möglichkeit einer Synchronisation zwischen FileMaker und FileMaker Go ohne Plugin oder andere Hilfemittel berichtet. Nun kam die Frage auf, wie speichere ich in den Importeinstellungen die Einstellung „Vorhandene Datensätze in der Ergebnismenge aktualisieren“ ?
Ganz einfach. Wir müssen noch auf dem Desktoprechner eine Synchronisation bzw. einen Import durchführen. Im Zweifelsfall auch mit Dummy-Daten. Anschliessend nochmals das Import-Script bearbeiten und die Einstellung wie gezeigt setzen.
Nun sollten veränderte Datensätze nur geändert und nicht als neue Datensätze Hinzugefügt werden.
Donnerstag, 12. Januar 2012
Mittwoch, 11. Januar 2012
Clipboard Explorer
Nun nachdem das Jahr schon ein paar Tage alt ist, habe ich mir die Zeit genommen und das Tool „Clipboard Explorer“ getestet. Leider verbietet mir mein derzeitiges Arbeitspensum einen intensiveren Test. Aber schon vorweg, das Tool kostet nichts und bietet alles um Layout-Elemente aus FileMaker in XML-Form zu erhalten. Der umgekehrte Weg funktioniert natürlich auch. Die Funktionalität erinnert mich stark an das „PasteBoard“ vom Entwickler Stefan Husch und Dipl.-Ing. Bernhard Schulz . Leider wird dieses Plugin nicht mehr weiterentwickelt. Es war relativ einfach gehalten, die kopierten Layout-Elemente oder Scripte landeten in einem FileMaker-Feld und wurden auch innerhalb von FileMaker verwaltet. Das Prinzip von Clipboard Explorer ist ähnlich und ohne großen Lernaufwand anzuwenden. Also wer richtig im FileMaker-Code wühlen möchte sollte das Plugin antesten.