Jump to content

Problème avec l'intégration des frais supplémentaires lors du paiement via PayPal


Recommended Posts

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.

image.png.8aa91d0a16005881d82894ab756d2541.png

paypalprob1.png.3cad12b575fd164398d0e8e56a8ad6f9.png

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: 

image.png.cd354da208562bc35220506bb67c5618.pngimage.png.9098b88d660a16c9b4bfb00b7bf58b6e.png

Link to comment
Share on other sites

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

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 

image.thumb.png.012df1799ef0e7a34f3351b63a5c49ae.png

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...