Project

General

Profile

Anomalie #1511

Plugin Paypal - Contribution dupliquée

Added by Manuel Her about 1 year ago. Updated about 1 year ago.

Status:
Fermé
Priority:
Normal
Start date:
11/02/2020
Due date:
% Done:

100%

Estimated time:
Vote:

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


Files

stop_doublons.txt (8.83 KB) stop_doublons.txt git diff Manuel Her, 11/13/2020 07:07 PM
#1

Updated by Johan Cwiklinski about 1 year ago

Ç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 :)

#2

Updated by Manuel Her about 1 year ago

-

#3

Updated by Johan Cwiklinski about 1 year ago

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.

#4

Updated by Manuel Her about 1 year ago

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

#5

Updated by Johan Cwiklinski about 1 year ago

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 ;)

#6

Updated by Johan Cwiklinski about 1 year ago

  • Status changed from Nouveau to Résolu
  • % Done changed from 0 to 100
#7

Updated by Johan Cwiklinski about 1 year ago

  • Status changed from Résolu to Fermé
  • Assignee set to 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.

Also available in: Atom PDF