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é
delta6 a écrit :dans ce tuto il y a 1 erreur :
payment_status = $_POST['payment_status']; a remplacer par $payment_status = $_POST['payment_status'];
Exact.
Bravo.
Corrigé.
(au moins y'en a qui lisent les tutos soigneusement...)
Pour ton script, je te suggère de coder le log des erreurs selon les exemples cités précédemment.
Sinon, dès que j'aurai une seconde, je regarderai ton code, mais je n'ai pas trop envie de me transformer en dépanneur gratuit de Paypal, quoi...
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Ton script de log semble pas mal, par contre avec tes connexions mysql c'est bien pour ton cas mais pas pour nous, s'il faut reprendre tout ton code et virer toutes les connexions à la BDD ça va prendre un temps pas possible, n'est-il pas passible d'avoir ce script de log juste avec le retracement du parcour du paiement pour voir là ou ça coince ?
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
J'allucine sur le code php que l'on peut trouver ici ou là et surtout les erreurs que l'on y trouve :
Exemple concernant les if et elseif (en PHP) http://php.net/manual/fr/control-structures.elseif.php il est clairement dit que :
/* Mauvaise méthode : */ if($a > $b): echo $a." est plus grand que ".$b; else if($a == $b): // ne compilera pas echo "La ligne ci-dessus provoque une erreur d'interprétation"; endif; /* Bonne méthode : */ if($a > $b): echo $a." est plus grand que ".$b; elseif($a == $b): // Les deux mots sont collés echo $a." égal ".$b; else: echo $a." est plus grand ou égal à ".$b; endif;
Cette erreur de elseif se retrouve dans le code php du fichier nip.php mais aussi (plus grave) dans le générateur de code fournis par Paypal https://www.paypaltech.com/pdtgen/ je met sérieusement e ndoute les compétences technques de Paypal lorsqu'on voit se type d'erreur se propager de partout et surtout sans que l'on trouve un code propre et sans erreur, de qui se foutons, Paypal empoche des commissions sur nos ventes et nous laissent dans la merde question codage et nous fourguant du code faux !!!!
D'autres erreurs en vrac (fichier world du script nip.php :
<input name="last_name" type="hidden" value="<?=$nom?>"> <input name="first_name" type="hidden" value="<?=$prenom?>"> <input name="address1" type="hidden" value="<?=$adresse1?>"> <input name="address2" type="hidden" value="<?=$adresse2?>"> <input name="city" type="hidden" value="<?=$ville?>"> <input name="zip" type="hidden" value="<?=$cp?>"> <input name="country" type="hidden" value="FR"> <input name="email" type="hidden" value="<?=$email?>"> <input name="custom" type="hidden" value="<?=$idUnique?>"> <input name="night_phone_a" type="hidden" value="<?=$tel?>">
<?=$ville?> ??? Ca serait pas plutôt <?php echo $ville;?> sincèrement les gars testez votre code avant de poster n'importe quoi !!! Et ce n'est qu'un petit exemple....
N'Y A-T-IL PAS QUELQU'UN DE COMPETENT CHEZ PAYPAL QUI EST CHARGE DE REPONDRE SUR CE FORUM ET D'AIDER LES WEBMASTERS ? C'EST QUOI LE BON CODE PHP POUR L'IPN ?
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Kiki, tu commences (légèrement) à abuser.
1° le code qui est dans le tuto marche parfaitement (à la faute de frappe près), tu n'as qu'à voir les précédents messages de remerciement.
2° le code que j'ai posté (créé à partir de celui du tuto vu que c'est le même) marche tous les jours sans difficulté, pourquoi ne marcherait-il pas pour toi parce que tu ne fais pas de SQL, ? Hmmm ? Pourquoi ??? Une faute de frappe aurais-tu faite, jeune Padawan ?
3° si le code que les gentils bénévoles ne te convient pas parce qu'il y a trop de lignes dedans, TU enlèves celles qui ne te conviennent pas et TU testes jusqu'à ce que "ça marche".
Voili voilà.
Courage, quand tu auras trouvé, tu reviendras tout (con)trit et tu nous annonceras ça triomphalement.
[plonk]
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
je ne veux pas polémiquer mais t'as déjà convenu qu'il y avait une erreur dans le tuto payment_status = $_POST['payment_status']; donc si tu faisais un copier/coller de ce script il n'aurait pas marché en l'état + les erreurs du type <?= du même fichier, ça serait un vrai miracle s'il fonctionne correctement en l'état
J'ai tout viré voici mon code du nip.php :
<?php $req = 'cmd=_notify-validate'; foreach ($_POST as $key => $value) { $value = urlencode(stripslashes($value)); $req .= "&$key=$value"; } $header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; $header .= "Host: www.sandbox.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://www.sandbox.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) { 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'].""; } else { // consigner pour enquête manuelle echo "Status INVALID retourné par Paypal"; exit; } } fclose ($fp); } ?>
Et ce code du fichier nip.php me renvoi "Status INVALID retourné par Paypal" avec des paramètres en url du type nip.php?tx=2RB65293DH861351J&st=Completed&amt=43.46&cc=EUR&cm=f9VZmeSCzLCIzuefZ1Rx&item_number=1
Si tu as une piste pour faire fonctionner l'IPN je suis preneur
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
HTTP/1.0 302
Found Location: https://www.sandbox.paypal.com
Server: BigIP
Connection: close
Content-Length: 0
$fp = fsockopen($url,"80",$err_num,$err_str,30);
replace by
$fp = fsockopen('ssl://'.$url,"443",$err_num,$err_str,30);
$url -> 'ssl://'.$ur
"80" -> "443"
And it's work great
Bye
Salisuka
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Voilà ça fait depuis ce week-end que j'ai envoyé un email au support technique de Paypal et aucune réponse.... impossible d'obtenir les variables $_POST['payment_status'] ; $_POST['mc_gross'] ; $_POST['txn_id'] etc... ces variables sont à chaque fois vides !
Le paiement se passe bien, l'url de retour est du style : nip.php?tx=2YW40278PT863213Y&st=Completed&amt=43.59&cc=EUR&cm=wfbPJPpLJf3ce9xt8RQy&item_number=1
J'ai pas avancé d'un poil en 1 semaine... j'ai tout essayé avec la variable $fp = fsockopen ("ssl://www.sandbox.paypal.com", 443, $errno, $errstr, 30); j'ai changé le port 443 en 80, j'ai enlevé le ssl:// mais rien n'y fait....
Quelqu'un a-t-il fait fonctionner la sandbox avec l'IPN ces jours ci pour voir si vous obtenez les variables $_POST : $_POST['payment_status'] ; $_POST['mc_gross'] ; $_POST['txn_id'] etc... ?
Quand je teste l'IPN avec cet outil https://developer.paypal.com/us/cgi-bin/devscr?cmd=_ipn-link-session avec mon url de retour vers mon script nip.php la réponse de Paypal est : IPN successfully sent.
Si ça fonctionne pour vous, pouvez-vous poster votre code IPN afin que je le test ?
Merci pour vos réponses.
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Source du nip.php avec le code de l'error logger : http://www.ddtl.fr/monsite/nip_ano.php.txt
idem pour le pdt.php : http://www.ddtl.fr/monsite/pdt_ano.php.txt
ces deux scripts fonctionnent à ce jour depuis six mois (test effectué à l'instant)
exemple de resultat du log : http://www.ddtl.fr/monsite/nip_log.htm
Faq : http://www.ddtl.fr/monsite/Tutorial_Paypal_php_MySQL_NIP.doc
Good luck
et evitez de me téléphoner le week-end...
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
J'ai testé également et ça ne fonctionne pas dans la sandbox en remplaçant ipnpb.paypal.com par sandbox.paypal.com tout du moins....
As-tu testé ton fichier dans la sandbox également?
- Marquer comme nouveau
- Ajouter en favori
- S'abonner
- Sourdine
- S'abonner au fil RSS
- Surligner
- Imprimer
- Signaler un contenu inapproprié
Ah, j'ai finalment réussi! Je fais un doublon de l'autre sujet dans un soucis d'aider les autres:
Alors pour ceux qui seraient eventuellement bloqués et je pense qu'il s'agit de débutants comme moi qui tentent de tester le script dans la sandbox, il ne faut pas oublier de changer la localisation du serveur en sandbox.paypal.com. Le tuto étant destiné à des "testeurs", je n'ai pas trop compris pourquoi était inscrit:
$fp = @fsockopen ('ssl://ipnpb.paypal.com', 443, $errno, $errstr, 30);
Ensuite, il y a une erreur sur cette ligne dans le script modifié:
$query = "UPDATE utilisateurs SET idTransaction='$txn_id', autorisation='3', date = NOW(), email_a = '$payer_email' WHERE idUnique='$idUnique'";
Il faut en fait enlever enlever le "_a" qui n'est attribué à rien et juste garder:
$query = "UPDATE utilisateurs SET idTransaction='$txn_id', autorisation='3', date = NOW(), email = '$payer_email' WHERE idUnique='$idUnique'";
Voilà, un grand bravo aux bénévoles qui ont élaboré ce tuto! 🙂
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