Retour IPN paypal invalide

Jemeca
Nouveau membre de la communauté

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.

 

Login to Me Too
49 RÉPONSES 49

Adips
Contributeur
Contributeur

Attention à bien cibler le problème.

Pour ma part, l'appel de Paypal vers ma page IPN, la notification immédiate de paiement, fonctionne depuis des années. Sauf que quelquefois, depuis le 9 mars, 1 appel sur 100 environ, le "VERIFIED" est remplacé par "</body></html>".

 

Certains peuvent être amenés à confondre ce problème avec celui des renvois de pages pour le client , lorsqu'il a fini de payer. Si en fin de paiement le client clique sur le bouton de retour au site, affiché sur la page Paypal, là ça ne fonctionne plus depuis le 7 mars après-midi. A la place des variables, Paypal renvoie un truc du genre "merchant_return_link=cliquez+ici&form_charset=UTF-8". L'envoi des variables est normal quand le client ne clique pas sur ce bouton et utilise le renvoi automatique.

 

Et il y a aussi possibilité de problème à partir du bouton de paiement lui-même, un espace en trop dans l'adresse e-mail ou un caractère invisible. Là ça plante dès l'envoi du paiement, c'est tout à fait différent, mais je le signale pour les lecteurs tentés d'assimiler ce type de problème à ceux évoqués sur ce post.

 

Enjoy ! 🙂

Login to Me Too

PRSTSCcolonDTL
Contributeur
Contributeur

Exact, mais la cause principale, du moins il me semble, était que Paypal a changé l'adresse de son serveur SSL.

 

Avant le code (réel,  pas celui de la sandbox) était :

 

$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 ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

 

Maintenant il doit être :

 

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

 

et là, mon problème a disparu.

 

J'ai mis à jour le tuto dont l'adresse est donnée dans mon post précédent.

J'ai aussi ajouté un article sur php et MySQL (succint) dans le site "Gestion des erreurs et scripts Windaube" : http://www.didiermorandi.fr/vbscript/

 

A+

Login to Me Too

Adips
Contributeur
Contributeur

Pour ma part, comme je l'indiquai précédemment, je n'ai pas de problème depuis la mise en place du code sur la page IPN, il y a quelques années (à part les rares petis déraillements sur les VERIFIED)..

 

Je constate qu'il est tout à fait obsolète, d'après ce que je viens de lire du post de PRSTSCcolonDTL que je salue.

Mais vu qu'il fonctionne toujours, en voici l'adressage :

 

  $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.paypal.com', 80, $errno, $errstr, 30);

 

si ça peut aider ... 🙂

 

Login to Me Too

PRSTSCcolonDTL
Contributeur
Contributeur

Salut retourné.

 

Alors voilà qui est intéressant.

 

Je m'en vais de ce pas mettre l'ancienne config et voir ce qui se passe.

Vu que j'ai développé un journalling exhaustif de nip.php ( voir : http://www.didiermorandi.fr/vbscript/php.htm#b5 )

on devrait appendre des trucs Smiley heureux

 

EDIT : petite nuance, tu n'utilises pas SSL...

 

(Hé, Adips, si tu peux mettre ton code en Courier new, cela facilite la lecture...)

Login to Me Too

Adips
Contributeur
Contributeur

A noter que ce n'est pas par esprit de fronde que je n'ai pas mis le ssl.

Simplement, c'était comme ça avant 🙂

Ceci-dit, est-ce que le fait de ne pas passer par ssl accélère les réponses et que certains problèmes rencontrés puissent justement être liés aux délais de réponses, par principe plus longs en sécurisé ???

Là j'avoue mon incompétence pour un avis technique.

 

Et pour faire plaisir à PRSTSColorDTL :

 

  $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.paypal.com', 80, $errno, $errstr, 30);

Login to Me Too

PRSTSCcolonDTL
Contributeur
Contributeur

Merci Smiley heureux

 

J'ajoute qu'il y a une faute de frappe dans mon message de la page précédente.

Il y a une parenthèse en trop à la fin du nom du fichier Tutorial_Paypal_php_MySQL_NIP.doc

ce qui génère une erreur 404 dans mon log Apache :

 

404|2012-05-01 19:04:33.00|GET /monsite/Tutorial_Paypal_php_MySQL_NIP.doc)|8*.16*.18*.7*

 

 J'ai donc dupliqué le fichier avec le nom Tutorial_Paypal_php_MySQL_NIP.doc) (le serveur où se trouve mon site n'a visiblement pas été gêné de cette dénomination fantaisiste) et je n'ai plus d'erreur 404...

Login to Me Too

Meinarth
Contributeur
Contributeur

Petit up de ce sujet,

 

J'ai le même problème. J'ai bien suivi le tuto de PRSTSCcolonDTL mais le problème reste le même. Y a t il une solution ?

 

Merci d'avance.

Login to Me Too

PRSTSCcolonDTL
Contributeur
Contributeur

Si tu ne nous dis pas ton problème, on ne risque pas de pouvoir t'aider... Chat très heureux

Login to Me Too

ademus
Contributeur
Contributeur

 the test paypal server moved to :
$fp = fsockopen ('ssl://ipnpb.paypal.com', 443, $errno, $errstr, 30);

Login to Me Too

remifa
Contributeur
Contributeur

Bonjour,

J'ai le même soucis : INVALID IPN, je n'arrive pas à avoir VERIFIED.

 

J'ai essayé toutes ces adresses, SSL ou non, même en SandBox

 

 $fp = fsockopen ('ssl://'.$paypal['serveur'], "443", $errno, $errstr, 30);   // pour test
    //$fp = fsockopen ($paypal['serveur'], 80, $errno, $errstr, 30);

 

  $paypal['serveur'] = 'ipnpb.paypal.com';
    //$paypal['serveur'] = 'www.paypal.com';

 

Je gère moi même les retour Paypal depuis un serveur Joomla.

Merci de votre aide

 

Login to Me Too

Haven't Found your Answer?

It happens. Hit the "Login to Ask the community" button to create a question for the PayPal community.