Bonjour,

Je crée un site internet e-commerce avec paypal, en HTML/CSS et PHP. Mon site internet est un site ou l'utilisateur se connecte, rempli un formulaire avec un identifiant et un mot de passe, choisi les objets qu'il lui plait, les payent avec paypal. Mais lorsque je revient du Paypal Chekout, j'aimerai écrire 'Bonjour Dupont Antoine tu as bien acheter ce t-shirt précis'. Mon problème est que je n'arrive pas à récupérer les variables $SESSION créées dans une autre page.
Merci de votre aide

12 réponses


c.attia
Auteur

Voici ma page de retour du paypal checkout ( j'ai le même paypal.php que le tuto paypal checkout du site) Mais lorsque je fais mon echo SESSION['Nom'] rien ne s'affiche :

    <div class="saluteleve">
    <h1>
      Votre achat s'est bien passé ! <?php  echo $_SESSION['Nom'];?> Vous recevrez un email confirmant votre achat. 

      <br/>
    </h1>
</div>

Alors que j'ai enregistrer cette variable lors d'un formulaire

Est-ce que cette page commence bien par un session_start() ?
Qu'est ce que tu obtiens en faisant un var_dump($_SESSION) ?

c.attia
Auteur

J'ai mis le session_start juste avec le DOCTYPE HTML
Lorsque je fais le var_dump il écrit toute mes variables que j'ai enregistrées mais elles sont égales a null, alors que juste avant le paiement sur Paypal les variables sont bonnes

Est-ce que tu peux mettre ton code en prenant soit de cacher tes clés Paypal s'il te plait ?

c.attia
Auteur

Bien sur, et de toute manière je suis sur Sandbox :
Voici ma classe Paypal.php :


<?php
class Paypal{

    private $user      = "unbusiness_api1.hotmail.com";
    private $pwd       = "x";
    private $signature = "x";
    private $endpoint = "https://api-3t.sandbox.paypal.com/nvp";
    public $errors    = array();

    public function __construct($user = false, $pwd = false, $signature = false, $prod = false){
        if($user){
            $this->user = $user;
        }
        if($pwd){
            $this->pwd = $pwd;
        }
        if($signature){
            $this->signature = $signature;
        }
        if($prod){
            $this->endpoint = str_replace('sandbox.','', $this->endpoint);
        }
    }

    public function request($method, $params){
        $params = array_merge($params, array(
                'METHOD' => $method,
                'VERSION' => '74.0',
                'USER'   => $this->user,
                'SIGNATURE' => $this->signature,
                'PWD'    => $this->pwd
        ));
        $params = http_build_query($params);
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => $this->endpoint,
            CURLOPT_POST=> 1,
            CURLOPT_POSTFIELDS => $params,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_VERBOSE => 1
        ));
        $response = curl_exec($curl);
        $responseArray = array();
        parse_str($response, $responseArray);
        if(curl_errno($curl)){
            $this->errors = curl_error($curl);
            curl_close($curl);
            return false;
        }else{
            if($responseArray['ACK'] == 'Success'){
                curl_close($curl);
                return $responseArray;
            }else{
                $this->errors = $responseArray;
                curl_close($curl);
                return false;
            }
        }
    }

}

Voici mon code lorsque l'utilisateur appuis sur le bouton 'Acheter' :

<?php
            require 'paypal.php';
            $total = 19.0;
            $totalttc = 19.0;
            $port = 0.99;
            $paypal = "#";
            $paypal = new Paypal();
            $params = array(
              'RETURNURL' => 'http://localhost/test/achat.php',
              'CANCELURL' => 'http://localhost/tes/Paypal/cancel.php',

              'PAYMENTREQUEST_0_AMT' => $totalttc + $port,
              'PAYMENTREQUEST_0_CURRENCYCODE' => 'EUR',
              'PAYMENTREQUEST_0_SHIPPINGAMT' => $port,
              'PAYMENTREQUEST_0_ITEMAMT' => $totalttc,
              'L_PAYMENTREQUEST_0_NAME0' => "Formule 1",
              'L_PAYMENTREQUEST_0_DESC' => '',
              'L_PAYMENTREQUEST_0_AMT0' => 19.0,
              'L_PAYMENTREQUEST_0_QTY0' =>1,

            );

            $response = $paypal->request('SetExpressCheckout', $params);
            if($response){
              $paypal = 'https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&useraction=commit&token=' . $response['TOKEN'];
            }else{
              var_dump($paypal->errors);
              die('Erreur ');
            }
            ?>

D'accord. Et le code où tu définies ta session avant Paypal ?

c.attia
Auteur
  while ($donnees = $reponse->fetch()) {
    ?>
    <?php
    if( $_POST['mot_de_passe'] != $donnees['mot_de_passe']  )
    {
      header('Location: index.php');
    }

    ?>
    <div class="saluteleve">

      <h1>
        Bonjour <?php echo $donnees['nom'];?>
        <?php echo $donnees['prenom'];?>
        <?php echo $donnees['classe'];?><br/>
      </h1>
    </div>

    <?php

  }
  $_SESSION['Nom'] = $donnees['nom'];
  $_SESSION['Prenom'] = $donnees['prenom'];
  $_SESSION['Classe'] = $donnees['classe'];

  ?>

Ok. Il semblerait que lorsque Paypal renvoie vers ton site, la demande vient de Paypal et non de l'utilisateur.
Ta session est donc vide puisqu'il s'agit de la session de Paypal.

c.attia
Auteur

Oui, c'est dans RETURNURL, j'ai l'impression qu'il efface les valeurs

c.attia
Auteur

Alors j'ai trouver la bêtise que j'ai fait.
J'ai mis dans SESSION des valeurs provenant de ma bdd, il étaient null de base. Donc c'était normal que ca ne marche pas au final.

Du coup ça fonctionne ? Ta session reste inchangé au retour de Paypal ?

c.attia
Auteur

Oui tout fonctionne comme prévu ! Merci beaucoup ! Maintenant comment mettre ce sujet en résolu ?