Projet

Général

Profil

Actions

Anomalie #1511

fermé

Plugin Paypal - Contribution dupliquée

Ajouté par Manuel Her il y a plus de 3 ans. Mis à jour il y a plus de 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Début:
02/11/2020
Echéance:
% réalisé:

100%

Temps estimé:

Description

Bonjour,

J'ai un problème avec l'enregistrement des contributions via le plugin Paypal.
Il arrive qu'une contribution soit enregistrée en double.
Dans le log Paypal, j'ai l'icône erreur "duplicate".

Sans réponse sous 30 secondes, paypal considère que sa notification n'a pas été prise en compte, hors d'après les logs, la contribution a bien été ajoutée.
Du coup paypal appelle à nouveau l’IPN une minute plus tard, et double donc la contribution.
Il s’agit probablement d’une surcharge ou une opération de maintenance des serveurs d’OVH. Le serveur mysql et le serveur web ne sont pas sur la même machine. Le serveur peut commencer à répondre à une requête GET/POST mais rester en attente de mysql.

A la fin de l’IPN, il faudrait stocker le champ verify_sign et l'id du membre. Lors de l'appel suivant controler que verify_sign et l'id du membre n'existe pas avant d'ajouter la contribution.

Le processus est bien expliqué ici :
https://developer.paypal.com/docs/api-basics/notifications/ipn/IPNIntro/#ipn-protocol-and-architecture

Extraits
PayPal expects to receive a response to an IPN message within 30 seconds. Consequently, your listener must not perform time-consuming operations (such as updating a database) before responding to an IPN.
Verify that the IPN is not a duplicate. To do this, save the transaction ID and last payment status in each IPN message in a database and verify that the current IPN's values for these fields are not already in this database.

Merci.
Manuel


Fichiers

stop_doublons.txt (8,83 ko) stop_doublons.txt git diff Manuel Her, 13/11/2020 19:07

Mis à jour par Johan Cwiklinski il y a plus de 3 ans

Ça me semble étonnant que la contribution soit enregistrée, mais que le "retour" ne soit pas effectué ; mais soit, ça peut effectivement arriver. Il ne me semble pas que le cas se soit posé précédemment - alors que je suis certain que d'autres utilisent ce plugin et que j'en aurai entendu parler.
S'il s'agit d'un hébergement mutualisé, je pense qu'on peut faire une croix sur les logs (pas sûr qu'ils aient été d'une grande aide mais on ne sait jamais).

En revanche, je ne connaissais pas du tout leur système de vérification ; ce serait effectivement un plus de l'implémenter :)

Mis à jour par Manuel Her il y a plus de 3 ans

-

Mis à jour par Johan Cwiklinski il y a plus de 3 ans

Merci de bien vouloir m'envoyer un mail directement pour les problèmes relatifs à la sécurité. Ce genre d'information ne doit pas être public.

Et par ailleurs, c'est un sujet différent du problème traité ici.

Mis à jour par Manuel Her il y a plus de 3 ans

J'ai travaillé sur ce problème de doublon car ça arrive 1 ou 2 fois par semaine.
J'ai fait un script très simple qui simule les IPNs (que je peux partager). J'ai constaté qu'il y a des moments où le serveur est très long à répondre.

Dans la table PaypalHistory j'ai ajouté 2 champs: la signature de la transaction paypal, et un état (transaction faites, erreur requête en doublon, erreur ajout contribution)
Dans la classe PaypalHistory j'ai ajouté une fonction pour savoir si la transaction paypal a fait l'objet d'un traitement avec succès de galette, et une autre pour mettre à jour l'état de l'IPN en cours.

Je joins ma proposition que j'ai validée.

Manuel

Mis à jour par Johan Cwiklinski il y a plus de 3 ans

Manuel Her a écrit (#note-4):

...
Je joins ma proposition que j'ai validée.

Merci :)

J'ai regardé rapidement, ça me semble correct, j'essaierai d'intégrer ça ce week-end si j'ai du temps ;)

Mis à jour par Johan Cwiklinski il y a plus de 3 ans

  • Statut changé de Nouveau à Résolu
  • % réalisé changé de 0 à 100

Mis à jour par Johan Cwiklinski il y a plus de 3 ans

  • Statut changé de Résolu à Fermé
  • Assigné à mis à Johan Cwiklinski

Salut,

Une légère différence avec la proposition initiale ; j'ai opté pour l'utilisation d'un entier (tinyint/smallint) et de variables dans la classe PaypalHistory plutôt que pour des chaînes. La branche develop est désormais sur Galette 0.9.5, mais j'ai pris soin de commiter la présente modification avant, que le commit soit applicable sur une version antérieure.

Actions

Formats disponibles : Atom PDF