Retour IPN paypal invalide
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Bonjour,
J'essai de mettre en place un module de paiement paypal avec un retour IPN.
J'ai créé des comptes tests acheteur et vendeur sur https://developer.paypal.com/, j'ai paramétré mon paiement avec l'adresse mail du compte test vendeur et j'ai bien activé le retour IPN.
J'indique bien les url de retour et celle du retour IPN (notify_url). Ma page de notify_url est bien appelé mais quand je renvoi sur cette page les données à paypal pour vérification la réponse de paypal n'est jamais "VERIFIED" même si le paiement est valide...
La réponse que j'obtiens est la suivante :
HTTP/1.0 302 Found
Location: https://www.sandbox.paypal.com
Server: BigIP
Connection: close
Content-Length: 0
Ma question est pourquoi ? et comment régler ce problème ?
Voici mon code de page notify_url :
<?php // lire le formulaire provenant du système PayPal et ajouter 'cmd' $req = 'cmd=_notify-validate'; foreach ($_POST as $key => $value) { $value = urlencode(stripslashes($value)); $req .= "&$key=$value"; } // renvoyer au système PayPal pour validation $header .= "POST /cgi-bin/webscr HTTP/1.0\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; $fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30); $item_name = $_POST['item_name']; $id_commande = clean_var($_POST['item_number'],1); $payment_status = $_POST['payment_status']; $payment_amount = $_POST['mc_gross']; // verif total $payment_currency = $_POST['mc_currency']; // verif EUR $txn_id = $_POST['txn_id']; $receiver_email = $_POST['receiver_email']; $payer_email = $_POST['payer_email']; $id_user = $_POST['custom']; if(!$fp){ // ERREUR HTTP }else{ fputs ($fp, $header . $req); while(!feof($fp)){ $res = fgets ($fp, 1024); // Mon code bloque ici car ne valide jamais cette condition, ni le else car je ne reçois ni VERIFIED ni INVALID if(strcmp ($res, "VERIFIED") == 0){ // vérifier que payment_status a la valeur Completed if($payment_status == "Completed"){ if("mon_email_de_test" == $receiver_email){ // vérifier que payment_amount et payment_currency sont corrects // traiter le paiement } }else{ // Mauvaise adresse email paypal } }else{ // Statut de paiement: Echec } }else if(strcmp($res, "INVALID") == 0) { // Transaction invalide } } fclose ($fp); } ?>
Merci par avance pour votre aide.
Cordialement.
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Tu as fait ce qu'il y a dans le tuto ?
http://www.ddtl.fr/monsite/Tutorial_Paypal_php_MySQL_NIP.doc
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Oui j ai bien suivi ce guide mais j ai tjs la meme erreur.
en retour du fsockopen :
j ai çà :
HTTP/1.1 200 OK
Date: Tue, 24 Jul 2012 18:17:26 GMT
Server: Apache
X-Frame-Options: SAMEORIGIN
Set-Cookie: cwrClyrK4LoCV1fydGbAxiNL6iG=A8hLUY_5MJXZ4jNfrbYfskJi4Cyt96BWNjms_tVZmqPciNf__Mwuey6kVtSW952muVnjvUKoq6z3JAw-7yXFDbWivrMiCPEe52d63cp2aEGLR2tp_DGbCBirDQO%7cutCuKq2J7nioUhW3h5qs8ObL70d4MCrEduMsYq1ozjKTyut9oP_v2UEa6jPCgm4Tf84UAm%7cv9jF9Xbx3vGuDHATnfP9ZnjAPtcTxjawk2acLRHzHFXCSLr30X5Gcd0SdRlK1eUBkB9Lj0%7c1343153846; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: cookie_check=yes; expires=Fri, 22-Jul-2022 18:17:26 GMT; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: navcmd=_notify-validate; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: navlns=0.0; expires=Mon, 19-Jul-2032 18:17:26 GMT; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: Apache=10.73.8.53.1xxx1; path=/; expires=Thu, 17-Jul-42 18:17:26 GMT
Vary: Accept-Encoding
Strict-Transport-Security: max-age=14400
Connection: close
Content-Type: text/html; charset=UTF-8
Merci de votre aide
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
tu trouveras les sources de mon pdt.php et de mon nip.php ici :
http://www.ddtl.fr/jtuj/pdt.php.txt
http://www.ddtl.fr/jtuj/nip.php.txt
Ils comportent une fonction de log dont j'ai déjà parlé ici.
Ce log ressemble à ça :
http://www.ddtl.fr/monsite/nip_log.htm.txt
Avec tout ça, tu devrais t'en sortir.
A+
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Génial, super, nickel, impec
MERCI pour ton aide, j'ai enfin réussi.
Par contre, j'ai modifié ausi mon serveur JOOMLA pour qu'il autorise les pages SSL.
celà a peu être un rapport.
en tout cas, ta page nip.php est une pure merveille
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Bonjour Remifa,
Avez-vous essayé de désactiver puis de reactiver votre IPN
1. Connectez-vous à votre compte PayPal.
2. Cliquez sur 'Préférences' en haut de la page puis sur 'Mes ventes'.
3. Cliquez sur 'Mettre à jour' en face de 'Notifications instantanées de paiement' dans la rubrique 'Obtenir des paiements et gérer des risques'.
4. Cliquez sur 'Choisir les paramètres IPN'.
5. Saisissez l'URL à laquelle doivent être envoyées les publications HTML.
6. Sélectionner ‘Recevoir les messages IPN (activé)’.
7. Cliquez sur 'Enregistrer'.
Vous venez de réactiver la fonction 'Notification instantanée de paiement'.
Pour toutes informations complémentaires, vous pouvez consulter les différentes fiches techniques mises à votre disposition sur https://ppmts.custhelp.com/
Choisissez votre langue puis tapez IPN dans la barre de recherche.
Vous pouvez également cliquez sur posez une question, vous remplissez la fiche afin qu'un technicien de PayPal vous contact dans les meilleurs délais
Cordialement
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Oui, c'est une piste, mais cela ne dira pas pourquoi il n'a pas son VALID. C'est un peu comme les produits Microsoft 😞 quand ca plante, on reboute, mais on ne saura jamais pourquoi ça a planté...
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Salut à tous,
J'ai suivi à la lettre les indications fournis dans ce tuto http://www.ddtl.fr/monsite/Tutorial_Paypal_php_MySQL_NIP.doc mais j'ai une erreur "Status INVALID retourné par Paypal".... 3 jours que je test des bouts de codes sans aucune résultat, je vais devenir dingue !!!
Est-ce qu'on peut tester avec la sandbox.paypal à partir de notre site en local http://127.0.0.1/ ?
J'ai mis dans mon compte business de test "Préférences de Notification instantanée de paiement" un lien vers mon script http://127.0.0.1/......nip.php (en local), est-ce que ça fonctionnera ou pas ?
Lorsque paypal me renvoie vers mon srcipt nip.php (en local) j'ai ça dans l'url :
nip.php?tx=2YW40278PT863213Y&st=Completed&amt=43.59&cc=EUR&cm=wfbPJPpLJf3ce9xt8RQy&item_number=1
Je mettais dit tiens je vais mettre Paypal comme moyen de paiement, avec plus de 100 millions de comptes ouverts dans le monde ça devrait être du gateau de trouver pour installer tout cela, j'étais loin d'imaginer la galère que cela allait être...
Merci pour votre aide.
Bruno
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Là, il faut les moyens lourds.
Si t'as lu le tuto et que "ca marche pô", tu as droit au source "Kitu" :
Un exemple de fichier de log est ici : ddtl.fr/monsite/nip_log.htm
Avantage du truc, dès que ton script a un éternuement, tu as la trace dans le log.
ca facilite le debugging...
Pour le test en local, niet, PP ne peut pas accéder ton serveur en local (sauf si tu as configuré une DMZ sur ta Box, mais bon, on s'égare, là)
Et comme je te trouve sympathique et courageux, pour le même prix tu as le source du pdt.php :
Goude leuque
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
dans ce tuto il y a 1 erreur :
payment_status = $_POST['payment_status']; a remplacer par $payment_status = $_POST['payment_status'];
D'autre part dans ce code :
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Host: ipnpb.paypal.com:443\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://ipnpb.paypal.com', 443, $errno, $errstr, 30); // réel
Il serait bien de mettre en variable l'url de test (sandbox.paypal) et l'url de production (ipnpb.paypal), du style :
// Test : $target_paypal = "sandbox.paypal";
// Production : $target_paypal = "ipnpb.paypal";
$target_paypal = "sandbox.paypal";
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Host: ".$target_paypal.".com:443\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://'.$target_paypal.'.com', 443, $errno, $errstr, 30);
J'ai fait ces modifs mais même comme cela j'ai maintenant une page entièrement blanche qui s'affiche lorsque Paypal me renvoie sur ma page nip.php !!! Je pige rien de rien, voici le code ma page nip.php :
<?php session_start(); $split = explode("+", $_SESSION['abonnnement']); $req = 'cmd=_notify-validate'; foreach ($_POST as $key => $value) { $value = urlencode(stripslashes($value)); $req .= "&$key=$value"; } // Test : $target_paypal = "sandbox.paypal"; // Production : $target_paypal = "ipnpb.paypal"; $target_paypal = "sandbox.paypal"; $header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; $header .= "Host: ".$target_paypal.".com:443\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; $fp = fsockopen ('ssl://'.$target_paypal.'.com', 443, $errno, $errstr, 30); if (!$fp) // ERREUR HTTP { echo "%NIP-F-SOCKOPEN, HTTP error " . $errno . " " . $errstr; exit; } else { /* Paypal renvoie à notre script nip.php, toute une série de données qu'il faut traiter pour pouvoir les réutiliser : */ $payment_status = $_POST['payment_status']; // Si Completed : tout est OK $payment_amount = $_POST['mc_gross']; // montant payé $txn_id = $_POST['txn_id']; // id Paypal de la transaction $receiver_email = $_POST['receiver_email']; // mail du vendeur $payer_email = $_POST['payer_email']; // mail de l'acheteur $first_name = $_POST['first_name']; // prénom de l'acheteur $last_name = $_POST['last_name']; // nom de l'acheteur $idUnique = $_POST['custom']; // notre id unique de transaction $pending_reason = $_POST['pending_reason']; // raison si paiement en attente $payment_currency = $_POST['mc_currency']; // devise du paiement fputs ($fp, $header . $req); while (!feof($fp)) { $res = fgets ($fp, 1024); if (strcmp ($res, "VERIFIED") == 0) { /* Afin d'éviter tout problème de paiement, il faut vérifier les paramètres suivants : Vérifier que payment_status est Completed Vérifier que txn_id n'a pas été précédemment traité (par nous) Vérifier que receiver_email est votre adresse email PayPal principale Vérifier que payment_amount et payment_currency sont corrects Traiter le paiement (enregistrer dans la base que le paiement a été fait) A partir de là, Paypal ne fournit plus de code ... C'est à nous de jouer. On va donc vérifier que chaque condition est OK, puis modifier la base. */ switch ($payment_status) { case "Completed" : // Le paiement est terminé normalement if ($idUnique != $split[0]) // Si l'Id de Transaction est déjà dans la base de données on attribue 1 à $erreur. $erreur = 1; // email business = ok ? if ($receiver_email != "$email_paypal") $erreur = 2; // montant reglé = tarif du service ? if ($payment_amount != $split[10]) $erreur = 3; // devise pour régler = devise acceptée ? // On avait définit l'Euro comme devise. if ($payment_currency != $split[11]) $erreur = 4; /* Voilà, maintenant qu'on a vérifié toutes les conditions, il ne reste plus qu'à mettre à jour la base de données, pour activer le compte de l'utilisateur qui vient de payer. */ if (!isset($erreur)) { // Il n'y pas d'erreur, sinon vous devez en prévoir la gestion. echo "Tout fonctionne parfaitement :<br><br> payment_status = $payment_status<br> payment_amount = ".$_POST['mc_gross']."<br> txn_id = ".$_POST['txn_id']."<br> receiver_email = ".$_POST['receiver_email']."<br> payer_email = ".$_POST['payer_email']."<br> first_name = ".$_POST['first_name']."<br> last_name = ".$_POST['last_name']."<br> idUnique = ".$_POST['custom']."<br> pending_reason = ".$_POST['pending_reason']."<br> payment_currency = ".$_POST['mc_currency'].""; /* Pour faire encore plus chic, vous pouvez même envoyer un E-mail au client pour lui confirmer que son paiement a été accepté et que son compte est activé. Ca ne fonctionne que si votre serveur est paramétré pour envoyer les mails... */ } break; } } else if (strcmp ($res, "INVALID") == 0) { // consigner pour enquête manuelle echo "Status INVALID retourné par Paypal"; exit; } } fclose ($fp); } ?>
Voyez-vous une erreur ?
Haven't Found your Answer?
It happens. Hit the "Login to Ask the community" button to create a question for the PayPal community.
- Litige GearBest et retour de Paypal : Paypal protège plus le vendeur que l'acheteur dans Les Archives
- problème avec retour objet dans Les Archives
- litige traité à la légère par paypal dans Les Archives
- frais de retour remboursés paypal dans Les Archives
- Remboursement Paypal non crédité depuis plus d'un mois dans Les Archives