Heim  >  Artikel  >  Backend-Entwicklung  >  Entwerfen personalisierter Zahlungsoptionen in OpenCart: Teil 3

Entwerfen personalisierter Zahlungsoptionen in OpenCart: Teil 3

王林
王林Original
2023-09-03 10:41:07841Durchsuche

Wenn Sie diese Serie verfolgt haben, sollten Sie mit der Art der Dateistruktur vertraut sein, die wir im Backend für benutzerdefinierte Zahlungsmethoden eingerichtet haben. Wenn Sie die vorherigen Teile dieser Serie noch nicht gelesen haben, empfehle ich Ihnen dringend, sie zu lesen, bevor Sie mit dieser Serie fortfahren.

Wir werden ein ähnliches Datei-Setup auch für den Frontend-Teil verwenden.

Controller-Einstellungen

Weiter und rein catalog/controller/ payment/custom.php 创建控制器文件。将以下内容粘贴到新创建的控制器文件 custom.php.

<?php
class ControllerPaymentCustom extends Controller {
  protected function index() {
    $this->language->load('payment/custom');
    $this->data['button_confirm'] = $this->language->get('button_confirm');
    $this->data['action'] = 'https://yourpaymentgatewayurl';
 
    $this->load->model('checkout/order');
    $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
 
    if ($order_info) {
      $this->data['text_config_one'] = trim($this->config->get('text_config_one')); 
      $this->data['text_config_two'] = trim($this->config->get('text_config_two')); 
      $this->data['orderid'] = date('His') . $this->session->data['order_id'];
      $this->data['callbackurl'] = $this->url->link('payment/custom/callback');
      $this->data['orderdate'] = date('YmdHis');
      $this->data['currency'] = $order_info['currency_code'];
      $this->data['orderamount'] = $this->currency->format($order_info['total'], $this->data['currency'] , false, false);
      $this->data['billemail'] = $order_info['email'];
      $this->data['billphone'] = html_entity_decode($order_info['telephone'], ENT_QUOTES, 'UTF-8');
      $this->data['billaddress'] = html_entity_decode($order_info['payment_address_1'], ENT_QUOTES, 'UTF-8');
      $this->data['billcountry'] = html_entity_decode($order_info['payment_iso_code_2'], ENT_QUOTES, 'UTF-8');
      $this->data['billprovince'] = html_entity_decode($order_info['payment_zone'], ENT_QUOTES, 'UTF-8');;
      $this->data['billcity'] = html_entity_decode($order_info['payment_city'], ENT_QUOTES, 'UTF-8');
      $this->data['billpost'] = html_entity_decode($order_info['payment_postcode'], ENT_QUOTES, 'UTF-8');
      $this->data['deliveryname'] = html_entity_decode($order_info['shipping_firstname'] . $order_info['shipping_lastname'], ENT_QUOTES, 'UTF-8');
      $this->data['deliveryaddress'] = html_entity_decode($order_info['shipping_address_1'], ENT_QUOTES, 'UTF-8');
      $this->data['deliverycity'] = html_entity_decode($order_info['shipping_city'], ENT_QUOTES, 'UTF-8');
      $this->data['deliverycountry'] = html_entity_decode($order_info['shipping_iso_code_2'], ENT_QUOTES, 'UTF-8');
      $this->data['deliveryprovince'] = html_entity_decode($order_info['shipping_zone'], ENT_QUOTES, 'UTF-8');
      $this->data['deliveryemail'] = $order_info['email'];
      $this->data['deliveryphone'] = html_entity_decode($order_info['telephone'], ENT_QUOTES, 'UTF-8');
      $this->data['deliverypost'] = html_entity_decode($order_info['shipping_postcode'], ENT_QUOTES, 'UTF-8');
 
      if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/custom.tpl')){
        $this->template = $this->config->get('config_template') . '/template/payment/custom.tpl';
      } else {
        $this->template = 'default/template/payment/custom.tpl';
      }
 
      $this->render();
    }
  }
 
  public function callback() {
    if (isset($this->request->post['orderid'])) {
      $order_id = trim(substr(($this->request->post['orderid']), 6));
    } else {
      die('Illegal Access');
    }
 
    $this->load->model('checkout/order');
    $order_info = $this->model_checkout_order->getOrder($order_id);
 
    if ($order_info) {
      $data = array_merge($this->request->post,$this->request->get);
 
      //payment was made successfully
      if ($data['status'] == 'Y' || $data['status'] == 'y') {
        // update the order status accordingly
      }
    }
  }
}
?>

Wie Sie sehen, gibt es zwei verschiedene Methoden. Die index 方法将负责在表单提交到第三方支付网关时设置数据,而 callback-Methode wird verwendet, um die Antwortdaten vom Zahlungsgateway eines Drittanbieters zu verarbeiten. Allerdings können Sie weitere Methoden definieren, wenn Ihr Zahlungsgateway dies erfordert. In diesem Beispiel halten wir den Prozess so einfach wie möglich.

Lassen Sie uns jeden Teil im Detail kennenlernen. Wir beginnen mit der index-Methode.

Zuerst haben wir die Sprachdatei geladen und den Wert der Schaltfläche Bestätigen festgelegt. Wir legen auch das Attribut action fest, das vom Zahlungsübermittlungsformular verwendet wird. Sie sollten diese Einstellung entsprechend Ihrem Zahlungsgateway ändern.

$this->language->load('payment/custom');
$this->data['button_confirm'] = $this->language->get('button_confirm');
$this->data['action'] = 'https://yourpaymentgatewayurl';

Als nächstes laden wir die Bestellinformationen aus der aktiven Sitzung des Benutzers.

$this->load->model('checkout/order');
$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);

Wenn die Bestellinformationen verfügbar sind, legen wir die Daten der versteckten Variablen fest, die zum Senden des Formulars an die Zahlungs-Gateway-URL verwendet werden. Wenn Sie sich den Code genau ansehen, werden Sie feststellen, dass wir auch benutzerdefinierte Parameter text_config_onetext_config_two verwenden, die wir im vorherigen Teil dieser Serie im Admin-Konfigurationsformular festgelegt haben.

Eine weitere wichtige Variable, die hier zu beachten ist, ist die callbackurl,它保存支付网关在付款过程后将用户重定向回我们商店所使用的 URL。是的,查看 URL payment/custom/callback 应表明它将调用 callback-Methode, wie wir an dieser Stelle sehen werden.

$this->data['text_config_one'] = trim($this->config->get('text_config_one')); 
$this->data['text_config_two'] = trim($this->config->get('text_config_two')); 
$this->data['orderid'] = date('His') . $this->session->data['order_id'];
$this->data['callbackurl'] = $this->url->link('payment/custom/callback');
$this->data['orderdate'] = date('YmdHis');
$this->data['currency'] = $order_info['currency_code'];
$this->data['orderamount'] = $this->currency->format($order_info['total'], $this->data['currency'] , false, false);
$this->data['billemail'] = $order_info['email'];
$this->data['billphone'] = html_entity_decode($order_info['telephone'], ENT_QUOTES, 'UTF-8');
$this->data['billaddress'] = html_entity_decode($order_info['payment_address_1'], ENT_QUOTES, 'UTF-8');
$this->data['billcountry'] = html_entity_decode($order_info['payment_iso_code_2'], ENT_QUOTES, 'UTF-8');
$this->data['billprovince'] = html_entity_decode($order_info['payment_zone'], ENT_QUOTES, 'UTF-8');;
$this->data['billcity'] = html_entity_decode($order_info['payment_city'], ENT_QUOTES, 'UTF-8');
$this->data['billpost'] = html_entity_decode($order_info['payment_postcode'], ENT_QUOTES, 'UTF-8');
$this->data['deliveryname'] = html_entity_decode($order_info['shipping_firstname'] . $order_info['shipping_lastname'], ENT_QUOTES, 'UTF-8');
$this->data['deliveryaddress'] = html_entity_decode($order_info['shipping_address_1'], ENT_QUOTES, 'UTF-8');
$this->data['deliverycity'] = html_entity_decode($order_info['shipping_city'], ENT_QUOTES, 'UTF-8');
$this->data['deliverycountry'] = html_entity_decode($order_info['shipping_iso_code_2'], ENT_QUOTES, 'UTF-8');
$this->data['deliveryprovince'] = html_entity_decode($order_info['shipping_zone'], ENT_QUOTES, 'UTF-8');
$this->data['deliveryemail'] = $order_info['email'];
$this->data['deliveryphone'] = html_entity_decode($order_info['telephone'], ENT_QUOTES, 'UTF-8');
$this->data['deliverypost'] = html_entity_decode($order_info['shipping_postcode'], ENT_QUOTES, 'UTF-8');

Abschließend weisen wir die benutzerdefinierte Vorlagendatei zu custom.tpl und rendern die Ansicht.

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/custom.tpl')){
  $this->template = $this->config->get('config_template') . '/template/payment/custom.tpl';
} else {
  $this->template = 'default/template/payment/custom.tpl';
}

$this->render();

Sehen wir uns den Code der callback-Methode an. Diese Methode wird aufgerufen, wenn der Benutzer von der Zahlungs-Gateway-Site zum Geschäft zurückkehrt.

Zunächst prüfen wir, ob die Variable orderid verfügbar ist, bevor wir fortfahren. Sollte diese nicht vorliegen, werden wir die weitere Verarbeitung einstellen.

if (isset($this->request->post['orderid'])) {
  $order_id = trim(substr(($this->request->post['orderid']), 6));
} else {
  die('Illegal Access');
}

Als nächstes laden wir die Bestellinformationen aus der Datenbank. Abschließend prüfen wir, ob in der Antwort des Zahlungsgateways ein success-Indikator enthalten ist. Wenn dies der Fall ist, werden wir die Informationen zum Bestellstatus weiterhin entsprechend aktualisieren.

$this->load->model('checkout/order');
$order_info = $this->model_checkout_order->getOrder($order_id);
 
if ($order_info) {
  $data = array_merge($this->request->post,$this->request->get);
 
  //payment was made succ
  if ($data['status'] == 'Y' || $data['status'] == 'y') {
    // update the order status accordingly
  }
}

Das sind die Controller-Einstellungen. Ziemlich einfach, nicht wahr?

Traditionelles Modell

Wie Sie wahrscheinlich wissen, verfügt OpenCart über eigene Konventionen und Standards für die Handhabung der Innenabläufe Ihres Shops. Dies ist bei der Modelleinrichtung zur Zahlungsartenerkennung der Fall. Sie richten es einfach entsprechend der Konvention ein und es wird automatisch abgeholt.

Weiter und rein catalog/model/ payment/custom.php 创建模型文件。将以下内容粘贴到新创建的模型文件 custom.php.

<?php
class ModelPaymentCustom extends Model {
  public function getMethod($address, $total) {
    $this->load->language('payment/custom');
 
    $method_data = array(
      'code'     => 'custom',
      'title'    => $this->language->get('text_title'),
      'sort_order' => $this->config->get('custom_sort_order')
    );
 
    return $method_data;
  }
}

OpenCart verwendet diese Klasse, wenn während des Bezahlvorgangs gültige Zahlungsmethoden aufgelistet werden. Dabei sammelt OpenCart eine Liste gültiger Zahlungsmethoden vom Backend und prüft für jede Methode, ob die entsprechende Modellklasse verfügbar ist. Zahlungsarten werden nur aufgeführt, wenn die zugehörige Modellklasse verfügbar ist.

Das Wichtigste in dieser Einstellung ist der Wert der Variablen code. In unserem Fall definieren wir es als custom. Das heißt, wenn Sie eine Zahlungsmethode auswählen und auf code 变量的值。在我们的例子中,我们将其定义为 custom,这意味着当您选择付款方式并按继续时,它将调用 payment/customWeiter

klicken, wird payment/custom aufgerufen Interne URL, die letztendlich das Formular für unser Zahlungsgateway einrichtet.

Kurz gesagt können wir sagen, dass es sich um eine obligatorische Datei für die Erkennung und ordnungsgemäße Funktion von Front-End-Zahlungsmethoden handelt.

Sprach- und Vorlagendateien

catalog/language/english/ payment/custom.php 创建语言文件。将以下内容粘贴到新创建的语言文件 custom.phpJetzt müssen wir nur noch die Sprache erstellen und die Dateien anzeigen. Machen Sie weiter und rein

.

<?php
$_['text_title'] = 'Custom Payment Method';
$_['button_confirm'] = 'Confirm Order';
?>

Ganz einfach zu verstehen: Wir haben lediglich die Tags eingerichtet, die beim Bezahlvorgang im Frontend verwendet werden.

catalog/view/theme/default/template/ payment/custom.tpl 创建模板文件。将以下内容粘贴到新创建的模板文件 custom.tplErstellen Sie die Vorlagendatei in catalog/view/theme/default/template/ payment/custom.tpl. Fügen Sie den folgenden Inhalt in die neu erstellte Vorlagendatei ein

.

<form action="<?php echo $action; ?>" method="post">
  <input type="hidden" name="text_config_one" value="<?php echo $text_config_one; ?>" />
  <input type="hidden" name="text_config_two" value="<?php echo $text_config_two; ?>" />
  <input type="hidden" name="orderid" value="<?php echo $orderid; ?>" />
  <input type="hidden" name="callbackurl" value="<?php echo $callbackurl; ?>" />
  <input type="hidden" name="orderdate" value="<?php echo $orderdate; ?>" />
  <input type="hidden" name="currency" value="<?php echo $currency; ?>" />
  <input type="hidden" name="orderamount" value="<?php echo $orderamount; ?>" />
  <input type="hidden" name="billemail" value="<?php echo $billemail; ?>" />
  <input type="hidden" name="billphone" value="<?php echo $billphone; ?>" />
  <input type="hidden" name="billaddress" value="<?php echo $billaddress; ?>" />
  <input type="hidden" name="billcountry" value="<?php echo $billcountry; ?>" />
  <input type="hidden" name="billprovince" value="<?php echo $billprovince; ?>" />
  <input type="hidden" name="billcity" value="<?php echo $billcity; ?>" />
  <input type="hidden" name="billpost" value="<?php echo $billpost; ?>" />
  <input type="hidden" name="deliveryname" value="<?php echo $deliveryname; ?>" />
  <input type="hidden" name="deliveryaddress" value="<?php echo $deliveryaddress; ?>" />
  <input type="hidden" name="deliverycity" value="<?php echo $deliverycity; ?>" />
  <input type="hidden" name="deliverycountry" value="<?php echo $deliverycountry; ?>" />
  <input type="hidden" name="deliveryprovince" value="<?php echo $deliveryprovince; ?>" />
  <input type="hidden" name="deliveryemail" value="<?php echo $deliveryemail; ?>" />
  <input type="hidden" name="deliveryphone" value="<?php echo $deliveryphone; ?>" />
  <input type="hidden" name="deliverypost" value="<?php echo $deliverypost; ?>" />
 
  <div class="buttons">
    <div class="right">
      <input type="submit" value="<?php echo $button_confirm; ?>" class="button" />
    </div>
  </div>
</form>
Wie Sie vielleicht schon erraten haben, ist dies das Formular, das gesendet wird, wenn der Benutzer auf die Schaltfläche „Bestellung bestätigen“ klickt. Wir haben gerade die versteckten Variablen und ihre Werte festgelegt, die zuvor in der -Methode des Controllers definiert wurden. index

Mal sehen, was am Frontend passiert:

在 OpenCart 中设计个性化支付选项:第 3 部分

Werfen wir einen kurzen Blick auf den gesamten Prozess:

  • Zuerst müssen Sie die Musterdatei für Ihre Zahlungsmethode einrichten, damit diese im Tag Schritt 5: Zahlungsmethoden aufgeführt werden kann.
  • Wenn der Benutzer als nächstes auf der fünften Registerkarte Benutzerdefinierte Zahlungsmethode auswählt und auf die Schaltfläche Weiter klickt, ruft OpenCart intern die payment/custom URL,最终调用 index 方法并在第六个选项卡中呈现 custom.tpl-Datei auf.
  • Wenn der Benutzer schließlich auf die Schaltfläche Bestellung bestätigen klickt, wird das Formular übermittelt und der Benutzer wird zur Website des Zahlungsgateways weitergeleitet, wo der Zahlungsvorgang beginnt. Nach Abschluss des Zahlungsvorgangs erfolgt die Aktualisierung im Rahmen der callbackurl 隐藏变量,用户将被重定向回我们的网站。当然,如果一切按预期运行,订单状态将作为 callback-Methode.

Fazit

In dieser Serie erkläre ich, wie Sie nahezu jede Zahlungsmethode einrichten, indem Sie Ihr eigenes Zahlungsmethodenmodul erstellen. Ich hoffe, Ihnen hat diese Serie gefallen und Sie haben etwas Nützliches gelernt.

Das Erstellen benutzerdefinierter Inhalte für jedes Framework macht immer Spaß, nicht wahr? Denken Sie daran, dass Sie jederzeit Kommentare und Fragen über das Kommentarformular unten hinterlassen können.

Das obige ist der detaillierte Inhalt vonEntwerfen personalisierter Zahlungsoptionen in OpenCart: Teil 3. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn