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 !