Paypal IPN: script PHP de notification de paiement par e-mail
La méthode décrite ci-dessous évite que la notification par Paypal soit filtrée comme spam et permet de recevoir à coup sûr un message de notification plus détaillé que celui par défaut.Cette solution utilise la fonction de Paypal appelée "Notification Instantanée de Paiement" (Instant Notification of Payment ou IPN). Elle est utilisée par les logiciels de e-commerce où Paypal les informe que la transaction est valide. Paypal se connectera à ce petit script PHP quand un paiement sera validé et on recevra un e-mail avec toutes les données relatives à la transaction: nom, montant, objets achetés, etc.
Pour que cela soit efficace, tout doit rester en interne à votre réseau. Le script est sur votre hébergement, il envoie un e-mail en provenance d'une adresse appartenant à cet hébergement et à destination d'un e-mail appartenant lui aussi à votre hébergement. Pour faire simple, tout doit correspondre au même nom de domaine à la fois pour le site web et l'adresse e-mail. Le message ne sortant pas de l'infrastructure réseau de votre hébergeur, il est fort probable que vous recevrez toujours ce message de notification.
Ce script PHP est très pratique si vous utilisez un bouton, un panier ou une donation Paypal, sans recourir à un script de e-commerce. Et contrairement au message de notification envoyé par Paypal, celui-ci est très détaillé, donnant toutes les informations sur la transaction (objet commandé, nom, adresse, prix, etc.). Inutile de vous connectez à votre compte Paypal, tout se trouve dans ce message ! Il fait aussi office de sauvegarde de la vente. Enfin, vous êtes informé quand un client n'a pas pu conclure une vente à cause d'un problème technique.
Créez un fichier que vous appellerez "paypal-ipn-mail.php" (vous pouvez changer le nom) et copiez le code ci-après.
Script PHP de notification Paypal IPN:
<?php
/* Script de Instant Payment Notification (IPN) ou Notification Instantanee de Paiement par Paypal */
/* Envoie un e-mail au vendeur quand Paypal a recu un paiement. Si la transaction est OK, Paypal se connecte a ce script et envoie des donnees, puis le script envoie un e-mail recapitulatif au vendeur.*/
/* Ajoutez l'URL de ce script lors de la creation d'un bouton Paypal ou dans les preferences de son compte Paypal a: Préférences de Notification instantanée de paiement. */
/* ADRESSE E-MAIL DU VENDEUR */
$emailto = "boutique@mondomaine.tld";
/* ADRESSE E-MAIL DE L'EMETTEUR DE CE MAIL (le FROM), DOIT ETRE UN VRAI COMPTE MAIL. */
$emailfrom = "postmaster@mondomaine.tld";
/* PREFIX AU SUJET DU MAIL POUR FILTRE ANTI-SPAM */
$sujetprefix = "[PAYPAL]";
/* NE RIEN MODIFIER CI-DESSOUS */
// lecture du post de PayPal et ajout de 'cmd'
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = trim(urlencode(stripslashes($value)));
$req .= "&$key=$value";
}
// reponse a PayPal pour validation
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Host: www.paypal.com:80\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);
// variables
$item_name = $_POST['item_name'];
$business = $_POST['business'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$mc_gross = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$receiver_id = $_POST['receiver_id'];
$quantity = $_POST['quantity'];
$num_cart_items = $_POST['num_cart_items'];
$payment_date = $_POST['payment_date'];
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$payment_type = $_POST['payment_type'];
$payment_status = $_POST['payment_status'];
$payment_gross = $_POST['payment_gross'];
$payment_fee = $_POST['payment_fee'];
$settle_amount = $_POST['settle_amount'];
$memo = $_POST['memo'];
$payer_email = $_POST['payer_email'];
$txn_type = $_POST['txn_type'];
$payer_status = $_POST['payer_status'];
$address_name = $_POST['address_name'];
$address_street = $_POST['address_street'];
$address_city = $_POST['address_city'];
$address_state = $_POST['address_state'];
$address_zip = $_POST['address_zip'];
$address_country = $_POST['address_country'];
$address_status = $_POST['address_status'];
$item_number = $_POST['item_number'];
$tax = $_POST['tax'];
$option_name1 = $_POST['option_name1'];
$option_selection1 = $_POST['option_selection1'];
$option_name2 = $_POST['option_name2'];
$option_selection2 = $_POST['option_selection2'];
$for_auction = $_POST['for_auction'];
$invoice = $_POST['invoice'];
$custom = $_POST['custom'];
$notify_version = $_POST['notify_version'];
$verify_sign = $_POST['verify_sign'];
$payer_business_name = $_POST['payer_business_name'];
$payer_id =$_POST['payer_id'];
$mc_currency = $_POST['mc_currency'];
$mc_fee = $_POST['mc_fee'];
$exchange_rate = $_POST['exchange_rate'];
$settle_currency = $_POST['settle_currency'];
$parent_txn_id = $_POST['parent_txn_id'];
if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
// Envoi du mail
$mail_From = "From: " . $emailfrom;
$mail_To = $emailto;
$mail_Subject = $sujetprefix . " Paiement PAYPAL valide et verifie";
$mail_Body = "Paypal vient de valider et recevoir un paiement par carte bancaire. \nConnectez-vous a votre compte Paypal pour connaitre les details de cette transaction et virer la somme sur votre compte. \nhttps://www.paypal.com/fr/";
$mail_Body .= "\n";
$mail_Body .= "\n====================================================";
$mail_Body .= "\n" . "Voici quelques informations sur la transaction:\n";
$mail_Body .= "\n" . "Transaction ID: " . $txn_id ;
$mail_Body .= "\n" . "Date de paiement: " . $payment_date;
$mail_Body .= "\n" . "Etat du paiement: " . $payment_status;
$mail_Body .= "\n====================================================";
$mail_Body .= "\n";
$mail_Body .= "\n" . "Attention, les informations ci-dessous peuvent etre incompletes.";
$mail_Body .= "\n====================================================";
$mail_Body .= "\n" . "Nombre d'objets dans le panier: " . $num_cart_items;
if (strlen($item_name1) > 1) { $mail_Body .= "\n\n" . "1er objet en commande: " . $item_name1 . "\n" . "Numero de l'objet 1: " . $item_number1 . " - " . "Quantite: " . $quantity1; }
if (strlen($item_name2) > 1) { $mail_Body .= "\n\n" . "2e objet en commande: " . $item_name2 . "\n" . "Numero de l'objet 2: " . $item_number2 . " - " . "Quantite: " . $quantity2; }
if (strlen($item_name3) > 1) { $mail_Body .= "\n\n" . "3e objet en commande: " . $item_name3 . "\n" . "Numero de l'objet 3: " . $item_number3 . " - " . "Quantite: " . $quantity3; }
if (strlen($item_name4) > 1) { $mail_Body .= "\n\n" . "4e objet en commande: " . $item_name4 . "\n" . "Numero de l'objet 4: " . $item_number4 . " - " . "Quantite: " . $quantity4; }
if (strlen($item_name5) > 1) { $mail_Body .= "\n\n" . "5e objet en commande: " . $item_name5 . "\n" . "Numero de l'objet 5: " . $item_number5 . " - " . "Quantite: " . $quantity5; }
if (strlen($item_name) > 1) {
$mail_Body .= "\n" . "Objet en commande: " . $item_name;
$mail_Body .= "\n" . "Numero de l'objet: " . $item_number;
$mail_Body .= "\n" . "Quantite: " . $quantity;
}
$mail_Body .= "\n";
$mail_Body .= "\n" . "Facture numero: " . $invoice;
$mail_Body .= "\n" . "Montant: " . $mc_gross . " " .$mc_currency;
$mail_Body .= "\n" . "Frais Paypal: " . $mc_fee . " " .$mc_currency;
$mail_Body .= "\n" . "Montant sur le compte: " . ($mc_gross - $mc_fee) . " " .$mc_currency;
$mail_Body .= "\n";
$mail_Body .= "\n" . "Nom: " . $first_name . " " .$last_name;
$mail_Body .= "\n" . "Rue: " . $address_street;
$mail_Body .= "\n" . "Code postal: " . $address_zip;
$mail_Body .= "\n" . "Ville: " . $address_city;
$mail_Body .= "\n" . "Etat et Pays: " . $address_state . " " .$address_country . " " .$address_country_code;
$mail_Body .= "\n" . "Adresse e-mail: " . $payer_email;
$mail_Body .= "\n" . "Nom de l'entreprise: " . $payer_business_name;
$mail_Body .= "\n";
$mail_Body .= "\n" . "Message du client: " . $memo;
$mail_Body .= "\n";
$mail_Body .= "\n" . "Statut Paypal du client: " . $payer_status;
$mail_Body .= "\n====================================================";
foreach ($_POST as $key => $value){
$emailtext .= $key . " = " .$value ."\n";
}
mail($mail_To, $mail_Subject, $mail_Body . "\n\nVoici les donnees brutes recues par Paypal: \n\n" . $emailtext, $mail_From);
}
else if (strcmp ($res, "INVALID") == 0) {
// Envoi d'un mail si invalide
$mail_From = "From: " . $emailfrom;
$mail_To = $emailto;
$mail_Subject = $sujetprefix . " Paiement PAYPAL NON VALIDE";
$mail_Body = "Un client a voulu payer par Paypal mais la transaction n'est pas valide. La commande est annulee. \nCe message est envoye pour information, il n'y a rien a faire. \nhttps://www.paypal.com/fr/ \nCi-dessous, les donnees brutes envoyees par Paypal.";
$mail_Body .= "\n";
$mail_Body .= "\n====================================================";
foreach ($_POST as $key => $value){
$emailtext .= $key . " = " .$value ."\n";
}
mail($mail_To, $mail_Subject, $mail_Body . "\n\nVoici les donnees brutes recues par Paypal: \n\n" . $emailtext, $mail_From);
}
}
fclose ($fp);
}
?>
Connectez-vous à votre compte Paypal: https://www.paypal.com/fr/
Cliquez sur l'onglet Préférences, en-dessous de la colonne Préférences des ventes, cliquez sur Préférences de Notification instantanée de paiement.
Cliquez sur le bouton Modifier. Cochez la case et entrez l'URL du script que vous venez de créer: http://www.mondomaine.tld/paypal-ipn-mail.php
Maintenant, au prochain paiement, vous devriez recevoir un e-mail vous notifiant la récéption d'un paiement sur votre compte.
Note: si vous avez appliqué les règles anti-piratages, il faut modifier un élément du fichier htaccess. Au point 4 de la règle htaccess, on va ajouter une ligne comme ça:
Code:
###FILTRE CONTRE ROBOTS DES PIRATES ET ASPIRATEURS DE SITE WEB
RewriteEngine On
## EXCEPTION: TOUS LES ROBOTS MEMES ANONYMES OU BANNIS PEUVENT ACCEDER A CES FICHIERS
RewriteCond %{REQUEST_URI} !^robots.txt
RewriteCond %{REQUEST_URI} !^sitemap.xml
## EXCEPTION: SI UTILISATION DE *PAYPAL INSTANT NOTIFICATION PAYMENT*, COMME PAYPAL N'UTILISE PAS DE HTTP_USER_AGENT, L'IPN NE MARCHERA PAS.
RewriteCond %{REQUEST_URI} !^paypal-ipn-mail.php
##
RewriteCond %{HTTP_USER_AGENT} ^-?$ [OR] etc., etc.