Der Bereich Shopware Labs ist die Plattform für alle Entwickler. Hier findet man technische Dokumentationen und zahlreiche Tipps und Tricks rund um das Thema Programmieren. In dieser Rubrik stellen außerdem die Entwickler der shopware AG neue und experimentelle Lösungsansätze vor. Neue Funktionen, die in dieser Rubrik bereitgestellt werden, sind teilweise auch für zukünftige Releases geplant. Die Funktionen können dann ohne Programmierkenntnisse zukünftig direkt im Shopware Backend konfiguriert werden oder werden über Plugins bereitgestellt. Informationen über neue, geplante Funktionen finden Sie in unserer Roadmap.
Bitte beachten Sie, dass die hier bereitgestellten Lösungsansätze nicht offiziell supportet werden und nur eingebaut werden sollten, sofern Sie über das entsprechende, technische Wissen verfügen.
Tutorial: Programmierung einer ePayment-Schnittstelle
1 Kommentare| ab Version: | 3.0 |
Inhaltsverzeichnis
Vorbeitungen:
Öffnen Sie PHPMyAdmin und wechseln Sie in die Datenbank s_core_paymentmeans.
Klicken Sie auf "Einfügen" oder "Insert" und fügen Sie die für Sofort-Überweisung notwendingen Daten ein.
Erklärung:
Feld-Name: Geben Sie hier einen systeminternen Namen für die Zahlungsart ein (Bitte keine Sonderzeichen verwenden)
Feld-Description: Geben Sie hier die Bezeichnung der Zahlungsart ein
Feld-Template: Hier hinterlegen Sie, wie das Template der Zahlungsart heißt, welches bei der Auswahl der Zahlungsarten in der Storefront erscheint. Die Templates der Zahlungsarten liegen im Ordner /html/payment/
Feld-Class: Geben Sie hier den Namen der Klasse ein, die die Storefront-Funktionalität der Zahlungsart definiert. Die Klassen liegen im Ordner /engine/core/paymentmeans/
Feld-esdactive: Hier definieren Sie ob eine Zahlungsart für Download-Artikel freigegeben ist oder nicht
Feld-embediframe: WICHTIG: Geben Sie hier bitte den relativen Pfad zu der Datei an, die auf der Bestellabschlussseite im Payment-iFrame angezeigt werden soll.
Anlegen des Templates für die Auswahl der Zahlungsart
Erstellen Sie eine neue Datei /html/payment/sofortueberweisung.tpl
Fügen Sie folgenden Inhalt ein:
{if $_GET.sTarget}
<input name="sTarget" type="hidden" value="sale" />
{/if}
<div class="paypoint">
<input class="radio" name="sPayment" id="cash" value="{$sPayment.id}" type="radio" {if $sChoosenPayment==$sPayment.id OR (!$sChoosenPayment AND $sConfig.sDEFAULTPAYMENT==$sPayment.id)}checked{/if} />
<label class="paylabel" for="cash">{$sPayment.description}</label> {if $sChoosenPayment==$sPayment.id}<span class="enabled">Aktuell ausgewählt</span>{/if}
<p class="paydescr">
{$sPayment.additionaldescription}
</p>
</div>
Anlegen der PHP-Klasse für die Zahlungsart:
Erstellen Sie eine neue Datei /engine/core/class/paymentmeans/sofortueberweisung.php
Fügen Sie folgenden Inhalt ein
<?
class sPaymentMean{
var $sSYSTEM;
function sInit(){
return array();
}
}
?>
Implementierung der Backend-Administration
Die folgenden Schritte sind notwendig, damit die Konfiguration der Schnittstelle direkt aus dem Shopware-Backend heraus möglich ist.
Öffnen Sie PHPMyAdmin
Fügen Sie mit folgendem Befehl eine neue Konfigurationsgruppe hinzu:
INSERT INTO `s_core_config_groups` ( `id` , `name` , `position` , `parent` , `file` , `description` ) VALUES ( NULL , 'Sofortüberweisung', '0', '17', '', 'Hilfreiche Informationen zur Einrichtung von Sofortüberweisung erhalten Sie unter ...' );
Damit wird ein neuer Menüpunkt unter Einstellungen -> Schnittstellen mit der Bezeichnung "Sofortüberweisung" angelegt.
Fügen Sie jetzt die verschiedenen Konfigurationsoptionen hinzu:
INSERT INTO `s_core_config` ( `id` , `group` , `name` , `value` , `description` , `required` , `warning` , `detailtext` , `multilanguage` ) VALUES ( NULL , '66', 'sSOFORTUSERID', '', 'User-ID', '', '', '', '' ); INSERT INTO `s_core_config` ( `id` , `group` , `name` , `value` , `description` , `required` , `warning` , `detailtext` , `multilanguage` ) VALUES ( NULL , '66', 'sSOFORTSECRETKEY', '', 'Sicherheitsschlüssel', '', '', '', '' ); INSERT INTO `s_core_config` ( `id` , `group` , `name` , `value` , `description` , `required` , `warning` , `detailtext` , `multilanguage` ) VALUES ( NULL , '66', 'sSOFORTPROJECTID', '', 'Projekt-ID', '', '', '', '' );
Damit werden 3 Konfigurationsoptionen User-ID, Sicherheitsschlüssel und Projekt-ID definiert, so dass diese anschließend durch den End-Benutzer einfach im Backend verwaltet werden können.
Der Einstellungsdialog sollte anschließend wie folgt aussehen.
Programmierung der eigentlichen Schnittstelle
Die Schnittstelle wird auf der Bestellabschlussseite in einem iFrame inkludiert. Die URL dazu wird in der Spalte "embediframe" in s_core_paymentmeans definiert.
In diesem Fall haben wir die URL
../../.../../../../../engine/connectors/sofort/form.php angegeben.
Wechseln Sie bitte in den Ordner /engine/connectors/ und legen Sie einen neuen Ordner "sofort" an.
Fügen Sie folgenden Inhalt ein:
<? if (!$path){ $path = "../../"; } include($path."payment.class.php"); class sofortPayment extends sPayment { /** * Projekt-Daten */ var $user_id = ""; var $secretKey = ""; var $projectID = ""; var $gateway = ""; // Benötigte Parameter var $neededArguments = array("param_sCoreId"); var $arguments = array("coreID"=>"param_sCoreId","dispatchID"=>"param_dispatchID","transactionID"=>"transaction","comment"=>"sComment"); function __construct($debug,$path,$startSession=true){ parent::__construct($debug,$path,$startSession); // Set configuration $this->user_id = $this->config["sSOFORTUSERID"]; $this->secretKey = $this->config["sSOFORTSECRETKEY"]; $this->projectID = $this->config["sSOFORTPROJECTID"]; } function sViewportSale(){ // Doing something after / while submitting order } function initPayment(){ parent::initPayment(); } } ?>
Erklärung:
Zur Vereinfachung der Einbindung von Zahlungssystemen stellt Shopware eine Payment-Standard-Klasse zur Verfügung, die bereits alle wesentlichen Funktionalitäten für die Anbindung von Zahlungsdienstleistern bereitstellt. Dadurch ist ein standardkonformer Zugriff auf die Benutzerdaten und Bestellinhalte möglich.
Bereitgestellte Methoden und Eigenschaften der Klasse "sPayment"
/engine/connectors/payment.class.php
Methoden
__construct ($debugMailAdresse,relativer Pfad zur Einbindung der Systemklassen, Session initialisieren = true)
Bei Erstellung einer neuen Instanz der Klasse wird automatisch eine Datenbank-Verbindung hergestellt.
Außerdem wird die Session initialisiert, das Setup der Schnittstelle geprüft, die Shop-Konfiguration geladen und die verschiedenen benötigten Klassen inkludiert.
catchErrors() void
Aktiviert den integrierten Error-Handler, dadurch werden alle auftretenden PHP-Fehler per eMail an die im Konstruktur definierte eMail-Adresse geschickt
checkSetup()
Lädt die Shopware ? Systemklassen und stellt das sSYSTEM Basisobjekt bereit.
Außerdem wird die Schnittstelle auf Vollständigkeit geprüft.
Hierzu können Sie über das Array ?Files? und das Array ?Configuration? alle benötigten Dateien und Datenbank-Einträge definieren, auf die die Schnittstelle zurückgreift.
initSession()
Startet das adoDB Session-Management
throughError($msg,$hold=true)
Gibt eine Fehlermeldung aus, die falls der Debug-Modus aktiviert ist, automatisch auch per eMail versendet wird.
Falls der Parameter $hold nicht auf false gesetzt wird, bricht die Schnittstelle an dieser Stelle ab.
formatAmountCent($amount)
Formatiert den Gesamtbetrag der Bestellung als Euro-Cent Angabe
getAmount()
Gibt den Gesamtbestellwert zurück
getBasket()
Gibt den gesamten Warenkorb des Kunden zurück
initPayment()
Wichtig für das Notify-Script.Überprüft ob alle in ?neededArguments? definierten Parameter übergeben wurden und ob der Aufruf von einer in ?gatewayIps? definierten IP erfolgt ist.
InitUser();
Liest die Benutzerdaten aus und stellt diese im Array ?userData? bereit.
submitOrder
Führt die Bestellung aus (Aufruf normalerweise im Notify-Script, wenn die Zahlung erfolgreich ausgeführt wurde)
Legen Sie eine neue Datei form.php in /engine/connectors/sofort/ an
Inhalt:
<? $path = "../"; include("sofort.class.php"); $payment = new sofortPayment("/dev/null","../"); $payment->initUser(); $choosenPaymentMean = $payment->sUser["additional"]["payment"]["name"]; $userData = $payment->sUser; ?> <form method="POST" action="dopayment.php"> <input type="hidden" name="sCoreId" value="<?= $_REQUEST["sCoreId"] ?>"> <? if (!$payment->config["sIGNOREAGB"]){ ?> <input type="checkbox" value="1" name="sAGB">Hiermit akzeptiere ich die Shop-AGB <? } ?> <input type="submit" value="Weiter zur Zahlung"> </form>
Erklärung:
Es wird die gerade erstellte Payment-Klasse geladen, die alle weiteren Bestellinformationen bereitstellt.
$payment = new sofortPayment("/dev/null","../");
Hier wird eine neue Instanz der Klasse erstellt. Der erste Parameter kann durch eine Mailadresse ersetzt weden, Sie erhalten dann Debug-Informationen der Schnittstelle per Mail. Der zweite Parameter ist die relative Pfad-Angabe zur Standard-Payment-Klasse(Ausgehend vom Pfad in dem die Datei liegt, die die Klasse inkludiert)
$payment->initUser();
Lädt die gesamten Kundendaten, diese können anschließend über $payment->userData ausgelesen werden.
Erster Test
Bitte registrieren Sie sich im Shop und wählen Sie als Zahlungsart "Sofortüberweisung" aus - legen Sie anschließend ein Produkt in den Warenkorb und wechseln Sie auf die Kassenseite. Das iFrame sollte nun die gerade angelegte "form.php" laden und wie folgt aussehen:
Dieses erste Formular verweist auf ein Gateway-Script welches die eigentliche Zahlung initiiert. Dabei werden diverse Zahlungsparameter an den Zahlungsdienstleister übergeben.
Im nächsten Step wird also das Gateway-Script erstellt, welches die Bestellinformationen passend aufbereitet und die Weiterleitung zum Zahlungsanbieter durchführt.
Legen Sie bitte eine neue Datei /engine/connectors/sofort/dopayment.php an.
Inhalt:
<? $path = "../"; // Rel. Pfad zur Payment-Klasse include("sofort.class.php"); // Standard-Payment-Klasse laden /* Neue Instanz der Klasse erzeugen. Parameter - 1 : Hier können Sie eine Mailadresse angeben, an die mögliche Debug-Meldungen geschickt werden Parameter - 2 : Der relative Pfad zur Payment-Klasse */ $payment = new sofortPayment("/dev/null","../"); /* Lädt alle verfügaren User-Daten, diese stehen anschließend im array payment->sUser bereit */ $payment->initUser(); /* Enthält den Namen der Zahlungsart, die der Kunde aktuell gewählt hat */ $choosenPaymentMean = $payment->sUser["additional"]["payment"]["name"]; $userData = $payment->sUser; // Prüfen ob AGBs akzeptiert wurden if (!$_POST["sAGB"] && $payment->config['sIGNOREAGB']!="1"){ echo "Bitte akzeptieren Sie unsere AGB <a href="javascript:history.back();">zurück</a>"; exit; } /* Ermittelt den aktuellen Bestellwert */ $value = $payment->getAmount(); /* Abfrage des Warenkorbs */ $basket = $payment->getBasket(); /* Falls Warenkorb leer oder Bestellwert = 0 => Abbruch der Zahlung */ if (!$basket["content"][0] || $value<=0){ echo "Die Bestellung wurde bereits abgeschickt <a href="javascript:history.back();">zurück</a>"; exit; } /* Bestellwert formatieren */ $value = $betrag = number_format($value, 2, '.',''); /* Projektdaten setzen */ $user_id = $payment->user_id; $project_id = $payment->projectID; $securitykey = $payment->secretKey; $bookingId = substr(md5(uniqid(rand())),0,10); /* Überweisungsbetreff generieren */ $userData = $payment->sUser; $zweck1 = $userData["billingaddress"]["customernumber"]."-".$userData["billingaddress"]["firstname"]." ".$userData["billingaddress"]["lastname"]; $zweck1 = preg_replace("/[^a-zA-Z0-9 -]/","",$zweck1); $zweck2 = $bookingId; $dispatchID = $payment->sSYSTEM->_SESSION["sDispatch"]; // SHOPWARE 2.0.4 /* Security-Hash generieren */ $data = array( $user_id, // user_id $project_id, // project_id '', // sender_holder '', // sender_account_number '', // sender_bank_code '', // sender_country_id" $value, // amount 'EUR', // currency_id $zweck1, // reason_1 $zweck2, // reason_2 session_id(), // user_variable_0 $bookingId, // user_variable_1 $dispatchID, // user_variable_2 '', // user_variable_3 '', // user_variable_4 '', // user_variable_5 $securitykey // project_password ); $data_implode = implode('|', $data); $hash = md5($data_implode); /* Weiterleitungs-URL generieren */ $url = "?user_id=".$user_id."&project_id=".$project_id."&amount=".$value."&reason_1=".$zweck1."&reason_2=".$zweck2."&user_variable_0=".session_id()."&user_variable_1=$bookingId&user_variable_2={$dispatchID}&hash=".$hash; //Weiterleitung zu Sofortüberweisung.de wenn alles ok header ("Location: https://www.sofortueberweisung.de/payment/start".$url); exit; ?>
Nach Abschluss der Bestellung wird seitens Sofortüberweisung ein Request ausgeführt, der Shopware mitteilt, dass die Bezahlung erfolgreich durchgeführt wurde.
Hierzu muss ein Notify-Script erstellt werden, welches die Daten von Sofortüberweisung entgegen nimmt un die Bestellung abschließt.
Legen Sie bitte die Datei /engine/connectors/sofort/notify.php mit folgendem Inhalt an
<? $debug = "sth@shopware2.de"; // Change to your mail-adress to receive debug-information $path = "../"; include("sofort.class.php"); $payment = new sofortPayment($debug,"../",false); $payment->catchErrors(); $payment->initUser(); $userData = $payment->sUser; $payment->initPayment(); $value = $payment->getAmount(); /* Abfrage des Warenkorbs */ $basket = $payment->getBasket(); /* Bestellwert formatieren */ $value = $betrag = number_format($value, 2, '.',''); if ($value!=$_REQUEST["amount"]){ $payment->throughError("Überwiesener Betrag stimmt nicht mit Bestellwert überein: Bestellwert laut Shopware:$valuen Bestellwert laut Transaktionn:{$_REQUEST["amount"]}n"); }else { $ordernumber = $payment->submitOrder("sale","../../core/class/viewports/","sViewportSale",12); } ?>
Dieses Script führt nach Überprüfung der übermittelten Parameter die Bestellung aus.
Einstellungen im Backend von Sofortüberweisung.de
Link: "[[Einrichtung Sofortüberweisung.de]]"
Artikel-PDF erstellen
Artikel bewerten
Kommentare:
ePayment - 12. December 2010 - 12:20 Uhr
Von: Walter Lussi
Sehr aufwendig.
Artikel kommentieren
Weitere interessante Artikel:
Bestell-Nr.: 33915_
Lieferzeit ca. 5 Tage
Preise inkl. gesetzlicher
MwSt. zzgl. Versandkosten*
Preise inkl. gesetzlicher
MwSt. + Versandkosten*
Kategorien: