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);
}
}
?> |
Partager