Paypal

Fermé
Meinarth Messages postés 4 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 17 mai 2012 - 17 mai 2012 à 13:59
Bonjour,

Je sollicite votre aide car j'ai un problème avec l'intégration de paypal sur l'un de mes sites. J'arrive à diriger les utilisateurs vers la sandbox de paypal (pour effectuer mes tests, c'est en post production) avec le formulaire suivant :

<form action="https://www.sandbox.paypal.com/us/home" method="post" style="clear:both;padding:30px 0px 0px 150px;">
                <input type='hidden' value="<?php echo $prix_total;?>" name="amount" />
                <input name="currency_code" type="hidden" value="EUR" />
                <input name="shipping" type="hidden" value="0.00" />
                <input name="tax" type="hidden" value="0.00" />
                <input name="return" type="hidden" value="<?php echo $url;?>index.php?page=paiement_valide" />
                <input name="cancel_return" type="hidden" value="<?php echo $url;?>index.php?page=panier" />
                <input name="notify_url" type="hidden" value="<?php echo $url;?>index.php?page=validation_paiement" />
                <input name="cmd" type="hidden" value="_xclick" />
                <input name="business" type="hidden" value="geof_1336945921_biz@live.fr" />
                <input name="item_name" type="hidden" value="Payer" />
                <input name="no_note" type="hidden" value="1" />
                <input name="lc" type="hidden" value="FR" />
                <input name="bn" type="hidden" value="PP-BuyNowBF" />
                <input name="custom" type="hidden" value="<?php echo $_SESSION['vetlingerie_id_user_glob'];?>" />
                <input alt="Effectuez vos paiements via PayPal : une solution rapide, gratuite et sécurisée" name="submit" src="https://www.paypalobjects.com/fr_FR/FR/i/btn/btn_buynow_LG.gif" type="image" style="border:none;"/><img src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" border="0" alt="" width="1" height="1" />
</form>


Une fois sur le site de paypal, j'effectue le paiement et je décide de retourner sur mon site afin de voir si le paiement a bien été traité ou non. J'utilise le script suivant :

//var_dump($_POST);
        
        // 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.paypal.com', 443, $errno, $errstr, 30);
        $fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);
        
        $item_name = $_POST['item_name'];
        $item_number = $_POST['item_number'];
        $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'];
        $payer_email = $_POST['payer_email'];
        $id_user = $_POST['custom'];
        
        if (!$fp)
        {
            echo "Problème de connexion avec Paypal, les données IPN n'ont pas pu être repostées";
        }
        else
        {
            fputs ($fp, $header . $req);
            while (!feof($fp))
            {
                $res = fgets ($fp, 1024);
                
                if (strcmp ($res, "verified") == 0)
                {
                    echo "test";
                    // transaction valide
                    // vérifier que payment_status a la valeur Completed
                    if ( $payment_status == "Completed")
                    {
                        // vérifier que txn_id n'a pas été précédemment traité: Créez une fonction qui va interroger votre base de données
                        /*
                        if (VerifIXNID($txn_id) == 0)
                        {
                            // vérifier que receiver_email est votre adresse email PayPal principale
                            if ( "geof_1336945921_biz@live.fr" == $receiver_email)
                            {
                                // vérifier que payment_amount et payment_currency sont corrects
                                // traiter le paiement
                                echo "Ca marche";
                            }
                            else
                            {
                                // Mauvaise adresse email paypal
                                echo "Problème de configuration de paypal, le traitement n'a pas pu être réalisé.";
                            }
                        }
                        else
                        {
                            // ID de transaction déjà utilisé
                        }
                        */
                    }
                    else
                    {
                        // Statut de paiement: Echec
                        echo "La transaction a échouée et n'a pas pu être réalisée.";
                    }
                }
                else if (strcmp ($res, "INVALID") == 0) {
                    // Transaction invalide
                    echo "La transaction est invalide et n'a pas pu être réalisée.";
                }
            }
            fclose ($fp);
            
        }


J'ai retrouvé ce formulaire sur de nombreux sites / tutoriels. La seule variante étant au niveau du port utilisé : 443 et 80. Avec le port 443 le formulaire ne fonctionne pas, j'utilise donc le port 80.

Le problème se trouve au niveau de cette vérification :

$res = fgets ($fp, 1024);
                
                if (strcmp ($res, "verified") == 0)
                {

                }


La requête ne trouve pas verified. Pourtant quand je fais un var_dump de la variable $_POST, je trouve bien un champ payer_status qui contient la valeur verified. Je suppose que c'est bien la variable que nous recherchons...

Si vous pouviez m'aider !

Merci d'avance !

P.S. : Apparemment, ça peut être lié à

$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);

J'ai également essayé avec :
$fp = fsockopen ('www.sandbox.paypal.com', 443, $errno, $errstr, 30);
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);