Vous n'êtes pas identifié(e).

#1 07-12-2019 à 14:42

GG le sympa
Administrateur
Lieu : Graçay
Inscription : 03-08-2006 à 14:41
Messages : 17 579

Erreur arrondi Paypal sur PrestaShop 1.6. Erreur de paiement

Quand un client paye avec PayPal parfois il y a une erreur de paiement le client voyant que son paiement a été annuler ou refuser et du coup il refait la commande alors qu'il a bien été encaissé

La première solution dans les paramètres généraux et de fixer la règle d'arrondi à l'infini et de mettre le type d'arrondi pour chaque article mais ça ne marche pas toujours surtout quand il y a des devises

Si vous voulez ne pas vous prendre la tête aller dans le dossier module Paypal.php ligne 2499

Remplacer

  public function comp($num1, $num2, $scale = null)
    {
        // check if they're valid positive numbers, extract the whole numbers and decimals
        if (!preg_match("/^\+?(\d+)(\.\d+)?$/", $num1, $tmp1) || !preg_match("/^\+?(\d+)(\.\d+)?$/", $num2, $tmp2)) {
            return ('0');
        }

        // remove leading zeroes from whole numbers
        $num1 = ltrim($tmp1[1], '0');
        $num2 = ltrim($tmp2[1], '0');

        // first, we can just check the lengths of the numbers, this can help save processing time
        // if $num1 is longer than $num2, return 1.. vice versa with the next step.
        if (Tools::strlen($num1) > Tools::strlen($num2)) {
            return 1;
        } else {
            if (Tools::strlen($num1) < Tools::strlen($num2)) {
                return -1;
            } else {
                // if the two numbers are of equal length, we check digit-by-digit

                // remove ending zeroes from decimals and remove point
                $dec1 = isset($tmp1[2]) ? rtrim(Tools::substr($tmp1[2], 1), '0') : '';
                $dec2 = isset($tmp2[2]) ? rtrim(Tools::substr($tmp2[2], 1), '0') : '';

                // if the user defined $scale, then make sure we use that only
                if ($scale != null) {
                    $dec1 = Tools::substr($dec1, 0, $scale);
                    $dec2 = Tools::substr($dec2, 0, $scale);
                }

                // calculate the longest length of decimals
                $d_len = max(Tools::strlen($dec1), Tools::strlen($dec2));

                // append the padded decimals onto the end of the whole numbers
                $num1 .= str_pad($dec1, $d_len, '0');
                $num2 .= str_pad($dec2, $d_len, '0');

                // check digit-by-digit, if they have a difference, return 1 or -1 (greater/lower than)
                for ($i = 0; $i < Tools::strlen($num1); $i++) {
                    if ((int) $num1{$i} > (int) $num2{$i}) {
                        return 1;
                    } elseif ((int) $num1{$i} < (int) $num2{$i}) {
                        return -1;
                    }
                }
                // if the two numbers have no difference (they're the same).. return 0
                return 0;
            }
        }
    }

Par

 public function comp($num1, $num2, $scale = null)
    {   
                return 0;
 } 

Et le tour est joué
Évidemment ce n'est pas très propre mais quand on n'a pas trop le temps c'est toujours ça de gagné

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer

Pied de page des forums