Jump to content

Les Erreurs D'arrondi Persistent Paypal 2.8.5


Recommended Posts

Bon

il y a un bug de conception dans le module paypal, je comprend meme pas que personne ne le corrige... ça sert a rien de faire des arrondis partout en esperant que les 2 montants soient egaux...( Amt et ITEMAMT , voir détails ci dessous )

 

L'erreur paypal est

L_LONGMESSAGE0 -> The totals of the cart item amounts do not match order amounts.

 

 

en facturation, on fait ( si tva=19,6% par exemple)

 

le cas1

=====

Somme des prix HT * 1.196= Total TTC

TVA = Total TTC - Somme(prix HT )

 

et pas

 

le cas 2

=====

prix ttc =prix HT x 1.196

Somme ( prix ttc )

puis

TVA = somme des prix ttc - somme des prix HT

 

Prestashop fait le cas 1 et paypal le cas 2 ( soit tout le monde fait le cas 1, soit tout le monde fait le cas 2)

 

donc tant que "Qté" est petit , avec les arrondis, ça marche, mais ( chez moi ) si qté >= 8 , ça fonctionne plus,

 

315,65 est différent de 315.68=8 X 39.46

 

Donc j'ai corrigé ça "rapidos" pour un client, en virant la transmission du détail de la commande qui est à l'origine du pb

 

Vous éditez le fichier

prestashop/modules/paypal/payment/paypalpayment.php

 

vous corrigez la ligne 54 pour supprimer le champs Amt

 

$request = '&PAYMENTACTION='.urlencode($paymentType).'&ReturnUrl='.urlencode($returnURL).'&CANCELURL='.urlencode($cancelURL).'&CURRENCYCODE='.urlencode($currencyCodeType).'&NOSHIPPING=1';

 

puis au dessus du if ($discounts == 0)

je remet:

 

$request .= '&L_NAME0=COMMANDE';

$request .= '&L_AMT0='.urlencode($paymentAmount);

$request .= '&L_QTY0=1';

$request .= '&ITEMAMT='.urlencode($paymentAmount);

$request .= '&Amt='.urlencode($paymentAmount);

$request .= '&SHIPPINGAMT='.urlencode($shipping);

$request .= '&TAXAMT=0';

du coup Amt est forcement égale a ITEMAMT, et égale a L_QTY0 *L_AMT0= donc ça marche a tous les coups.

 

et j'ai mis en commentaire le cas $discount== 0

 

if ($discounts == 0)

{

#$products = $cart->getProducts();

#$amt = 0;

#for ($i = 0; $i < sizeof($products); $i++)

#{

# $request .= '&L_NAME'.$i.'='.substr(urlencode($products[$i]['name'].(isset($products[$i]['attributes'])?' - '.$products[$i]['attributes']:'').(isset($products[$i]['instructions'])?' - '.$products[$i]['instructions']:'') ), 0, 127);

# $request .= '&L_AMT'.$i.'='.urlencode($this->PayPalRound($products[$i]['price_wt']));

# $request .= '&L_QTY'.$i.'='.urlencode($products[$i]['cart_quantity']);

# $amt += $this->PayPalRound($products[$i]['price_wt']*$products[$i]['cart_quantity']);

#}

#$shipping = $this->PayPalRound($cart->getOrderShippingCost($cart->id_carrier, false));

#$request .= '&ITEMAMT='.urlencode($amt);

#$request .= '&Amt='.urlencode($amt);

#$request .= '&SHIPPINGAMT='.urlencode($shipping);

#$request .= '&TAXAMT='.urlencode((float)max($this->PayPalRound($paymentAmount - $amt - $shipping), 0));

} else {

 

..

}

 

Voila

en esperant que cela t'aidera

bye

Huguesmax.

 

 

 

 

 

Détails du pb

==========

 

 

si on décode ce qui est envoyé a paypal

 

METHOD=SetExpress

Checkout&VERSION=60.0

PWD=*********

USER=XXXXXXXXXXXXXXX

SIGNATURE=*********

Amt=315.65

PAYMENTACTION=Sale

ReturnUrl=http%3A%2F%2Fwww.web.fr

CANCELURL=htt%3A%2F%2Fwww.web.fr

CURRENCYCODE=EUR

NOSHIPPING=1

SOLUTIONTYPE=Sole

LANDINGPAGE=Billing

LOCALECODE=FR

EMAIL=email_client%40gmail.com

L_NAME0=Article

L_AMT0=39.46

L_QTY0=8

ITEMAMT=315.68

SHIPPINGAMT=0

TAXAMT=0

SHIPTONAME=hugues

SHIPTOSTREET=22222

SHIPTOSTREET2=

SHIPTOCITY=lyon

SHIPTOSTATE=FR

SHIPTOZIP=69100

SHIPTOCOUNTRY=FR

SHIPTOPHONENUM=0000000

ADDROVERRIDE=1

Link to comment
Share on other sites

je n'ai pas utilisé cette version mais c'est assez simple a debuger

active les logs d'erreurs dans le module paypal

puis donnes moi le log de l'erreur ( en rouge )

tout ce passe lors de la construction de la requête a paypal

prestashop/modules/paypal/express/paypalexpress.php a partir de la ligne 53

 

53: $request = '&Amt='.urlencode($paymentAmount).'&PAYMENTACTION='.urlencode($paymentType).'&ReturnUrl='.urlencode($returnURL).'&CANCELURL='.urlencode($cancelURL).'&CURRENCYCODE='.urlencode($currencyCodeType);

Link to comment
Share on other sites

Bonjour,

 

Et bonne année !

 

Etant sur les mêmes versions de Prestashop et Paypal (la 2.8.5), je continue d'avoir cette erreur 10413.

 

J'ai bien suivi les conseils précisés plus haut par huguesmax, le seul souci étant que j'ai plus de lignes de code que lui sous if ($discounts == 0), j'ai essayé de ne mettre en commentaire que celles qui avaient été postées, d'autres, rien n'y fait...

 

Voici mon résultat en mode débug :

  1. PAYMENTACTION=Sale&AMT=1.01&CURRENCYCODE=EUR&IPADDRESS=www.grainedetomate.com&NOTIFYURL=http%3A%2F%2Fwww.grainedetomate.com%2Fmodules%2Fpaypal%2Fipn.php&BUTTONSOURCE=PRESTASHOP_ECM&SHIPTONAME(infos sur mon api et ma commande) L_NAME0=Tomatotest&L_AMT0=0&L_QTY0=101&ITEMAMT=0&SHIPPINGAMT=0&TAXAMT=1.01
  2. Send with fsockopen method successful
  3. PayPal response:
  4. TIMESTAMP -> 2012-01-05T16:41:41Z
  5. CORRELATIONID -> f27d132c81d36
  6. ACK -> Failure
  7. VERSION -> 60.0
  8. BUILD -> 2271164
  9. L_ERRORCODE0 -> 10413
  10. L_SHORTMESSAGE0 -> Transaction refused because of an invalid argument. See additional error messages for details.
  11. L_LONGMESSAGE0 -> The totals of the cart item amounts do not match order amounts.
  12. L_SEVERITYCODE0 -> Error

Je poste aussi le contenu de mon fichier paypalpayment.php. Finalement j'ai également mis en commentaire certaines lignes n'apparaissant pas dans le poste d'huguesmax. Si je me limite à ses lignes le résultat est le même !

 

if ($discounts == 0)

{

#if ($params['cart']->id_customer)

{

#$customer = new Customer((int)$params['cart']->id_customer);

#$taxCalculationMethod = Group::getPriceDisplayMethod((int)$customer->id_default_group);

}

#else

#$taxCalculationMethod = Group::getDefaultPriceDisplayMethod();

#$priceField = (($taxCalculationMethod == PS_TAX_EXC) ? 'price' : 'price_wt');

 

#$products = $cart->getProducts();

#$amt = 0;

#for ($i = 0; $i < sizeof($products); $i++)

{

#$request .= '&L_NAME'.$i.'='.substr(urlencode($products[$i]['name'].(isset($products[$i]['attributes'])?' - '.$products[$i]['attributes']:'').(isset($products[$i]['instructions'])?' - '.$products[$i]['instructions']:'') ), 0, 127);

#$request .= '&L_AMT'.$i.'='.urlencode($this->PayPalRound($products[$i][$priceField]));

#$request .= '&L_QTY'.$i.'='.urlencode($products[$i]['cart_quantity']);

#$amt += $this->PayPalRound($products[$i][$priceField] * $products[$i]['cart_quantity']);

}

#$shipping = $this->PayPalRound($cart->getOrderShippingCost($cart->id_carrier, false));

#$request .= '&ITEMAMT='.urlencode($amt);

#$request .= '&SHIPPINGAMT='.urlencode($shipping);

#$request .= '&TAXAMT='.urlencode((float)max($this->PayPalRound($paymentAmount - $amt - $shipping), 0));

}

else

{

 

 

A CE MOMENT l'erreur est localisée sur le log à la ligne 78 :

 

Thu Jan 05 17:56:59 2012] [error] [client 78.245.235.224] PHP Notice: Undefined variable: shipping in modules/paypal/payment/paypalpayment.php on line 78, referer: http://www.grainedetomate.com/modules/paypal/payment/submit.php

 

Ligne 78 de mon code = ce que j'ai ajouté selon huguesmax

 

$request .= '&SHIPPINGAMT='.urlencode($shipping);

 

Voilà j'espère avoir été assez clair... Quelqu'un pour m'aider à résoudre ce problème une bonne fois pour toutes?

 

Merci !

Link to comment
Share on other sites

Bonjour,

 

Finalement après une recherche en anglais j'ai vu que Paypal n'aimait pas les produits au prix inférieur à un euro.

 

Avec un test sur un produit à 1 euro ça marche. Dommage pour mes tests...

 

Par contre cela ne résout pas totalement le problème car je suis en préparation d'un site de téléchargement avec des morceaux à 90 cents d'euros, donc le sujet reste ouvert pour ma part !

Link to comment
Share on other sites

Bonjour

il faut bien vérifier que

Amt =ITEMAMT, = L_QTY0 *L_AMT0

si tu as plusieurs produits

Amt =ITEMAMT, = somme (L_QTY0 *L_AMT0 + L_QTY1 *L_AMT1) etc...et cela en TTC bien sur

 

Donc si tu as un produit égale à 0 ça marchera pas

 

Si tu n'as pas besoin des outils de facturations de paypal ( facture en ligne etc.. )

tu passes une commande, 1 produit, 1 montant

 

Par contre si tu as besoin d'avoir le détail chez paypal, comme fait ce module actuellement, il faut repartir a l'envers

 

Total TTC, on enlève la TVA

puis on décompose en X produits en TTC

 

et non pas

on prend somme(Qté produit HT * TVA ) = Total commande ITEMAMT

 

et d'un autre coté on envoie a payapl le resulat de Total HT * TVA = Amt

 

on arrive rapidement ( en fonction de Qté ) a ITEMAMT différent a Amt, donc paypal refuse

 

Si on triche et on met Amt partout ou ITEMAMT dans le code ( j'ai essayé ), il ralle encore car somme(Qté produit HT *TVA ) est différent

 

V'la

je sais pas si j'ai été très assez clair

Link to comment
Share on other sites

Bonjour,

Il y a un gros bug avec la gestion de TVA chez Paypal.

Je cherche toujours la solution pour ne pas envoyer le détail de la commande à paypal.

Pouvez-vous m'indiquer la partie exacte à modifier?

Paypal v2.8.5

Par avance merci.

J-Michel

Link to comment
Share on other sites

  • 2 months later...
  • 1 year later...

le module paypal integral évolution pour sa part refait le calcul total panier ht+ total des taxes + frais de livraisons ttc et ne tient pas compte du coup des arrondi Prestashop.

 

Je vous conseil d'utiliser cette variable pour récupérer le total ttc du panier :

 

$wk_montant = $cart->getOrderTotal();

$subtotal = number_format(($wk_montant), 2, '.', '') ;

 

et d'utiliser cette variable $subtotal pour transmettre le montant total du panier (shipping inclus)

 

je joint mon module en pièce jointe fonctionnel pour paypal intégral évolution sur boutique Prestashop 1.4.5.1

paypal.zip

Link to comment
Share on other sites

  • 1 month later...
  • 1 year later...

Bonjour,

 
Je viens d'installer Paypal sur Prestashop.
J'ai un problème lorsque je choisis le mode de paiement Paypal, le montant n'est pas le même que dans le panier.
Mon panier : 100 articles a 0.07€HT + 8€HT de frais de port ce qui fait 3€ de TVA a 20% ce qui fait 18€TTC, c'est OK
Je me retrouve dans Paypal avec 8€ TTC d'articles + 9.6€ TTC de Frais de port ce qui donne au total : 17.6€TTC
Paypal fait l'arrondi sur les articles pas sur le total : 100 articles a 0.07€HT = 0.07€HT + 20%TVA = 0.084TTC que paypal arrondi a 0.08, ce qui donne un total TTC de 8€.
Prestashop fait 100 * 0.07€HT = 7€HT + 20%TVA = 8.4TTC
 
Comment résoudre ce problème ?
 
Merci de votre retour:)
 
Cordialement.
Link to comment
Share on other sites

Bonjour,

 

C'est un problème dans le module Paypal qui n'est apparemment toujours pas compatible avec les boutiques à affichage de prix HT.

 

Il vous faudra donc modifier le code du module si vous souhaitez fonctionner en HT...

 

J'avais donné une solution il y a plus d'1an dans le sujet suivant :

https://www.prestashop.com/forums/topic/331068-bug-paypal-368-ou-37-et-paniers-hors-taxes/

 

A+

Zebx

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...