Änderungen

Wechseln zu: Navigation, Suche

Zahlungs-Gateways erstellen

3.717 Byte hinzugefügt, 11:09, 5. Okt. 2018
Im Ordner '''modules/payment''' liegen alle Zahlungs-Gateways. Jedes Zahlungsgateway hat dort einen Ordner mit einem Namen für dieses (nur Kleinbuchstaben; natürlich können Abkürzungen verwaltet werden). Dieser kurze Name wird im Folgenden als ''Kurzname'' bezeichnet.
In einem Ordner eines Gateways wiederum muss sich eine Datei mit dem Kurznamen des Gateways und der Endung ''.php'' befinden. Diese Datei stellt die Hauptdatei des Gateways dar. Außerdem muss ein Ordner ''language'' für den Support mehrerer Sprachen existieren, wenn Sie mehrere Sprachen unterstützen möchten. Für [[Smarty]]-Templates kann zum Beispiel ein seperater separater Ordner ''templates'' angelegt werden.
== Aufbau der Hauptdatei ==
</source>
Für jede Gateway-Klasse sollte ein eigener Konstruktor geschrieben werden. Dieser muss den Konstruktor von ''PaymentGateway'' (der Oberklasse) aufrufen und sollte die aktuelle Sprache festsetzen. Außerdem müssen die Sprachdateien geladen werden. Wir lernen hier den Ausnahmen-Typ ''ModuleException'' kennen. Ein Wurf einer solchen Ausnahme wird das Modul nicht laden , sondern ignorieren.
<source lang="php">
== getPaymentHandler() ==
..Diese Methode kann definieren, welcher Code ausgeführt werden soll, wenn die URL <code>SOURCEDESK_URL/credit/pay/GATEWAY_NAME</code> aufgerufen wird.
== makeCashboxPayment($hash) ==
..Diese Methode startet den Zahlungsvorgang für eine Cashbox-Zahlung mit dem Hash ''$hash''.
== getIpnHandler() ==
..Diese Methode wird aufgerufen, wenn die URL <code>SOURCEDESK_URL/ipn/GATEWAY_NAME</code> aufgerufen wird.
== Gebühren ==
Es ist dem Administrator für jedes Gateway individuell möglich, Gebühren einzustellen.Diese kann er sowohl prozentual als auch fix angeben (natürlich auch beides gleichzeitig).Bei einer Einstellung beider Gebühren-Typen für ein Gateway wird zuerst der prozentuale Wert gebildet und dann von diesem der fixe.Außerdem ist es möglich einzustellen, ob der vom Kunden eingegebene Betrag inklusive oder exklusive Gebühren sein soll. Für die Gebührenrechnung gibt es zwei Methoden, der innerhalb der Klasse verfügbar sind. Die erste Methode ist ''addFees'', sie erwartet zwei Parameter. Der erste beinhaltet den Betrag ohne Gebühren, der zweite ist ein Boolean (true/false) und gibt an, ob der Betrag noch konvertiert werden muss. Für die Konvertierung wird die aktuell eingestellte Währung angenommen und der Betrag dann in die Basiswährung konvertiert. Außerdem vorhanden ist die Methode ''deductFees'', sie erwartet nur einen Parameter, nämlich den Betrag. Eine automatische Konvertierung kann hier nicht erfolgen. Für die Anzeige der Gebühren sollte am besten zum Beispiel an das Ende des Zahlungs-Buttons eine entsprechende Information angehangen werden. Diese ist standardmäßig wie folgt realisiert: <source lang="php">$fees = $addon = "";if($this->settings['excl'] == 1) $addon = "_EXCL";if($this->settings['fix'] != 0 && $this->settings['percent'] != 0) $fees = " " . str_replace(Array("%p", "%a"), Array($nfo->format($this->settings['percent'], 2, true), $cur->infix($nfo->format($cur->convertAmount(null, $this->settings['fix']), 2))), $lang['CREDIT']['FEES_BOTH' . $addon]);else if($this->settings['fix'] != 0) $fees = " " . str_replace(Array("%p", "%a"), Array($nfo->format($this->settings['percent'], 2, true), $cur->infix($nfo->format($cur->convertAmount(null, $this->settings['fix']), 2))), $lang['CREDIT']['FEES_FIX' . $addon]);else if($this->settings['percent'] != 0) $fees = " " . str_replace(Array("%p", "%a"), Array($nfo->format($this->settings['percent'], 2, true), $cur->infix($nfo->format($cur->convertAmount(null, $this->settings['fix']), 2))), $lang['CREDIT']['FEES_PERCENT' . $addon]);</source> Es ist übrigens beispielsweise in der Methode ''getPaymentForm()'' auch sehr einfach, den Betrag clientseitig um die Gebühren zu erhöhen. Hierfür ein kleiner Ausschnitt JavaScript: <source lang="javascript">paypalFeesAdded = 0;paypalFeesAdded = 0;function addPayPalFees() { <?php if($this->settings['excl'] == 1){ ?> if(!paypalFeesAdded){ var percent = <?=$this->settings['percent']; ?>; var fix = Number(<?=$cur->convertAmount(null, $this->settings['fix']); ?>); var value = Number(document.getElementById("paypal_amount").value.replace(',', '.'));  value += Math.ceil(value * percent) / 100; value += fix; value = String(value); document.getElementById("paypal_amount").value = value<?=$CFG['NUMBER_FORMAT'] == "de" ? ".replace('.', ',')" : ""; ?>; paypalFeesAdded = 1; } <?php } ?>}</source> Dafür muss das Betrags-Feld natürlich die ID ''paypal_amount'' haben und der Zahlungs-Button als onClick-Handler ''addPayPalFees()''. Mit einer Zeile Code im Konstruktor kann das Gebührensystem übrigens für dieses Gateway deaktiviert werden: <source lang="php">$this->no_fees = true;</source>
== Zahlungs-Log ==
Als ''$data'' verwenden Sie am besten die eingegeben Rohdaten, indem Sie zum Beispiel ''$_POST'' dumpen. Achten Sie hierbei unbedingt auf die Entfernung langer oder unnötiger Werte, um das Zahlungs-Log im Adminbereich nicht zu sprengen. Für ''$log'' ist normalerweise ein eigener String vorgesehen, der die Aktionen des IPN-Handlers beschreibt. (Zeilenumbruch durch \n) Es eignet sich hierfür eine try-catch-Struktur.
 
== Cashbox ==
...
 
== Sprachsystem ==
...
== Weiteres ==
$this->admin_warning = "Warntext";
</source>
 
== Beispiel-Integrationen ==
Sie finden Beispiel-Integrationen in ''modules/gateways/''.