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

PRSTSCcolonDTL
Contributeur
Contributeur

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...) Smiley très heureux

 

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...

Login to Me Too

delta6
Contributeur
Contributeur

Ton script de log semble pas mal, par contre avec tes connexions mysql c'est bien pour ton cas Smiley heureux 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 ?

Login to Me Too

delta6
Contributeur
Contributeur

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 ?

 

Login to Me Too

PRSTSCcolonDTL
Contributeur
Contributeur

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) Smiley tirant la langue 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]

Login to Me Too

delta6
Contributeur
Contributeur

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 Smiley frustré

 

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 Smiley heureux

Login to Me Too

Salisuka
Contributeur
Contributeur

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

 

Login to Me Too

delta6
Contributeur
Contributeur

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.

Login to Me Too

Toulousaing
Contributeur
Contributeur

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...

Login to Me Too

Typiac
Contributeur
Contributeur

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?

Login to Me Too

Typiac
Contributeur
Contributeur

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! 🙂

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.