TrogloGeek / prestashop-tggatos-module

TggAtos Module for Prestashop (1.4 to 1.7), ATOS SIPS 6xx payment gateway
61 stars 34 forks source link

commandes en double #46

Closed nicolain06 closed 8 years ago

nicolain06 commented 8 years ago

Bonjour, certaines commandes sont doublées après réception du paiement : 2 commandes identiques sont insérées à la même seconde. Avez-vous déjà eu le soucis ? une idée pour le corriger ?

TrogloGeek commented 8 years ago

D'ailleurs cela ne renforce pas réellement la sécurité non plus, car c'est l'encapsulation crypto des requêtes et réponses est le seul garant de la non manipulation des paiements. Le reste n'est que sparadraps.

TrogloGeek commented 8 years ago

J'ai enfin pu prendre quelques heures pour m'installer un environnement de développement PrestaShop et ajouter une gestion de la concurrence au module pour la version 4.1.0.

La version 4.1.0 utilise une table pour générer un lock sur un identifiant de panier. Chaque contexte de réponse tente d'obtenir le lock avant de la traiter, le comportement en cas d'échec change selon le contexte: Une réponse silencieuse s'arrête si elle n'a pas obtenu le lock. Une réponse utilisateur se met en attente 3s (configurable via l'onglet "avancé" de la config) en vérifiant toutes les 100ms si le lock est toujours actif. Dès que le lock est retiré le traitement continue. Si au bout des 3s (configurable) le lock est toujours actif, une page, indiquant que la boutique est en attente du traitement bancaire et que l'email de confirmation sera envoyé dès la fin de celui ci, est présentée à l'utilisateur.

Cette page est très crue, si votre boutique est lente et risque donc de présenter cette page à l'utilisateur, customisez-la : https://github.com/TrogloGeek/prestashop-tggatos-module/blob/RC_4.1.0/views/templates/front/processing_payment_response.tpl

Idéalement plutôt qu'une boucle d'attente PHP il faudrait présenter une page d'attente immédiatement et faire la boucle d'attente en polling ajax, mais je n'ai pas le temps pour une modification aussi lourde.

Quelques personnes pourraient-elle tester la 4.1.0 et me faire des retours que je sache si je peux la basculer en version par défaut ?

tucoinfo commented 8 years ago

Bonjour Damien, merci de vos efforts. J'ai plusieurs v3.x dont une qui est encore sur PS1.4. Je peux plaquer les fichiers par dessus tout simplement ?

TrogloGeek commented 8 years ago

Il vaudrait mieux utiliser GIT pour mettre à jour, il y a eu des fichiers renommés ou supprimés, et puis cela permet aussi de ne pas oublier une modification effectuée en local qui serait écrasée... Écrire par dessus devrait fonctionner mais il restera des fichiers "morts" et inutiles.

tranxene2000 commented 8 years ago

Bonjour, Jusqu'à apparition de ce problème tout a bien fonctionné pendant un an et demi. Puis, j'ai installé la version 4.1.0. et mis la temporisation à 3 sec. puis à 5 sec. Mais dans les 2 cas de figure j'ai des commandes en double. Dommage c'était super Trogglo ... mais le module officiel reste apparemment la seule solution.

TrogloGeek commented 8 years ago

Mais le module officiel reste apparemment la seule solution.

Je ne sais pas si cela a été corrigé mais la dernière fois que j'ai eu le module officiel entre les mains (cela date de plusieurs années) son problème était justement de perdre des commandes en cas de défaillance d'une réponse.

Je n'ai malheureusement pas de contrat VAD SIPS donc pas de certificat pour tester mes modifications. Si quelqu'un a un contrat (de préférence encore en pré-production) et peut me prêter le certificat pour faire des testes et corriger cela...

tucoinfo commented 8 years ago

Si quelqu'un a un contrat (de préférence encore en pré-production) et peut me prêter le certificat pour faire des testes et corriger cela...

Suis en prod mais je veux bien (mes doublons sont réduits mais il en reste).

BenoitGoimier commented 8 years ago

@fenaille tu peux encore améliorer en faisant

public function orderExists($id_cart)
{
    return (bool)Db::getInstance()->getValue('SELECT count(*) FROM `'._DB_PREFIX_.'orders` WHERE `id_cart` = '.(int)$id_cart);
}
tranxene2000 commented 8 years ago

Si vous avez pu accéder à un certificat et tester, tenez nous SVP au courant.

TrogloGeek commented 8 years ago

Hello, j'ai enfin du temps et de l'énergie à consacrer à ce problème aujourd'hui et j'ai pu reproduire le problème avec la dernière version du module, donc je vais pouvoir travailler dessus \o/.

La boucle d'attente fonctionne correctement, la persistance du problème vient que j'ai oublier de tenir compte du cache de Cart::orderExists() dont nous avons parlé précédemment. Je corrige ça.

TrogloGeek commented 8 years ago

J'ai enfin pu reproduire après avoir fixé (le problème côté SIPS est aléatoire, la plupart du temps le serveur bancaire me met correctement en attente de la fin de la réponse silencieuse avant de me rediriger). Le commit 4bff99dfb87c5e174b906d57f27c1aa312f47460 corrige le problème sur mes tests.

TrogloGeek commented 8 years ago

@tranxene2000, @tucoinfo, avez-vous pu tester la dernière version ?

tranxene2000 commented 8 years ago

Tout d'abord, merci (pour tous les sites concernés) de votre intervention. Je l'ai mis en place ce jour. Pour le moment pas de commandes du tout :) Je vous donnerai le feedback dans tous les cas de figure.

tucoinfo commented 8 years ago

Merci Damien. Idem, RC4.1.1 tourne sur 3 sites peu actifs. Je passerai sur un dernier plus busy après quelques commandes réussies.

TrogloGeek commented 8 years ago

Pas de nouvelles, bonne nouvelle ?

tucoinfo commented 8 years ago

Pour l'instant que de bonnes nouvelles sur 3 petits sites. Coincidence, j'ai eu un doublon PayPal après cette dernière mise à jour, certainement rien à voir puisque pas d'overrides si je ne m'abuse. Donc je vais upgrader un site plus important pour finaliser le test.

TrogloGeek commented 8 years ago

Merci pour le retour @tucoinfo.

Coincidence, j'ai eu un doublon PayPal après cette dernière mise à jour, certainement rien à voir puisque pas d'overrides si je ne m'abuse.

En effet, j'ai mis un point d'honneur en développant ce module a ne pas utiliser d'override du Core (ce qui m'aurait permis des fonctionnalités bien plus avancées et de simplifier certaines parties du code) car une méthode de paiement étant un connecteur terminal dans la plupart des cinématiques ne doit pas avoir d'influence sur le comportement de la boutique. (Sauf cas bien spécifiques, mais qui sont hors du cadre de la mission de ce module). Donc à priori, il n'y a en effet aucune raison pour que le doublon de Paypal ne soit en rapport avec la mise à jour de TggAtos, simplement le fonctionnement de PaymentModule::validateOrder() ne garantit pas de verrou exclusif sur le panier durant son traitement, TggAtos y est devenu particulièrement sensible depuis que SIPS parallélise parfois les deux réponses d'où ce patch, mais en réalité la plupart des méthodes de paiement y sont vulnérables.

Un des défauts inhérent à cette absence de verrou sur le panier pouvant être posé par une méthode de paiement est que l'utilisateur peut, via un second onglet, modifier le contenu du panier lorsqu'il est sur le serveur de paiement et que le montant a donc déjà été fixé.

tranxene2000 commented 8 years ago

De mon côté une dizaine de commandes carte bancaire sans problème. Je redonnerai le feedback plus tard à nouveau pour dire la situation mais ça a l'air d'être résolu. Thank you Mr TrogloGeek

TrogloGeek commented 8 years ago

Pas de quoi, on ne laisse pas trainer un logiciel défectueux dans la nature, surtout quand il s'agit d'un connecteur de paiement. Désolé d'avoir été si long à réagir, mais depuis que je travaille chez LiveMon j'ai des semaines de travail bien remplies ;-).

tucoinfo commented 8 years ago

Donc, sur le dernier des sites à upgrader on tourne également sans doublon depuis une bonne semaine maintenant. En ce qui me concerne c'est résolu. Merci Damien.

TrogloGeek commented 8 years ago

Et merci à tous ceux qui m'ont fourni les informations dont j'avais besoin pour travailler sur le problème.

tranxene2000 commented 8 years ago

Je confirme aussi. Ça tourne tjs sans doublons. Un grand merci.

wizidot commented 7 years ago

Bon, La solution proposée n'est pas pour moi très pertinente. Car elle part du principe que la commande est achevée et enregistrée. Sauf que le délais d'enregistrement d'une commande est variable, il peu y avoir des traitements plus ou moins longs (envoi d'emails, génération de factures...). Et le fait de voir si un order existe implique que ce traitement soit terminé. Or les appels depuis atos sont parfois très rapprochés (moins d'une seconde) et la deuxième commande se crée alors que la première n'est pas encore terminée.. Que faire... Et bien ma proposition est d'aller plutôt regarder du coté de la querystring envoyée à Atos, vous retrouverez 2 urls . moi j'utilise mercanet et leur "fameux..." module prestashop. Mes 2 paramètres chelou sont :

Et vous me croyez ou pas, mais ces 2 urls sont appelées en fin de paiement. Et ces 2 urls créent des commandes.. validation.php

// If the sealed is valid, we create the order / payment and redirect the customer
if ((bool)$is_sealed == true ) {
    $error = true;
    if($data['responseCode'] == "00"){
    // Create Order / Payment "Ho ben tiens quelle bonne idée, si on créait une commande"
    $notification = new MercanetNotification();
    $notification->notify($raw_data, $params['Seal']);
    $error=false;
    }

notification.php

// If the sealed is valid, we create the order / payment and redirect the customer
if ((bool)$is_sealed == true) {
    // Create Order / Payment
    $notification = new MercanetNotification();//"Ho ben tiens quelle bonne idée, si on créait une commande"
    $notification->notify($raw_data, $params['Seal']);
}

Voilà voilà.... Alors en plus d'être des chêvres, il font du mauvais fromage... Bon autant dire que j'ai commenté le code dans validation.php pour ne plus a avoir à gérer de commandes multiples.

Si ma solution vous semble moisie, dites-le moi.... @+

TrogloGeek commented 7 years ago

Bonjour, ce support concerne le module TggAtos, je peux difficilement gérer le support à la fois pour mon module gratuit et pour le module payant de PrestaShop auquel je ne suis aucunement lié. Mon module a été créé justement car je jugeais la stabilité et la qualité du module officiel largement insuffisant par rapport à mes standards de qualité concernant des transactions bancaires.

La mise à jour 4.1.1 du module TggAtos corrige le problème auquel vous êtes confronté par l'utilisation d'un système de lock sur la génération de commande pour compenser la modification de fonctionnement du système de paiement SIPS en début d'année. Votre solution présente la problématique de ne pas avoir de solution de rattrapage dans le cas où la réponse automatique échoue (problématique que j'ai fréquemment rencontrée avec le système de paiement SIPS) auquel cas la commande n'est pas générée.

Vous pouvez si vous le souhaiter tester et utiliser librement mon module qui est gratuit et libre, ou émettre une réclamation auprès du support de PrestaShop.

jul7859 commented 7 years ago

Hello, Déso de rouvrir le sujet un peu tard, mon ancien module Atos a tjrs les commandes doublons. Ce module qui corrige le problème me fait rêver, mais je n'ai pas les compétences techniques de l'installer :( qqun peut le faire ? (j'ai LCL sherlocks sur module Atos) Cheers !