Identifiant unique IPN PayPal
J'ai toujours supposé que txn_id
envoyé avec le message IPN est unique. Les directives PayPal semblent soutenir cette idée - https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro
Évitez les messages IPN en double. Vérifiez que vous n'avez pas déjà traité la transaction identifiée par l'ID de transaction renvoyé dans le message IPN. Vous devrez peut-être stocker les ID de transaction renvoyés par les messages IPN dans un fichier ou une base de données afin de pouvoir vérifiez les doublons. Si L'ID de transaction envoyé par PayPal est un doublon, vous ne devez pas le traiter à nouveau.
Cependant, j'ai trouvé que l'IPN de paiement eCheck de PayPal est envoyé deux fois avec le même ID de transaction. Une fois pendant le paiement initial avec payment_status
comme "en attente" et à nouveau après quelques jours où eCheck est en fait traite avec payment_status
comme "terminé".
Je veux stocker les deux transactions, mais je voudrais toujours éviter de stocker les doublons. Il y a un autre champ dans IPN appelé ipn_track_id
et c'est différent pour les deux transactions, mais je ne trouve pas de documentation pour cela, sauf cette description vague:
Interne; uniquement pour une utilisation par MTS et DTS
Quelqu'un d'autre utilise ipn_track_id
pour identifier de manière unique les messages IPN?
5 réponses
ipn_track_id
ne devrait pas être utilisé; principalement parce que c'est pour un usage interne seulement comme indiqué, et parce qu'il est unique pour chaque message IPN.
L'txn_id
est unique pour chaque transaction, pas chaque IPN message.
Ce que cela signifie est; une transaction peut avoir plusieurs messages IPN. eCheck, par exemple, où il ira dans un État "en attente" par défaut, et "complet" Une fois que l'eCheck est effacé.
Mais vous pouvez également voir des inversions, des inversions annulées, des cas ouverts et remboursements sur le même txn_id
.
Pseudo code:
If not empty txn_id and txn_type = web_accept and payment_status = Completed
// New payment received; completed. May have been a transaction which was pending earlier.
Update database set payment_status = Completed and txn_id = $_POST['txn_id']
If not empty txn_id and txn_type = web_accept and payment_status = Pending
// New payment received; completed
Update database set payment_status = Pending and payment_reason = $_POST['pending_reason'] and txn_id = $_POST['txn_id']
Vous pouvez trouver beaucoup plus de variables IPN répertoriées sur https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_IPNandPDTVariables#id08CTB0S055Z
Fondamentalement; PayPal va générer un identifiant de transaction de vendeur unique. Cet ID de tranaction peut passer par différentes étapes avant d'être "terminé", vous devrez donc être capable de gérer ces exceptions.
Comme pour la note de PayPal dans la documentation: PayPal peut renvoyer des messages IPN individuels s'il rencontre des erreurs lors de la livraison. Par exemple, il est nécessaire que votre script renvoie une réponse HTTP / 1.1 200 OK HTTP status appropriée chaque fois que PayPal POST contient les données IPN.
Si vous ne renvoyez pas une réponse HTTP/1.1 200 OK, PayPal tentera de nouveau d'envoyer les mêmes données jusqu'à 16 fois par message IPN individuel.
Remarque: l'ID de transaction d'un vendeur est différent de l'ID de transction d'un acheteur, car ils sont deux différents actions (un débit, un crédit).
Ipn_track_id n'est pas unique pour les paiements récurrents. Au moins pour le plan de versement, ce n'est pas le cas. Lorsque le client crée le plan de versement et si votre plan a un premier paiement à la caisse, vous recevrez 2 messages IPN avec le même ipn_track_id (exemple ci-dessous).
Première notification "recurring_payment_profile_created" le premier paiement" recurring_payment "
Plan créé IPN
[txn_type] => recurring_payment_profile_created
[recurring_payment_id] => I-57UAPHFJ3SBY
[product_name] => Risk-Free Trial
[time_created] => 06:24:39 Aug 15, 2013 PDT
[ipn_track_id] => bdd94fdee935a
Premier Paiement IPN
[txn_type] => recurring_payment
[mc_gross] => 10.95
[shipping] => 0.00
[product_type] => 1
[time_created] => 06:24:39 Aug 15, 2013 PDT
[ipn_track_id] => bdd94fdee935a
Tous les messages IPN ne contiennent pas de $_POST ['txn_id'], donc si vous vérifiez uniquement un txn_id, vous pouvez par intermittence ne pas enregistrer les messages IPN où ils ne contiennent pas cette clé.
Dans mon appel D'API PHP, j'utilise ces champs et les stocke dans ma base de données:
custom=xxxx
(ou invoice=ZZZZZZ
)
Ensuite, lorsque votre page reçoit IPN, il devrait vérifier (à partir de la base de données) si le custom=xxxx
ou etc...
Les transactions IPN sont uniques, et les transactions qui modifient le paiement généreront un nouveau txn_id. Par exemple, les remboursements, donc c'est une bonne idée de stocker tous les txn_id liés à un seul achat. Pour l'instant, je ne sais pas quelles transactions autres que les remboursements génèrent un nouveau txn_id, éventuellement les inversions le font aussi.