Maison > développement back-end > tutoriel php > Concevoir des options de paiement personnalisées dans OpenCart : partie 3

Concevoir des options de paiement personnalisées dans OpenCart : partie 3

王林
Libérer: 2023-09-03 10:42:01
original
904 Les gens l'ont consulté

Si vous avez suivi cette série, vous devriez être familier avec le type de structure de fichiers que nous avons mis en place sur le backend pour les méthodes de paiement personnalisées. Si vous n'avez pas lu les parties précédentes de cette série, je vous recommande fortement de les lire avant de continuer cette série.

Nous utiliserons également une configuration de fichier similaire pour la partie frontend.

Paramètres du contrôleur

Continuez et entrez 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
      }
    }
  }
}
?>
Copier après la connexion

Comme vous pouvez le constater, il existe deux méthodes différentes. La méthode index 方法将负责在表单提交到第三方支付网关时设置数据,而 callback est utilisée pour traiter les données de réponse de la passerelle de paiement tierce. Cela dit, vous pouvez définir davantage de méthodes si votre passerelle de paiement l'exige. Dans cet exemple, nous gardons le processus aussi simple que possible.

Apprenons chaque partie en détail. Nous allons commencer par la méthode index.

Tout d'abord, nous avons chargé le fichier de langue et défini la valeur du bouton Confirmer. Nous définissons également l'attribut action, qui sera utilisé par le formulaire de soumission de paiement. Vous devez modifier ce paramètre en fonction de votre passerelle de paiement.

$this->language->load('payment/custom');
$this->data['button_confirm'] = $this->language->get('button_confirm');
$this->data['action'] = 'https://yourpaymentgatewayurl';
Copier après la connexion

Ensuite, nous chargeons les informations de commande de la session active de l'utilisateur.

$this->load->model('checkout/order');
$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
Copier après la connexion

Si les informations de commande sont disponibles, nous procéderons à la définition des données des variables cachées qui seront utilisées pour soumettre le formulaire à l'URL de la passerelle de paiement. Si vous prêtez une attention particulière au code, vous remarquerez que nous utilisons également des paramètres personnalisés text_config_onetext_config_two, que nous avons définis dans le formulaire de configuration de l'administrateur dans la partie précédente de cette série.

Une autre variable importante à noter ici est la méthode callbackurl,它保存支付网关在付款过程后将用户重定向回我们商店所使用的 URL。是的,查看 URL payment/custom/callback 应表明它将调用 callback, comme nous le verrons à ce stade.

$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');
Copier après la connexion

Enfin, nous attribuons le fichier de modèle personnalisé custom.tpl et rendons la vue.

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();
Copier après la connexion

Revoyons le code de la méthode callback. Cette méthode est appelée lorsque l'utilisateur revient au magasin depuis le site de la passerelle de paiement.

Tout d'abord, nous vérifions si la variable orderid est disponible avant de continuer. S'il n'est pas disponible, nous arrêterons le traitement ultérieur.

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

Ensuite, nous chargeons les informations de commande à partir de la base de données. Enfin, nous vérifierons s'il y a un indicateur success dans la réponse de la passerelle de paiement. Si tel est le cas, nous continuerons à mettre à jour les informations sur l'état de la commande en conséquence.

$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
  }
}
Copier après la connexion

C'est tout pour les paramètres du contrôleur. Assez simple, n'est-ce pas ?

Modèle traditionnel

Comme vous le savez probablement, OpenCart possède son propre ensemble de conventions et de normes pour gérer le fonctionnement interne de votre magasin. C'est le cas du paramétrage du modèle pour la détection des moyens de paiement. Vous venez de le configurer selon la convention et il sera récupéré automatiquement.

Continuez et entrez 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;
  }
}
Copier après la connexion

OpenCart utilisera cette classe pour répertorier les méthodes de paiement valides pendant le processus de paiement. Au cours de ce processus, OpenCart collecte une liste de méthodes de paiement valides auprès du backend et, pour chaque méthode, il vérifie si la classe de modèle appropriée est disponible. Les modes de paiement ne sont répertoriés que si la classe de modèle associée est disponible.

La chose la plus importante dans ce paramètre est la valeur de la variable code. Dans notre cas, nous l'avons défini comme custom, ce qui signifie que lorsque vous sélectionnez un mode de paiement et appuyez sur code 变量的值。在我们的例子中,我们将其定义为 custom,这意味着当您选择付款方式并按继续时,它将调用 payment/customcontinue

, il appellera payment/custom</code > URL interne qui configure finalement le formulaire de notre passerelle de paiement. <p> </p>En bref, on peut dire qu'il s'agit d'un fichier obligatoire pour la détection et le bon fonctionnement des moyens de paiement front-end. <h2> </h2>Fichiers de langue et modèles<p> <code class="inline">catalog/language/english/ payment/custom.php 创建语言文件。将以下内容粘贴到新创建的语言文件 custom.phpIl ne nous reste plus qu'à créer la langue et afficher les fichiers. Allez-y et entrez

.

<?php
$_['text_title'] = 'Custom Payment Method';
$_['button_confirm'] = 'Confirm Order';
?>
Copier après la connexion

Assez simple à comprendre : nous mettons simplement en place les balises qui seront utilisées sur le frontend lors du paiement.

catalog/view/theme/default/template/ payment/custom.tpl 创建模板文件。将以下内容粘贴到新创建的模板文件 custom.tplAllez-y et créez le fichier modèle dans catalog/view/theme/default/template/ payment/custom.tpl. Collez le contenu suivant dans le fichier modèle nouvellement créé

.

<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>
Copier après la connexion
Comme vous l'avez peut-être deviné, c'est le formulaire qui sera soumis lorsque l'utilisateur clique sur le bouton Confirmer la commandeindex. Nous venons de définir les variables cachées et leurs valeurs, qui ont été préalablement définies dans la méthode du contrôleur.

Voyons ce qui se passe en amont : 🎜

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

Jetons un rapide coup d'œil à l'ensemble du processus :

  • Tout d'abord, vous devez configurer le fichier modèle de votre mode de paiement afin qu'il puisse être répertorié dans la balise Étape 5 : Modes de paiement .
  • Ensuite, lorsque l'utilisateur sélectionne Mode de paiement personnalisé dans le cinquième onglet et clique sur le bouton Continuer, OpenCart appelle en interne le payment/custom URL,最终调用 index 方法并在第六个选项卡中呈现 custom.tplfichier.
  • Enfin, lorsque l'utilisateur clique sur le bouton Confirmer la commande, le formulaire sera soumis et l'utilisateur sera redirigé vers le site Web de la passerelle de paiement, où le processus de paiement commencera. Une fois le processus de paiement terminé, il est mis à jour dans le cadre de la méthode callbackurl 隐藏变量,用户将被重定向回我们的网站。当然,如果一切按预期运行,订单状态将作为 callback.

Conclusion

Dans cette série, j'explique comment configurer presque n'importe quel mode de paiement en créant votre propre module de mode de paiement. J'espère que vous avez apprécié cette série et appris quelque chose d'utile.

Créer du contenu personnalisé pour n’importe quel framework est toujours amusant, n’est-ce pas ? N'oubliez pas que vous pouvez toujours laisser des commentaires et des questions en utilisant le formulaire de commentaires ci-dessous.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal