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 ('ssl://www.sandbox.paypal.com', 443, $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.

 

Vous avez aimé ce billet ? Faites tourner l'information, cliquez !
  • Scoopeo
  • Wikio
  • Yoolink
  • Facebook
  • Fuzz
  • Tapemoi
  • Technorati
  • Google
  • del.icio.us
  • TwitThis
Personne n'a baraguiné de chtite phrase pour le moment !


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