TheMoonWalk Posted January 3 Share Posted January 3 Bonjour la communauté PrestaShop, Je rencontre un problème avec l'intégration des frais supplémentaires dans le processus de paiement de ma boutique PrestaShop, et j'aurais besoin de votre aide. J'ai configuré des frais supplémentaires qui s'appliquent correctement dans le panier et qui sont affichés dans le récapitulatif des articles commandés, comme le montre la capture d'écran ci-jointe. Cependant, lorsque je procède au paiement via PayPal, ces frais supplémentaires ne sont pas inclus dans le montant final que PayPal charge, comme le montre la deuxième capture d'écran. Il semble y avoir une déconnexion entre les totaux calculés par PrestaShop et les montants transmis à PayPal. La première image montre le total TTC de 390,37 €, incluant les frais supplémentaires. La deuxième image montre le montant sur la page de paiement PayPal qui est de 379,00 €, sans inclure les frais supplémentaires. J'ai déjà implémenté une méthode `savePaymentFee` dans mon module de paiement qui est censée enregistrer et appliquer ces frais, et elle semble fonctionner correctement jusqu'au moment où l'utilisateur est redirigé vers PayPal. Voici le code que j'utilise pour enregistrer les frais (le fichier `paymentfeeajax.php`) : ```php <?php // Inclure le fichier nécessaire pour pouvoir utiliser 'ModuleFrontController' require_once(_PS_MODULE_DIR_.'wkpaymentfee/wkpaymentfee.php'); class WkPaymentFeePaymentfeeajaxModuleFrontController extends ModuleFrontController { public $ajax = true; // Permet à PrestaShop de savoir que ce contrôleur accepte les requêtes AJAX public function displayAjax() { // Vérifiez le token pour protéger contre les attaques CSRF $token = Tools::getValue('token'); $valid_token = Tools::getToken(false); if ($token != $valid_token) { // Si le token n'est pas valide, renvoyez une erreur die(json_encode([ 'success' => false, 'message' => 'Invalid token' ])); } // Récupérez le montant des frais à partir de la requête $feeAmount = Tools::getValue('feeAmount'); if (!isset($feeAmount) || !is_numeric($feeAmount)) { // Si le montant des frais n'est pas défini ou n'est pas numérique, renvoyez une erreur die(json_encode([ 'success' => false, 'message' => 'Invalid fee amount' ])); } // Utilisez une méthode de votre module pour enregistrer les frais // Remplacez 'savePaymentFee' par la méthode réelle que vous avez dans votre module $result = $this->module->savePaymentFee($feeAmount); // Renvoyez une réponse JSON die(json_encode([ 'success' => $result, 'message' => $result ? 'Fee saved successfully' : 'Error saving fee' ])); } } ``` Et voici le JavaScript qui envoie les données aux contrôleurs PrestaShop avant la redirection vers PayPal (le fichier `paymentfee.js`) : ```javascript /** * NOTICE OF LICENSE * * This source file is subject to the Academic Free License version 3.0 * that is bundled with this package in the file LICENSE.txt * It is also available through the world-wide-web at this URL: * https://opensource.org/licenses/AFL-3.0 * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade this module to a newer * versions in the future. If you wish to customize this module for your * needs please refer to CustomizationPolicy.txt file inside our module for more information. * * @author Webkul IN * @copyright Since 2010 Webkul * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 */ if (document.getElementById("payment-confirmation") != null) { document.getElementById("payment-confirmation").addEventListener("click", function() { var moduleId = $('input[name="payment-option"]:checked').attr('id'); //var moduleName = $('input[name="payment-option"]:checked').data('module-name'); var paymentFeeDetail = $('#' + moduleId + '-additional-information').find('#wk-payment-fee'); if (paymentFeeDetail.length) { var feeAmount = paymentFeeDetail.find('input[name = "wk-payment-fee-amount"]').val(); var feeType = paymentFeeDetail.find('input[name = "wk-payment-fee-type"]').val(); $.ajax({ url: getformattedcurrency, dataType: 'json', async: false, data: { ajax: '1', token: static_token, action: 'addPaymentFee', feeType: feeType, feeAmount: feeAmount, }, success: function(result) {} }); } }, true); } $(document).ready(function() { var cartTotalObject = $('#js-checkout-summary .cart-summary-line.cart-total span.value'); var orderConfirmationTable = $('#order-summary-content #order-items .order-confirmation-table table tbody tr').last().find('td').last(); var cartTotal = cartTotalObject.html(); $(".ps-shown-by-js:not(div):not(input[name='conditions_to_approve[terms-and-conditions]'])").on('click', function() { cartTotalObject.html(cartTotal); orderConfirmationTable.html(cartTotal); }); $('.payment-option').on('click', function() { var moduleId = $(this).find(' input[name="payment-option"]:checked').attr('id'); //var moduleName = $(this).find(' input[name="payment-option"]:checked').data('module-name'); var paymentFeeDetail = $('#' + moduleId + '-additional-information').find('#wk-payment-fee'); $('ul.wk-card-block, #wk-order-summary-tr').remove(); if (paymentFeeDetail.length) { var feeAmount = paymentFeeDetail.find('input[name = "wk-payment-fee-amount"]').val(); var feeType = paymentFeeDetail.find('input[name = "wk-payment-fee-type"]').val(); $.ajax({ url: getformattedcurrency, dataType: 'json', async: false, data: { ajax: '1', token: static_token, action: 'getFormattedPrice', feeType: feeType, feeAmount: feeAmount, }, success: function(result) { setTimeout(function() { // Convertir les montants en nombres pour pouvoir les additionner var cartTotalValue = parseFloat(cartTotal.replace(/[^0-9,.-]+/g, "").replace(',', '.')); var feeAmountValue = parseFloat(result.feeAmount.replace(/[^0-9,.-]+/g, "").replace(',', '.')); // Calculer le nouveau total en ajoutant les frais supplémentaires var newTotal = (cartTotalValue + feeAmountValue).toFixed(2); // Assurez-vous d'avoir deux chiffres après la virgule // Mettre à jour l'affichage du total TTC cartTotalObject.html(newTotal + ' €'); // Assurez-vous de mettre le bon symbole de devise si nécessaire orderConfirmationTable.html(newTotal + ' €'); // Afficher les frais supplémentaires dans le résumé de la commande var discount_tr = '<td>' + result.discountText + '</td><td>' + result.feeAmount + '</td>'; if ($('#wk-order-summary-tr').length != 0) { $('#wk-order-summary-tr').html(discount_tr); } else { $("#order-items table tr:first").after('<tr id="wk-order-summary-tr">' + discount_tr + '</tr>'); } }, 100); $(".total-value td:nth-child(2)").html(result['amount']); result.discount = `<li class="cart-summary-line" id="cart-voucher-payment-option"> <span class="label">` + result.discountText + `</span> <div class="float-xs-right"> ` + result.feeAmount + `</div> </li>` result.discount_tr = '<td>' + result.discountText + '</td><td>' + result.feeAmount + '</td>' if (result.discount) { if ($('ul.wk-card-block').length != 0) { $('ul.wk-card-block').html(result.discount); } else { $('.cart-summary-totals').prepend('<ul class="promo-name wk-card-block">' + result.discount + '</ul>'); } } if (result.discount_tr) { if ($('#wk-order-summary-tr').length != 0) { $('#wk-order-summary-tr').html(result.discount_tr); } else { $("#order-items table tr:first").after('<tr id="wk-order-summary-tr">' + result.discount_tr + '</tr>'); } } } }); } }); $('#payment-confirmation').on('click', function(e) { var paymentOptionId = $('input[name="payment-option"]:checked').attr('id'); var paymentFeeDetail = $('#' + paymentOptionId + '-additional-information').find('#wk-payment-fee'); if (paymentFeeDetail.length) { var feeAmount = paymentFeeDetail.find('input[name="wk-payment-fee-amount"]').val(); var feeType = paymentFeeDetail.find('input[name="wk-payment-fee-type"]').val(); // Assurez-vous que l'URL est correcte. La base_url doit être définie quelque part dans votre code, ou vous pouvez l'obtenir de PrestaShop. var paymentFeeAjaxUrl = prestashop.urls.base_url + '/modules/wkpaymentfee/controllers/front/paymentfeeajax.php'; $.ajax({ url: paymentFeeAjaxUrl, type: 'POST', dataType: 'json', data: { feeAmount: feeAmount, feeType: feeType, token: static_token // Assurez-vous que ce token est le bon pour des raisons de sécurité }, success: function(response) { if (response.success) { console.log('Les frais ont été enregistrés avec succès.'); } else { console.error('Erreur lors de l’enregistrement des frais: ' + response.message); } }, error: function(xhr, status, error) { console.error('Une erreur est survenue: ' + error); } }); } }); }); ``` Avez-vous des suggestions sur ce que je pourrais manquer ou sur la façon de s'assurer que les frais supplémentaires sont inclus lors du paiement via PayPal ? Toute aide serait grandement appréciée. Merci d'avance pour votre soutien. --- La structure du module de frais supplémentaire: Link to comment Share on other sites More sharing options...
Eolia Posted January 3 Share Posted January 3 Ce module n'est jamais appelé par Paypal donc il ne voit pas le prix modifié. Le code que vous nous donnez ne correspond qu'à la partie "visuelle" côté utilisateur. Paypal utilise les fonctions de la classe Cart (getOrderTotal() par exemple) et donc, à part un override je ne vois pas comment le module pourrait récupérer le prix modifié. Il existe des modules Paypal with fees qui intègrent les frais directement. Link to comment Share on other sites More sharing options...
TheMoonWalk Posted January 3 Author Share Posted January 3 Merci pour la réponse 🙂 J'ai essayer d'installer ce module mais lors d'installation j'ai eu un problème de surcharge comme vous voyez sur l'image : Et la version que j'ai c'est v2.4.1-ets_payment_with_fee Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now