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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
<?php
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value)
{
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
$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 ('ssl://ipnpb.paypal.com', 443, $errno, $errstr, 30);
$payment_status = $_POST['payment_status']; // Si Completed : tout est OK sinon aïe, aïe !
$payment_amount = $_POST['mc_gross'];
// Identifiant de la transaction
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
// On récupère notre identifiant unique
$idUnique = $_POST['custom'];
// Raison pour laquelle le paiement a été placé en attente.
$pending_reason = $_POST['pending_reason'];
// Devise de paiement
$payment_currency = $_POST['mc_currency'];
if (!$fp)
{
// ERREUR HTTP
}
else
{
fputs ($fp, $header . $req);
while (!feof($fp))
{
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0)
{
/*
Afin d'éviter tout problème de paiement, il faut vérifier les paramètres suivants :
Vérifier que payment_status est Completed
Vérifier que txn_id n'a pas été précédemment traité
Vérifier que receiver_email est votre adresse email PayPal principale
Vérifier que payment_amount et payment_currency sont corrects
Traiter le paiement
A partir de là, Paypal ne fournit plus de code ... C'est à nous de jouer. On va donc vérifier que chaque condition est OK, puis modifier la base.
*/
/* CONNECTION A LA BASE DE DONNEES */
$conn = @mysql_connect( "localhost", "bistic", "******") or die ( "erreur: connexion à la base" );
$rs = @mysql_select_db( "bisticbase", $conn) or die ( "erreur: base de données" );
switch ($payment_status)
{
case "Completed" : // Le paiement est Completed
// idTransaction = dejà dans la bdd ?
$query = mysql_query("SELECT * FROM xhtml WHERE idTransaction= '$txn_id'");
$data = mysql_fetch_object($query);
if ($data)
// Si l'Id de Transaction est déjà dans la base de données on attribue 1 à $erreur.
$erreur = 1;
// email business = ok ?
if ($receiver_email != "vendeur@gmail.com")
$erreur = 2;
// montant reglé = tarif du service ?
if ($payment_amount != 10)
$erreur = 3;
// devise pour régler = devise acceptée ?
// On avait définit l'Euro comme devise dans Tuto II.
if ($payment_currency != "EUR")
$erreur = 4;
/*
Voilà, maintenant qu'on a vérifié toutes les conditions, il ne reste plus qu'à mettre à jour la base de données, pour activer le compte de l'utilisateur qui vient de payer.
*/
if (!isset($erreur))
{
// Il n'y pas d'erreurs. S'il y a des erreurs vous devez en prévoir la gestion.
$query = "UPDATE xhtml SET idTransaction='$txn_id', autorisation='1', date = NOW() WHERE idUnique='$idUnique'";
mysql_query($query);
/*
Pour faire encore plus chic, vous pouvez même envoyer un E-mail au client pour lui confirmer que son paiement a été accepté et que son compte est activé. Ca ne fonctionne que si votre serveur est paramétré pour envoyer les mails...
*/
}
break;
}
}
else if (strcmp ($res, "INVALID") == 0)
{
// consigner pour enquête manuelle
}
}
fclose ($fp);
}
?> |
Partager