• Dezember 3, 2012
  • 3 views

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:

  1. Webserbver ISS oder Apache
  2. Zahlungs-Dienstleister wie z.B. Heidelpay
  3. FileMaker Datenbank
  4. 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