problème sur Prestashop avec les arrondis et les validations paypal et payplug

0 votes
10,746 vues
question 2 Septembre 15 dans Tous les CMS par ladmin (2,277 points)  

Il s'agit de prestashop 1.6.1.0 et des modules d'origine et à jour de Paypal et payplug

Pour certains montants seulement, il n'est pas possible d'accéder à Paypal

Pour tous ces montants et quelques autres, les retours des 2 modules produisent une exception indiquant un ( simple ) échec de la validation.

Il y avait des solutions sur le web au même problème rencontré il y a quelques années. Mais la stucture des programmes a changé et les modifs préconisées alors sont inapplicables.

Ne tirez pas sur le programmeur, cela vient de Php qui renvoie des décimales inattendues après plusieurs 0 ( ex : 99.01000000000000000012 au lieu de 99.01. Nous n'avons pas comparé les effets de php 5.5 et 5.6 ; en C, le comportement est meilleur. En Javascript, il est passé de pire que php à parfait aujourd'hui ... Il y a de l'espoir que cela s'arrange tout seul , à condition de ne pas être pressé.


'PAYMENTREQUEST_0_ITEMAMT' => '99.90000000000001', 
'PAYMENTREQUEST_0_AMT' => '111.400000000000061', 
 

ou encore

Fatal error: Uncaught exception 'PrestaShopException' with message 'Property Order->total_products is not valid' in 
/www/classes/ObjectModel.php:889 
Stack trace: 
#0 /www/classes/ObjectModel.php(245): ObjectModelCore->validateFields() 
#1 /www/classes/order/Order.php(305): ObjectModelCore->getFields() 
#2 /www/classes/ObjectModel.php(469): OrderCore->getFields() 
#3 /www/classes/order/Order.php(310): ObjectModelCore->add(true, true) 
#4 /www/classes/PaymentModule.php(336): OrderCore->add() 
#5 /www/modules/paypal/paypal.php(1510): PaymentModuleCore->validateOrder(2074, 1011, 111.4, 'PayPal', 'Pending payment...', Array, 1, false, '00...', Object(Shop)) 
#6 /www/modules/paypal/express_checkout/payment.php(296): PayPal->validateOrder(2074, 1011, 111.4, 'PayPal', 'Pending payment...', Array, 1, false, '00...', Object(Shop)) 
#7 /www/modules/paypal/express_checkout/payment.php(316): validateOrder(Object(Customer), Object(Cart), Object(PaypalExpressCheckout)) 
#8 {main} thrown in /www/classes/ObjectModel.php on line 889 
 

Comme il fallait avoir une solution, on a trouvé des hacks : il fallait ajouter une autre fonction d'arrondi pour quelques conversions importantes ( en travaillant avec des strings au lieu de floats ) et modifier la validation d'un montant trop long. Pas grave, ils sont arrondis plus loin et cela fonctionne globalement.

Il faudrait que quelqu'un , connaissant prestashop et ayant de bonnes raisons d'y consacrer du temps, intervienne au départ des valeurs, quand elles sont communiquées aux modules pour encaisser.

Si vous voulez les petits patchs débloquants ( sans risque sur l'improbable trafic d'encaissement de panier ) , demandez les moi. Si vous êtes abonné à leur forum , vous pourrez toujours en parler ...

Si vous utilisez les mêmes outils sur d'autres variantes de php et que cela fonctionne, merci de communiquer :)

Se connecter ou S'inscrire pour répondre à cette question.

Feel free to ask and answer in english

Bienvenue sur les FAQ de 123.fr, posez vos questions ou répondez à celles des autres usagers.

...