Bonjour.
J'ai instaler un script paypal qui fonctionne parfaitement en sandbox mais des que je le met en prod il ne fonctionne plus j'aimerais savoir d'ou peut venir le probléme .

<?php  

$email_account = " @hotmail.fr";
$req = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}
//Stoket paypal ne rien modifier ici sauf ligne 22 en cas de Maj de paypal 
//SANBOX $fp = fsockopen ('ssl://www.sandbox.paypal.com', '443', $errno, $errstr, 30);
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Host: www.paypal.com\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);

foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}

//$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

 //récuperation des Variable $_Post
$item_name = $_POST['item_name'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];

//Variable personalisé 
$id = $_POST['custom'];
parse_str($_POST['custom'], $custom);

$sommeTotalJr = '01.00';  //vérification de la somme. 
$detail = "Transaction Valide";

if (!$fp) {

} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
    $res = fgets ($fp, 1024);
    if (strcmp ($res, "VERIFIED") == 0) {
        // vérifier que payment_status a la valeur Completed
        // En dev mettre Pending en prod Completed PENDING
        if ( $payment_status == "Completed") {
          //vérification de l'email si = a émail de vues
               if ( $email_account == $receiver_email) {
                //bon régard que le mec veut pas nous arnaquér 
                  if ( $payment_amount == $sommeTotalJr)  {

                        include_once dirname(__FILE__).'/../../modeles/paypal/jr/paypalvalide.php';
                    file_put_contents("log",print_r($_POST,true));
                    exit();
                    }
            else 
               { //tentative de fraude 

             include_once dirname(__FILE__).'/../../modeles/paypal/jr/paypalnonvalide.php';
              file_put_contents("log",print_r($_POST,true));
                   }
                }
            }
        else {
            //erreur de payment. 
         include_once dirname(__FILE__).'/../../modeles/paypal/jr/paypalInvalide.php';
          file_put_contents("log",print_r($_POST,true));
       }

   }
    else if (strcmp ($res, "INVALID") == 0) {
    include_once dirname(__FILE__).'/../../modeles/paypal/jr/paypalErreur.php';
    $msg = 'Message de l\'IPN : '.$res;
    mail(' 3@live.fr', 'erreur IPN', $msg);

    }
}
fclose ($fp);
}

10 réponses


Grimille
Réponse acceptée

Mmmh, tu as bien changé la version de HTTP ?
Au pire, la solution se trouve dans leur doc :)

Salut,

J'avais eu le même problème il fut un temps, et cela venait de l'adresse ssl de paypal qui n'était plus la bonne. Je n'ai plus l'adresse exacte en tête étant donné que je boycotte paypal pour payplug désormais. Essaie de regarder de ce côté :)

Dams
Auteur

J'a oublier de prciser que le vendeur reçois bien l'argent mais le client ne reçois rien

Donc ça coince bien au niveau de la requête IPN, vérifie l'adresse de paypal dans la documentation, je pense que le problème vient de là.

Il y a de la duplication de code dans le script notamment au niveau du foreach sur la variable $_POST

Dams
Auteur

Ha oui merci ! j'ai effectuer des recherche sur la doc j'ai trouver ça : https://developer.paypal.com/docs/classic/ipn/gs_IPN/

// Set up the acknowledgement request headers
  $header  = "POST /cgi-bin/webscr HTTP/1.1\r\n";                    // HTTP POST request
  $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
  $header .= "Content-Length: " . strlen($req) . "\r\n\r\n";

  // Open a socket for the acknowledgement request
  $fp = fsockopen('tls://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

  // Send the HTTP POST request back to PayPal for validation
  fputs($fp, $header . $req);

On va essayer en ésperant que ca fonctionne merci de ton aide

Dans leur docs, ils suggèrent de passer à HTTP 1.1, change le :)

C'est bien ce que je disais, l'adresse du socket est ssl://ipnpb.paypal.com désormais :)
Franchement, je te conseille de passer à Payplug qui prélève moins de taxes et permet les paiements par carte bancaire sans obligation d'avoir un compte pour l'utilisateur. Et en plus, c'est une start-up Française !

Dams
Auteur

je vais essayer merci de ton aide don je remplace $fp = fsockopen('tls://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
par ca : ssl://ipnpb.paypal.com

Oui, tout à fait

Dams
Auteur

ça ne fonctione pas :/ sa ne ping même pas l'adresse