Mereka bentuk pilihan pembayaran yang diperibadikan dalam OpenCart: Bahagian 3

王林
Lepaskan: 2023-09-03 10:42:01
asal
865 orang telah melayarinya

Jika anda telah mengikuti siri ini, anda seharusnya sudah biasa dengan jenis struktur fail yang kami sediakan di bahagian belakang untuk kaedah pembayaran tersuai. Jika anda belum membaca bahagian sebelumnya siri ini, saya amat mengesyorkan membacanya sebelum meneruskan siri ini.

Kami akan menggunakan persediaan fail yang serupa untuk bahagian hadapan juga.

Tetapan Pengawal

Teruskan dan buat fail pengawal dalam catalog/controller/ payment/custom.php. Tampalkan kandungan berikut ke dalam fail pengawal yang baru dibuat custom.php. 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
      }
    }
  }
}
?>
Salin selepas log masuk

如您所见,有两种不同的方法。 index 方法将负责在表单提交到第三方支付网关时设置数据,而 callback 方法用于处理来自第三方支付网关的响应数据支付网关。话虽如此,如果您的支付网关需要,您可以定义更多方法。在此示例中,我们使流程尽可能简单。

让我们详细了解每个部分。我们将从 index 方法开始。

首先,我们加载了语言文件并设置了确认按钮的值。我们还设置了 action 属性,该属性将由付款提交表单使用。您应该根据您的支付网关更改此设置。

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

接下来,我们从用户的活动会话中加载订单信息。

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

如果订单信息可用,我们将继续设置隐藏变量的数据,这些数据将用于将表单提交到支付网关 URL。如果您密切关注代码,您会发现我们还使用了自定义参数 text_config_onetext_config_two,我们在管理配置表单中设置了这些参数本系列的前一部分。

这里需要注意的另一个重要变量是 callbackurl,它保存支付网关在付款过程后将用户重定向回我们商店所使用的 URL。是的,查看 URL payment/custom/callback 应表明它将调用 callback 方法,正如我们将在此刻看到的那样。

$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');
Salin selepas log masuk

最后,我们分配自定义模板文件 custom.tpl 并渲染视图。

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();
Salin selepas log masuk

让我们回顾一下 callback 方法的代码。当用户从支付网关站点返回商店时,将调用此方法。

首先,我们在继续操作之前检查 orderid 变量是否可用。如果不可用,我们将停止进一步处理。

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

接下来,我们从数据库加载订单信息。最后,我们将检查支付网关响应中是否有 success 指示器。如果是这样,我们将继续相应地更新订单状态信息。

$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
  }
}
Salin selepas log masuk

这就是控制器设置。很简单,不是吗?

传统模型

您可能知道,OpenCart 有自己的一套处理商店内部运作的惯例和标准。支付方式检测的模型设置就是这种情况。您只需按照约定进行设置,它就会被自动拾取。

继续并在 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;
  }
}
Salin selepas log masuk

OpenCart 在结帐过程中列出有效付款方式时将使用此类。在此过程中,OpenCart 从后端收集有效支付方法的列表,并且对于每种方法,它将检查适当的模型类是否可用。仅当关联模型类可用时才会列出付款方式。

此设置中最重要的是 code 变量的值。在我们的例子中,我们将其定义为 custom,这意味着当您选择付款方式并按继续时,它将调用 payment/custom 内部 URL,最终为我们的支付网关设置表单。

简而言之,我们可以说它是前端支付方式检测和正常工作的强制文件。

语言和模板文件

现在,我们只需要创建语言并查看文件。继续并在 catalog/language/english/ payment/custom.php 创建语言文件。将以下内容粘贴到新创建的语言文件 custom.php 中。

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

相当容易理解:我们刚刚设置了结账时将在前端使用的标签。

继续并在 catalog/view/theme/default/template/ payment/custom.tpl 创建模板文件。将以下内容粘贴到新创建的模板文件 custom.tpl 中。

<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>
Salin selepas log masuk

正如您可能已经猜到的,这是当用户单击确认订单按钮时将提交的表单。我们刚刚设置了隐藏变量及其值,这些变量先前在控制器的 index rrreee

Seperti yang anda lihat, terdapat dua kaedah yang berbeza. Kaedah index akan bertanggungjawab untuk menetapkan data apabila borang diserahkan kepada gerbang pembayaran pihak ketiga, manakala panggilan balik kaedah digunakan untuk mengendalikan pembayaran daripada data Respons pihak ketiga daripada get laluan pembayaran. Setelah berkata demikian, anda boleh menentukan lebih banyak kaedah jika gerbang pembayaran anda memerlukannya. Dalam contoh ini, kami memastikan prosesnya semudah mungkin.

Mari belajar tentang setiap bahagian secara terperinci. Kita akan mulakan dengan kaedah index. 🎜 🎜Mula-mula, kami memuatkan fail bahasa dan menetapkan nilai butang Sahkan. Kami juga menetapkan atribut action, yang akan digunakan oleh borang penyerahan pembayaran. Anda harus menukar tetapan ini mengikut gerbang pembayaran anda. 🎜 rrreee 🎜Seterusnya, kami memuatkan maklumat pesanan daripada sesi aktif pengguna. 🎜 rrreee 🎜Jika maklumat pesanan tersedia, kami akan meneruskan untuk menetapkan data pembolehubah tersembunyi yang akan digunakan untuk menyerahkan borang ke URL gerbang pembayaran. Jika anda mengikuti kod tersebut dengan teliti, anda akan mendapati bahawa kami juga menggunakan parameter tersuai text_config_one dan text_config_two, yang kami ada dalam borang konfigurasi pentadbir Parameter ini telah ditetapkan dalam bahagian sebelumnya dalam siri ini. 🎜 🎜Satu lagi pembolehubah penting yang perlu diperhatikan di sini ialah callbackurl, yang menyimpan URL yang digunakan oleh get laluan pembayaran untuk mengubah hala pengguna kembali ke kedai kami selepas proses pembayaran. Ya, melihat URL payment/custom/callback seharusnya menunjukkan bahawa ia akan memanggil kaedah callback, seperti yang akan kita lihat di titik ini Dengan cara itu. 🎜 rrreee 🎜Akhir sekali, kami menetapkan fail templat tersuai custom.tpl dan memaparkan paparan. 🎜 rrreee 🎜Mari kita semak kod kaedah callback. Kaedah ini dipanggil apabila pengguna kembali ke kedai dari tapak gerbang pembayaran. 🎜 🎜Mula-mula, kami menyemak sama ada pembolehubah orderid tersedia sebelum meneruskan. Jika ia tidak tersedia, kami akan menghentikan pemprosesan selanjutnya. 🎜 rrreee 🎜Seterusnya, kami memuatkan maklumat pesanan daripada pangkalan data. Akhir sekali, kami akan menyemak sama ada terdapat penunjuk kejayaan dalam respons get laluan pembayaran. Jika ya, kami akan terus mengemas kini maklumat status pesanan sewajarnya. 🎜 rrreee 🎜Itu sahaja untuk tetapan pengawal. Cukup mudah, bukan? 🎜 🎜Model tradisional🎜 🎜Seperti yang anda ketahui, OpenCart mempunyai set konvensyen dan piawaian tersendiri untuk mengendalikan kerja dalaman kedai anda. Ini adalah kes untuk persediaan model untuk pengesanan kaedah pembayaran. Anda hanya menetapkannya mengikut konvensyen dan ia akan diambil secara automatik. 🎜 🎜Teruskan dan buat fail model dalam catalog/model/ payment/custom.php. Tampalkan kandungan berikut ke dalam fail model yang baru dibuat custom.php. 🎜 rrreee 🎜OpenCart akan menggunakan kelas ini apabila menyenaraikan kaedah pembayaran yang sah semasa proses pembayaran. Semasa proses ini, OpenCart mengumpul senarai kaedah pembayaran yang sah dari bahagian belakang, dan untuk setiap kaedah, ia menyemak sama ada kelas model yang sesuai tersedia. Kaedah pembayaran hanya disenaraikan jika kelas model yang berkaitan tersedia. 🎜 🎜Perkara yang paling penting dalam tetapan ini ialah nilai pembolehubah code. Dalam kes kami, kami mentakrifkannya sebagai custom, yang bermaksud apabila anda memilih kaedah pembayaran dan menekan Teruskan, ia akan memanggil pembayaran/tersuai URL Dalaman yang akhirnya menyediakan borang untuk gerbang pembayaran kami. 🎜 🎜Ringkasnya, kita boleh mengatakan bahawa ia adalah fail wajib untuk pengesanan kaedah pembayaran bahagian hadapan dan berfungsi dengan baik. 🎜 🎜Fail bahasa dan templat🎜 🎜Kini kita hanya perlu mencipta bahasa dan melihat fail. Teruskan dan buat fail bahasa dalam catalog/language/english/ payment/custom.php. Tampalkan kandungan berikut ke dalam fail bahasa yang baru dibuat custom.php. 🎜 rrreee 🎜Agak mudah difahami: kami hanya menyediakan tag yang akan digunakan pada bahagian hadapan semasa pembayaran. 🎜 🎜Teruskan dan buat fail templat dalam catalog/view/theme/default/template/ payment/custom.tpl. Tampalkan kandungan berikut ke dalam fail templat custom.tpl yang baru dibuat. 🎜 rrreee 🎜Seperti yang anda duga, ini adalah borang yang akan diserahkan apabila pengguna mengklik butang Sahkan Pesanan. Kami baru sahaja menetapkan pembolehubah tersembunyi dan nilainya, yang sebelum ini ditakrifkan dalam kaedah index pengawal. 🎜 🎜Mari kita lihat apa yang berlaku di bahagian hadapan: 🎜

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

Mari kita lihat dengan cepat keseluruhan proses:

  • Pertama, anda mesti menyediakan fail model untuk kaedah pembayaran anda supaya ia boleh disenaraikan dalam teg Langkah 5: Kaedah Pembayaran .
  • Seterusnya, apabila pengguna memilih Kaedah pembayaran tersuai dalam tab kelima dan mengklik butang Teruskan, OpenCart akan Kelas pembayaran/tersuai dipanggil secara dalaman, dan akhirnya kaedah index dipanggil dan dipaparkan dalam tab keenam custom .tpl fail. payment/custom URL,最终调用 index 方法并在第六个选项卡中呈现 custom.tpl 文件。
  • 最后,当用户点击确认订单按钮时,表单将被提交,用户将被带到付款网关网站,付款流程将由此开始。付款过程完成后,由于 callbackurl 隐藏变量,用户将被重定向回我们的网站。当然,如果一切按预期运行,订单状态将作为 callback

  • Akhir sekali, apabila pengguna mengklik pada butang
Confirm Order

, borang akan diserahkan dan pengguna akan dibawa ke laman web gerbang pembayaran, di mana proses pembayaran akan bermula. Selepas proses pembayaran selesai, pengguna akan dialihkan semula ke tapak web kami kerana pembolehubah tersembunyi callbackurl. Sudah tentu, jika semuanya berfungsi seperti yang diharapkan, status pesanan akan dikemas kini sebagai sebahagian daripada kaedah panggilan balik.

KESIMPULAN#🎜🎜# #🎜🎜#Dalam siri ini, saya menerangkan cara menyediakan hampir semua kaedah pembayaran dengan mencipta modul kaedah pembayaran anda sendiri. Saya harap anda menikmati siri ini dan mempelajari sesuatu yang berguna. #🎜🎜# #🎜🎜# Ia sentiasa menyeronokkan untuk mencipta kandungan tersuai untuk mana-mana bingkai, bukan? Ingat, anda sentiasa boleh meninggalkan komen dan soalan menggunakan borang ulasan di bawah. #🎜🎜#

Atas ialah kandungan terperinci Mereka bentuk pilihan pembayaran yang diperibadikan dalam OpenCart: Bahagian 3. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!