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

remifa
Contributeur
Contributeur

 

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

 

Login to Me Too

PRSTSCcolonDTL
Contributeur
Contributeur

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+

Login to Me Too

remifa
Contributeur
Contributeur

Chat heureux

 

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

 

 

Login to Me Too

PRSTSCcolonDTL
Contributeur
Contributeur

ébé, ca fait plaisir ! Smiley heureux

Login to Me Too

PayPal_Patrice
Employé PayPal
Employé PayPal

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

 

 

 

Login to Me Too

PRSTSCcolonDTL
Contributeur
Contributeur

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

Login to Me Too

delta6
Contributeur
Contributeur

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

Login to Me Too

PRSTSCcolonDTL
Contributeur
Contributeur

Là, il faut les moyens lourds. Smiley heureux

Si t'as lu le tuto et que "ca marche pô", tu as droit au source "Kitu" :

 

source

 

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 :

 

source

 

Goude leuque

Login to Me Too

delta6
Contributeur
Contributeur

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 ?

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.