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.
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 } } } } ?>
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';
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']);
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_one
和 text_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');
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();
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'); }
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 } }
C'est tout pour les paramètres du contrôleur. Assez simple, n'est-ce pas ?
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; } }
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/custom
continue
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.php
Il 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'; ?>
catalog/view/theme/default/template/ payment/custom.tpl
创建模板文件。将以下内容粘贴到新创建的模板文件 custom.tpl
Allez-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>
index
. 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 : 🎜
Jetons un rapide coup d'œil à l'ensemble du processus :
payment/custom
URL,最终调用 index
方法并在第六个选项卡中呈现 custom.tpl
fichier. callbackurl
隐藏变量,用户将被重定向回我们的网站。当然,如果一切按预期运行,订单状态将作为 callback
.
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!