05
MARS

Tutorial: Intégrer PayPal à son site web en PHP - Partie 2

Publié le 05/03/09 à 08h08 par DJo

Deuxième partie du tutorial qui vous permettra d'intégrer le service de paiement en ligne PayPal à votre site web PHP.

 

Tutorial: Intégrer PayPal à votre site web PHP

Objectif du tutorial:

Le but de ce tutorial est de vous guider pas à pas dans l'intégration du service de paiement en ligne paypal et de vous expliquer comment fonctionne le processus de paiement ...

Ce tutorial s'applique uniquement aux sites développés en PHP.

 

Plan du tutorial:

 

Essais de paiements avec les comptes de test

Pour tester que notre bouton PayPal fonctionne correctement, nous allons maintenant simuler un achat.

Rendez-vous sur la page contenant le bouton d'achat paypal, choisissez une somme (si vous avez mis un input type='text' ou un select) à acheter puis cliquez sur votre bouton.

Vous devriez accéder à une page PayPal sécurisée qui récapitule la transaction à effectuer et vous demande de vous identifier à paypal ou de saisir vos coordonnées de CB.

Identifiez vous avec votre compte virtuel buyer (adresse email en *_per@votredomaine).

Puis validez l'achat. Une fois que la transaction est effectuée, la page paypal de confirmation s'affichera et vous pourrez retourner sur votre site grâce au lien mis en avant. Vous serez redirigé sur la page de succès que vous avez du mettre en place (Celle renseignée dans le formulaire avec le bouton).

Maintenant, vous pouvez vérifier que la transaction a bien été effectuée dans votre compte "seller". (Via le site sandbox > Tests Accounts)

Exemple:

Historique paiement PayPal Sandbox

 

 

Récupération des données de l'IPN

Passons maintenant à la partie la plus intéressante, le traitement du paiement grâce à l'IPN.

Une fois qu'un acheteur valide un paiement, PayPal va automatiquement appeler la page renseignée dans le paramètre "notify_url" du formulaire.

L'IPN envoi un certain nombre de paramètres qu'il va donc falloir dans un premier temps récupérer pour ensuite pouvoir traiter le paiement sur notre site.

Ouvrez donc le fichier en question et rajoutez:

    // lire le formulaire provenant du système PayPal et ajouter 'cmd'
    $req = 'cmd=_notify-validate';
    
    foreach ($_POST as $key => $value) {
        $value = urlencode(stripslashes($value));
        $req .= "&$key=$value";
    }

Dans la boucle foreach, nous allons récupérer tous les paramètres passés par la méthode POST et les stocker dans la variable $req. Cette dernière nous permettra de renvoyer toutes les données à PayPal pour vérification.

    // renvoyer au système PayPal pour validation
    $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 ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);

Maintenant, nous préparons le header à renvoyer au système de paypal pour obtenir la vérification de l'intégrité des données reçues.

Nous ouvrons ensuite une connexion avec le serveur sandbox paypal (A remplacer par www.paypal.com en production).

    $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'];
    $id_user = $_POST['custom'];

On récupère toutes les données que l'on va traiter.

    if (!$fp) {
    // ERREUR HTTP
    } else {
        fputs ($fp, $header . $req);
        while (!feof($fp)) {
            $res = fgets ($fp, 1024);
            if (strcmp ($res, "VERIFIED") == 0) {
                // transaction valide
            }
            else if (strcmp ($res, "INVALID") == 0) {
                // Transaction invalide                
            }
        }
        fclose ($fp);
    }

Si la connexion au service paypal a réussie, on lui envoi le header préparé précedemment, puis on récupère les information renvoyée par PayPal.

Si le résultat est "VERIFIED" alors, la transaction est valide, les données envoyées et récupérées sont correctes.

Dans le cas contraire, paypal renverra le code "INVALID".

 

 

Validation et enregistrement du paiement en PHP

Passons maintenant au traitement du paiement lorsque la transaction est valide.

Si la transaction est valide, cela ne signifie pas qu'il faut traiter tête baisser le paiement !

Il y'a quelques tests à effectuer au préalable:

  • Vérifier que payment_status soit bien égal à "Completed"
  • Vérifier que l'ID de transaction txn_id n'a pas déjà été traité
  • Vérifier que receiver_email est votre adresse email PayPal principale
  • Vérifier que payment_amount et payment_currency sont corrects dans le cas où le prix est fixe.

Ajoutez donc les conditions PHP suivantes après le commentaire

 // transaction valide
               // vérifier que payment_status a la valeur Completed
                if ( $payment_status == "Completed") {
                    // vérifier que txn_id n'a pas été précédemment traité: Créez une fonction qui va interroger votre base de données
                    if (VerifIXNID($txn_id) == 0) {
                        // vérifier que receiver_email est votre adresse email PayPal principale
                        if ( "votreEmailSeller" == $receiver_email) {
                            // vérifier que payment_amount et payment_currency sont corrects
                            // traiter le paiement
                         }
			  else {
				// Mauvaise adresse email paypal
			  }
			}
			else {
				// ID de transaction déjà utilisé
					}
			}
		  else {
		        	// Statut de paiement: Echec
		  }

A vous de voir ensuite comment traiter votre paiement.

Il est conseillé de stocker une trace de chaque paiement dans une table dédiée.

Ensuite à vous de créditer l'acheteur ou de préparer la livraison du produit acheté ...

Vous devez aussi gérer les erreurs en cas de problème, par exemple notifier l'utilisateur que son paiement à échoué.

 

 

Support du tutorial

Aucun support ne sera fourni en commentaire. Si vous avez des problèmes ou questions, merci de les poser dans le topic dédié au tutorial.

 

Baraguiné par le 06/12/10 à 12h53
Bonjour,
Tout d'abord, merci pour ce tutoriel qui m'a vraiment aidé.
Mais, j'ai un problème pour la deuxième partie : le $fp ne me retourne pas de "VERIFIED", ni de "INVALID". Tout ce a quoi j'ai droit, c'est :
"
HTTP/1.1 200 OK
Date: Thu, 07 Dec 2010 11:30:58 GMT
Server: Apache
Set-Cookie: pleinDeChiffresEtDeLettres; domain=.paypal.com; path=/
Set-Cookie: cookie_check=yes; expires=Mon, 02-Dec-2020 11:30:59 GMT; domain=.paypal.com; path=/
Set-Cookie: navcmd=_notify-validate; domain=.paypal.com; path=/
Set-Cookie: navlns=0.0; expires=Sun, 01-Dec-2030 11:30:59 GMT; domain=.paypal.com; path=/
Set-Cookie: Apache=10.191.196.11.213971291635058999; path=/; expires=Sat, 22-Oct-04 05:02:42 GMT
Connection: close
Content-Type: text/html; charset=UTF-8
"
Ce tuto est-il toujours a jour ? Ce problème viendrait-il du fait que j'utilise la sandbox ? Y a t-il une solution ?
Merci d'avance !
Baraguiné par roustan le 22/12/11 à 18h42
roustan via Twitter
Visiblement Paypal a modifié le port sur lequel la requête doit être effectuée. Pour que ce tutorial fonctionne il faudra donc remplacer ça :

$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);

Par ça:
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

Pour plus d'infos et exemples d'intégration: https://cms.paypal.com/fr/cgi-bin/?cmd=_render-content
Baraguiné par dummycreation le 26/12/11 à 08h41
dummycreation sur La Ferme du Web
Bonjour à tous,

En fait, de quel type de paiement Paypal ce tutoriel concerne? A ma connaissance il y en a plusieurs!
- Paiement standard
- Paypal Express
- Paypal Intégral
- Paypal Option plus, etc.

Paypal Express semble conseillé par les forums mais si je ne me trompe pas c'est du standard le tuto
Baraguiné par le 15/02/12 à 13h22
Bonjour,
merci pour l'article mais attention il manque quelque chose.
Si le client modifie grace à firebug le prix directement dans le formulaire, votre script valide la commande.
Il faut donc tester dans le retour si le montant payé est égal au montant de la commande!!
Je prépare un article pour placer l'exemple
Baraguiné par le 21/04/12 à 20h50
Bonjour, merci beaucoup pour ce tutoriel.
La méthode d'appel au webservice paypal m'a beaucoup appris.
Et en plus c'est la première fois que je capte le fonctionnement de Paypal. Merci merci merci.

Ajouter un Commentaire

Pour poster un commentaire, vous devez être identifié. Vous pouvez choisir parmi ces trois méthodes d'identification:

Compte la Ferme du Web

Identifiez-vous
Inscrivez-vous

Compte Facebook

Compte Twitter

Connexion avec votre compte twitter
Rechercher sur la Ferme du web