IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[Paypal] Notification instantanée de paiement


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 126
    Points : 55
    Points
    55
    Par défaut [Paypal] Notification instantanée de paiement
    Bonsoir tout le monde !

    Me revoilà avec une nouvelle question :

    Je tente de mettre en place un système de paiement que je teste pour le moment en local avec la sandbox de paypal.

    Le paiement marche : mon compte acheteur est débité, mon compte receveur est crédité.

    Le problème vient de la notification de paiement instantanée. Je suis sûre à 99% que paypal n'accède pas à mon script ipn.php. En fait j'ai testé d'enregistrer des donnée dans ma BDD au début de mon script ipn.php comme conseillé dans un autre sujet et les donnée ne sont pas enregistrées.

    Donc voilà ça fait 3 jours que je suis là dessus, j'ai cherché des infos un peu partout, testé différentes solutions et rien y fait. J'aurai bien besoin d'un peu d'aide !

    Voilà mes srcipts :

    Bouton paypal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
        <input name="amount" type="hidden" value="<?=$panier->total()?>" />
        <input name="currency_code" type="hidden" value="EUR" />
        <input name="shipping" type="hidden" value="<?=$panier->frais()?>" />
        <input name="tax" type="hidden" value="0.00" />
        <input name="return" type="hidden" value="http://***MonIP***/site/php/successPayment.php" />
        <input name="cancel_return" type="hidden" value="http://***MonIP***/site/php/errorPayment.php" />
        <input name="notify_url" type="hidden" value="http://***Mon IP***/site/php/ipn.php" />
        <input name="cmd" type="hidden" value="_xclick" />
        <input name="business" type="hidden" value="*********.*********-facilitator@outlook.fr" />
        <input name="item_name" type="hidden" value="Commande" />
        <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='user_id=<?=$_SESSION["auth"]->id?>'/>
        <input type="image" src="https://www.sandbox.paypal.com/fr_FR/FR/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal, le réflexe sécurité pour payer en ligne">
        <img alt="" border="0" src="https://www.sandbox.paypal.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
    </form>
    ipn.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    <?php
     
    //permet de traiter le retour ipn de paypal
    $email_account = "*****.**********-facilitator@outlook.fr";
    // prépare la requête de vérification
    $req = 'cmd=_notify-validate';
     
    // ajoute le message IPN au format NVP à la requête de vérification
    foreach ($_POST as $key => $value) {
        $value = urlencode(stripslashes($value));
        $req .= "&$key=$value";
    }
     
    // définition des headers pour la requête de vérification
    $header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
     
    //test
    $header .= "Host: www.sandbox.paypal.com\r\n";
    // production
    //$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";
     
     
    // Ouverture du socket
     
    // test
    $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
    // production
    //$fp = fsockopen ('ssl://ipnpb.paypal.com', 443, $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'];
    parse_str($_POST['custom'],$custom);
     
    // s'il y a une erreur lors de l'ouverture du socket
    if (!$fp) {
      // on s'envoie un mail pour être informé de l'erreur
      $msg = "Erreur de socket, l'url n'a pas pu être ouverte";
      mail('*******.******@outlook.fr', 'erreur socket', $msg);
    }
     
    else {
      // on post la requête de vérification
      fputs ($fp, $header . $req);
     
      // créé une boucle tant qu'on est pas arrivé à la fin du fichier
      while (!feof($fp)) {
        // lit la réponse de paypal
        $res = fgets ($fp, 1024);
        if (strcmp ($res, "VERIFIED") == 0) {
        // vérifier que payment_status a la valeur Completed
          if ( $payment_status == "Completed") {
             if ( $email_account == $receiver_email) {
                /**
                 * C'EST LA QUE TOUT SE PASSE
                 * PS : tjrs penser à vérifier la somme !!
                 */
     
                if($payment_amount == ($panier->total() + $panier->frais())){
     
                  require_once 'db.php';
     
                  $saveBDD = $pdo->prepare('INSERT INTO orders SET (user_id, txn_paypal_id, amount) VALUES(:user_id, :txn_paypal_id, :amount)');
                  $saveBDD->execute(array(
                    'user_id' => $custom['user_id'],
                    'txn_paypal_id' => $txn_id,
                    'amount' => $payment_amount
                  ));
     
                }
                else{
                  mail('*****.**********@outlook.fr', '$objet', '$message');
                }
             }
             else{
                header('location:'.'errorPayment.php');
             }
          }
          // si la transaction est invalide
          else if (strcmp ($res, 'INVALID') == 0) {
            // on s'envoie un mail pour être informé de l'erreur
            $msg = 'Message de l\'IPN : '.$res;
            mail('*******.********@outlook.fr', 'erreur IPN', $msg);
          }
        } 
     
        fclose ($fp);
      }
    }
    ?>
    Voilà, j'espère que vous pourrez m'aider !

  2. #2
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 126
    Points : 55
    Points
    55
    Par défaut
    Personne ?

    Je précise que j'ai activé les IPN dans les paramètres Paypal (je me suis rendue compte qu'elles ne l'étaient pas). Mais aucune différence en live comme en local.

    Help !!

    Merci d'avance

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    parse_str($_POST['custom'],$custom);
    elle est définie $custom?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    'INSERT INTO orders (user_id, txn_paypal_id, amount) VALUES(:user_id, :txn_paypal_id, :amount)';

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 126
    Points : 55
    Points
    55
    Par défaut
    Salut, merci de ta réponse je commençais à désespérer, j'ai toujours des réponses rapides d'habitude ! ^^

    J'ai modifié ma requête sql comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    require_once 'db.php';
       $saveBDD = $pdo->prepare('INSERT INTO orders SET user_id = ? txn_paypal_id = ? amount = ?');
       $saveBDD->execute([
          $custom['user_id'],
          $txn_id,
          $payment_amount
       ]);
    Et $custom est définie à la ligne 15 de mon bouton paypal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input name="custom" type="hidden" value='user_id=<?=$_SESSION["auth"]->id?>'/>
    Mais comme je l'ai dit, en mettant juste une requête toute simple et uniquement cela au début de mon script ipn.php, celle-ci n'est pas exécutée.
    J'ai feinté en passant par successPayment.php. Mais les entrées en BDD ne sont pas sécurisée vu que je n'ai pas les infos paypal...

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    L'adresse c'est
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $req = '?cmd=_notify-validate';

    a part ca jvois pas tu n'es pas en local?

    les notifications 'instantanées' de Paypal mettent beaucoup de temps a arriver (plusieurs minutes suivant la methode choisie) peut etre que ta requête s'est effectuée quand elle était tout en haut de ton script mais 5min apres ou tu as probablement modifié le fichier avant meme que la notifcation arrive

  6. #6
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 126
    Points : 55
    Points
    55
    Par défaut
    J'ai testé en local et en live.
    Mais effectivement je n'ai pas attendu 5 min pour modifier mon script ^^
    Je vais tester en faisant la modif que tu me proposes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = '?cmd=_notify-validate';
    Et en patientant

    Je vous redis !

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    Je pense que l'erreur doit aussi survenir qu'il n'y a pas de verification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(isset($_POST['nom'])) {

Discussions similaires

  1. Notification instantanée de paiement PayPal
    Par MrSaooty dans le forum Langage
    Réponses: 1
    Dernier message: 11/03/2014, 12h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo