Mis à jour le mercredi 30 octobre 2013
  • Facile
Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Introduction du cours

Vous avez un site internet et vous désirez y vendre des articles comme du café, de la poterie faite maison ou encore votre grand-mère téléphone portable ?

Alors que diriez-vous si je vous apprenais comment laisser la possibilité à vos visiteurs de vous payer par carte de crédit, virement bancaire ou encore par chèque ?

Tout ceci est possible grâce aux services sécurisés de paiement en ligne comme par exemple : PayPal, Moneybookers, Clik2Pay ou encore NETELLER.

Dans ce tutoriel, je vais vous présenter Moneybookers. Il a l'avantage d'être bon marché, en français et relativement facile à mettre en place sur votre site web, tout en gardant une très bonne sécurité.

J'ai également rédigé un autre tutoriel sur PayPal, à cette adresse : Paiement en ligne par PayPal

Que vous soyez un pro du PHP, de l'ASP (ou autre) ou un débutant en (x)HTML, ce tutoriel est pour vous ! Car je vais vous présenter une technique "statique" qui n'utilise que du HTML, et une autre "dynamique" plus approfondie où on utilisera également du PHP, ou tout autre langage côté serveur.

Moneybookers ? Connais pas...

Avant de vous expliquer comment utiliser Moneybookers, je vais d'abord vous expliquer ce que c'est et comment ça marche.

Présentation de Moneybookers

Moneybookers est une interface vous permettant de déposer de l'argent sur un compte virtuel, sur internet (ce n'est pas un placement que vous faites, aucun intérêt ne vous est reversé... :( snif).
Pour ce faire, rien de plus simple : vous ouvrez un compte sur le site www.moneybookers.com, puis vous envoyez un bulletin de versement sur un compte en banque de Moneybookers. Comme ils disposent d'un compte en banque dans beaucoup de pays du monde, vous n'aurez probablement pas de frais bancaires. Ou alors, vous versez de l'argent sur votre compte par carte de crédit, mais à ce moment-là, une taxe de 1,9 % est prélevée sur votre virement.

Une fois que vous avez de l'argent sur votre compte Moneybookers, vous pouvez envoyer cet argent, ou une partie de celui-ci à quiconque disposant d'un compte Moneybookers.
Vous ne payez rien pour créditer votre compte et pour envoyer de l'argent. C'est donc très avantageux pour régler ses factures dans le monde entier.

Lorsque vous recevez de l'argent d'un autre compte Moneybookers, une taxe de 2,9 % est prélevée sur le virement de celui-ci.

Et enfin, vous pouvez à tout moment récupérer l'argent que vous avez sur votre compte Moneybookers et le transférer sur votre compte bancaire, soit par virement (avec une taxe de 1,80 EUR), soit par chèque (avec une taxe de 3,50 EUR).

Citation : www.moneybookers.com

Moneybookers permet aux entreprises ou aux individus, disposant d'une adresse e-mail, d'envoyer et de recevoir, de manière sécurisée et à moindre coût, des paiements en ligne, en temps réel !

Utilisez Moneybookers pour :

  • envoyer de l'argent via e-mail à partir de votre carte de crédit ou votre compte bancaire ;

  • effectuer des achats en ligne ;

  • collecter de l'argent depuis votre e-mail.

Moneybookers offre un service taillé sur mesure pour les besoins des petites entreprises, des marchands en ligne, des particuliers et tous ceux qui ne sont pas satisfaits des mécanismes de paiement traditionnels. En tant que solution globale de paiement, nous accueillons les clients de toutes les nations de la Terre !

Moneybookers Limited est un agent de transferts monétaires régi par la loi du Royaume-Uni.

Comment ça marche ?

Vous trouvez sur le site de Moneybookers, une documentation technique (en anglais) de l'utilisation.

La transaction s'effectue en plusieurs points.

  • Le visiteur passe une commande, (avec un système de panier pour les plus avancés, une simple page HTML avec l'article en question pour les moins avancés).

  • Le visiteur clique sur le bouton Payer pour finaliser son achat.

  • Le visiteur est redirigé sur le site de Moneybookers et les détails de son achat sont transmis à celui-ci.

  • Le visiteur entre son nom d'utilisateur et son mot de passe sur ce site, et accepte ou non le paiement.

  • Si le visiteur n'accepte pas le paiement ou qu'il n'a pas assez d'argent pour le régler, il est redirigé sur une page de votre site (une page où on lui dit "La vente n'a pas pu se terminer").

  • Si le visiteur accepte le paiement et qu'il a assez d'argent pour le régler, il est redirigé sur une page de votre site (une page ou on lui dit "Bravo, la vente a été acceptée").

À ce moment-là, deux choix s'offrent à vous :

  • vous recevez un e-mail lorsqu'un virement a été effectué sur votre compte (vous n'utilisez que du code (x)HTML) ;

  • ou alors, Moneybookers exécute un script de votre site qui vous permettra de mettre à jour votre base de données MySQL, d'envoyer un e-mail à l'acheteur, etc. (nécessite une programmation en PHP ou autre).

En image, ça nous donne :

traitement moneybookers

Inscription

Tout d'abord, vous devez être inscrits sur le site de Moneybookers. Pour cela, rien de plus simple.

Connectez-vous sur le site www.moneybookers.com, cliquez sur le bouton s'inscrire et complétez les champs demandés. Là, je ne peux pas beaucoup vous aider... Inutile de copier, ce sont des informations personnelles ^^ .

Une fois enregistrés, vous pouvez ajouter un nouveau compte en banque et le vérifier. Cette action vous permettra de déposer des fonds et de retirer votre argent du compte Moneybookers afin de le déposer sur votre compte en banque.
À ce stade-là, vous êtes limités sur la quantité d'argent que vous pouvez retirer de votre compte Moneybookers, par mois. Ceci afin d'éviter le blanchiment d'argent.
Mais vous pouvez demander de vérifier votre adresse postale, et ainsi vous permettre d'augmenter la limite mensuelle de retraits d'argent.

Note :le site de Moneybookers utilise un système de parrainage. Si vous vous êtes enregistrés il y a moins de deux semaines et que vous n'avez pas de parrain, vous pouvez ajouter mon ID de parrainage qui est le suivant : 4048550. :-°

Petite parenthèse faite, vous pouvez dès maintenant déposer, retirer des fonds, envoyer et recevoir de l'argent grâce à ce site.
C'est-t-y pas beau :p ?

Mise en place sur votre site

Nous y voilà. Sans plus tarder, nous allons voir comment faire pour mettre en place tout ceci, et vous verrez que ce n'est pas si compliqué.

Je ne vais pas refaire le cours de M@teo, et je considère donc que si vous lisez ce tutoriel, vous avez suffisamment de connaissances pour savoir créer une page HTML simple. Si ce n'est pas le cas, allez vite lire son tutoriel à cette page.

Vous pourriez très bien dire à vos clients : "Inscrivez-vous sur le site www.moneybookers.com, et versez-moi de l'argent sur le compte ***@***."
Mais avouez que ce n'est pas très professionnel, et surtout que ce tuto ne vous serait d'aucune utilité.

Ce qui va nous intéresser, c'est de dire à Moneybookers que le client que vous leur envoyez vous doit 25 euros car il souhaite vous acheter 2 kg de café fraîchement moulu.

Et pour ce faire, vous allez envoyer ces informations à un programme de Moneybookers, à l'aide d'un formulaire. Mais ce formulaire ne sera pas visible aux yeux de vos visiteurs. Nous allons donc utiliser la balise input avec l'argument type="hidden" pour ensuite l'envoyer au script https://www.moneybookers.com/app/payment.pl à l'aide de la méthode POST.

Ce qui nous donnera au final quelque chose comme ça :

<form action="https://www.moneybookers.com/app/payment.pl" method="post">
  <input type="hidden" name="nom_du_champ" value="valeur_du_champ">
  <input type="submit" value="Payer!">
</form>

Si on teste cette page, le site de Moneybookers va nous retourner une erreur car il lui manque des informations. Je vais donc vous citer de suite les informations que nous devons obligatoirement passer à Moneybookers pour que ce programme puisse fonctionner.

Nom du champ

Description

Exemple

pay_to_email

Indiquez ici l'adresse e-mail de votre compte Moneybookers.
Ce champ permet d'indiquer sur quel compte l'argent doit être versé.

email@domaine.com

language

Indiquez ici les deux lettres de la langue dans laquelle vous souhaitez voir affiché le site.
Le site de Moneybookers sera ainsi affiché dans la langue souhaitée. (FR, EN, DE, etc.)

FR

amount

Indiquez ici le montant que votre visiteur doit vous verser.
Ce montant sera déduit du compte du visiteur pour être transféré sur le vôtre

26.90

currency

Indiquez ici le code du type de la monnaie souhaitée sur 3 caractères.
Le type de monnaie du montant renseigné précédemment est défini ici (EUR, CHF, USD, ...).

EUR

detail1_description

Vous indiquez ici une ou plusieurs (5 maxi) descriptions que vous souhaitez afficher lors de la transaction.
Ces lignes seront affichées lors de la validation de la transaction.

Description

detail2_description

ID du produit

detail3_description

Délais de livraison

detail4_description

...

detail5_description

...

detail1_text

Vous indiquez ici une ou plusieurs (5 maxi) valeurs correspondantes à la description mentionnée précédemment.
Ces lignes seront affichées lors de la validation de la transaction.

2 kg de café fraîchement moulu

detail2_text

56414

detail3_text

4 à 5 jours ouvrables

detail4_text

...

detail5_text

...

Si on place tout ça dans le formulaire, ça nous donne :

<form action="https://www.moneybookers.com/app/payment.pl" method="post">
  <input type="hidden" name="pay_to_email" value="email@domaine.com">
  <input type="hidden" name="language" value="FR">
  <input type="hidden" name="amount" value="26.9">
  <input type="hidden" name="currency" value="EUR">
  <input type="hidden" name="detail1_description" value="Description">
  <input type="hidden" name="detail1_text" value="2 kg de cafe fraichement moulu">
  <input type="submit" value="Payer!">
</form>

Lorsqu'on clique sur le bouton Payer ! de ce formulaire, voici ce que Moneybookers nous retourne :

vente simple moneybookers

Mais voici d'autres champs très utiles que nous pouvons transmettre à Moneybookers, mais ils ne sont pas obligatoires :

Nom du champ

Description

Exemple

return_url

Indiquez ici l'adresse de la page qui sera affichée lorsque le visiteur a effectué le virement.
* Si ce champ n'est pas renseigné, Moneybookers ferme simplement la fenêtre.

http://www.siteduzero.com/transfert_ok.htm

cancel_url

Indiquez ici l'adresse de la page qui sera affichée si le visiteur annule le virement.
* Si ce champ n'est pas renseigné, Moneybookers ferme simplement la fenêtre.

http://www.siteduzero.com/transfert_annule.htm

status_url

Indiquez ici votre adresse e-mail afin de recevoir un accusé de réception lorsqu'une transaction sera effectuée.
Ce champ sert également à indiquer la page de votre script d'automatisation, mais on le verra dans la partie suivante du tutoriel.

email@domaine.com

amount2_description

Vous indiquez ici une ou plusieurs (4 maxi) descriptions de prix à ajouter à la page de paiement Moneybookers.
Ces informations seront affichées sur la page de paiement de Moneybookers.

Prix :

amount3_description

Frais de port :

amount4_description

TVA (5,5 %) :

amount2

Vous indiquez ici un ou plusieurs (4 maxi) prix correspondants à la description mentionnée précédemment.
Le montant total n'est pas calculé, vérifiez donc la cohérence entre les champs amount2,3,4 et amount.

19.90 EUR

amount3

6.- EUR

amount4

1.- EUR

confirmation_note

Indiquez ici le message que vous souhaitez afficher lorsque le visiteur a confirmé son achat sur le site Moneybookers.
Vous avez la possibilité d'intégrer la balise <br> pour vos longs messages.

Merci pour votre achat.<br> À la revoyure !!

Si on place tout ça dans le formulaire, ça nous donne :

<form action="https://www.moneybookers.com/app/payment.pl" method="post">
  <input type="hidden" name="pay_to_email" value="email@domaine.com">
  <input type="hidden" name="language" value="FR">
  <input type="hidden" name="amount2_description" value="Prix :">
  <input type="hidden" name="amount2" value="19.90 EUR">
  <input type="hidden" name="amount3_description" value="Frais de port :">
  <input type="hidden" name="amount3" value="6.- EUR">
  <input type="hidden" name="amount4_description" value="TVA (5.5 %) :">
  <input type="hidden" name="amount4" value="1.- EUR">
  <input type="hidden" name="amount" value="26.9">
  <input type="hidden" name="currency" value="EUR">
  <input type="hidden" name="detail1_description" value="Description :">
  <input type="hidden" name="detail1_text" value="2 kg de cafe fraîchement moulu">
  <input type="hidden" name="detail2_description" value="ID du produit :">
  <input type="hidden" name="detail2_text" value="56414">
  <input type="hidden" name="detail3_description" value="Délais de livraison :">
  <input type="hidden" name="detail3_text" value="4 à 5 jours ouvrables">
  <input type="hidden" name="return_url" value="http://www.siteduzero.com/transfert_ok.htm">
  <input type="hidden" name="cancel_url" value="http://www.siteduzero.com/transfert_annule.htm">
  <input type="hidden" name="status_url" value="email@domaine.com">
  <input type="hidden" name="confirmation_note" value="Merci pour votre achat.">
  <input type="submit" value="Payer !">
</form>

Lorsqu'on clique sur le bouton Payer ! de ce formulaire, voici ce que Moneybookers nous retourne :

Image utilisateur

Actuellement, nous nous trouvons dans cette situation :

Image utilisateur

Vous n'avez plus qu'à envoyer la marchandise à la personne qui vous a commandé quelque chose, lorsque vous recevez un e-mail de Moneybookers.

Automatiser, mais pourquoi ?

Jusqu'à maintenant, toutes les actions dynamiques se passaient chez Moneybookers. Nous n'avions besoin que de pages (x)HTML.
Ce qui devient intéressant maintenant, c'est qu'on puisse mettre à jour nos bases de données directement après qu'une vente ait été accomplie.

Tu n'aurais pas un exemple concret, car là je ne vois pas trop l'utilité...

Bien sûr, en voici un.
Vous vendez des logiciels par internet et ceux-ci nécessitent une clé de licence pour être utilisés.
Une fois que votre client a choisi les logiciels qu'il souhaite acheter, il passe par Moneybookers pour payer son achat. Directement après avoir payé, il reçoit instantanément un e-mail contenant toutes les clés de logiciels qu'il vient de commander. Plus rapide que l'éclair. :)

En voici un autre.
Vous vendez votre télévision, votre grand-mère, votre natel (téléphone portable) et vos souliers favoris. Vous n'avez qu'un seul exemplaire de chaque article. Il serait très déplaisant que pendant le temps qu'il vous faut pour aller lire vos e-mails et mettre à jour votre site, une seconde personne achète votre natel. :euh: Gloups !
Vous auriez reçu de l'argent des deux personnes, mais ne pouvez satisfaire qu'une seule d'entre elles. :-°
Mais grâce à ce qui va suivre, vous pourriez supprimer de votre site la vente de votre natel, aussitôt après qu'une personne vous l'ait acheté.

Et pourquoi pas...
Vous fournissez un service payant quelconque (informations, paris, jeu en ligne) et utilisez ce moyen pour permettre à vos visiteurs d'avoir accès à ce service ou de charger des fonds sur votre site. Leur compte est automatiquement activé / mis à jour, après paiement.

Des exemples comme ça, je peux vous en trouver des milliers... Mais je pense que si vous continuez à lire ce tutoriel, c'est que vous avez probablement déjà tous plein d'idées de ce que vous allez automatiser.

Alors poursuivons !!! ^^

Automatisation

Ce tutoriel ne va pas vous apprendre à faire du PHP, de l'ASP ou tout autre langage quel qu'il soit... Je ne vais donc pas vous apprendre à changer dynamiquement le contenu de votre formulaire, ni à récupérer le contenu d'un formulaire. Je pars donc du principe que vous savez le faire. Si ce n'est pas le cas, allez donc lire le tutoriel PHP de M@teo sur cette page.

Pour que Moneybookers exécute notre script, il va falloir lui dire quel est le script à exécuter. Et ceci se fait dans le champ status_url.

Ce n'est pas celui où on peut définir notre adresse e-mail pour recevoir un accusé réception par e-mail ?

Oui, précisément. Mais cette fois-ci, à la place de mettre une adresse e-mail, nous allons mettre l'URL de notre script. Ainsi, Moneybookers pourra l'exécuter et nous dire si le paiement a été accompli ou non.

Nom du champ

Description

Exemple

status_url

Indiquez l'URL du script que Moneybookers doit exécuter.

http://www.siteduzero.com/execution_script.php

Ainsi, vous évitez de gaspiller votre argent en frais de transfert (commission), ou de faire de l'à-peu-près, en supposant que votre script va fonctionner.

Étant donné que ce n'est pas le visiteur qui exécute votre script, mais Moneybookers, les variables globales ($_SESSION) vous sont complètement inutiles.
Il vous faudra donc un autre moyen pour identifier à quoi correspond tel ou tel paiement.
Nous allons donc envoyer ces informations à Moneybookers dans le formulaire. Ces informations nous seront retournées lors de l'exécution du script, par la méthode POST.

Voici les champs qui sont à votre disposition pour cela :

Nom du champ

Description

Exemple

transaction_id

Indiquez un id unique pour la transaction en cours (32 caractères maxi).
Cet identifiant vous permettra de reconnaître facilement de quelle transaction il s'agit.

12

merchant_fields

Indiquez un ou plusieurs (5 maxi) champs que vous souhaitez envoyer à Moneybookers.
* Ces champs doivent être séparés par des virgules et ont comme unique but de vous être retournés lors de l'exécution de votre script.

*id_client, *sit_ref, ...

*id_client
*sit_ref

Liste des champs mentionnés précédemment. Ceci vous permet de transmettre des variables que vous souhaitez récupérer.
Dans l'exemple, j'ai indiqué l'identifiant de votre client, ou le site depuis lequel il a passé une commande (qui pourrait vous servir dans le cas d'une gestion de plusieurs shops, par exemple).

15
siteduzero.com

Lorsque la transaction a été effectuée (qu'elle ait été correctement terminée, annulée ou qu'une erreur ait été détectée), Moneybookers vous renvoie toute une série de variables, par l'intermédiaire de votre script, définis dans le champ status_url. Je vais tout d'abord vous les décrire brièvement, et vous expliquerai plus précisément à quoi certaines d'entre elles vous serviront (pour éviter de se faire pirater, par exemple.)

Nom du champ

Description

Exemple

pay_to_email

Ce champ correspond à l'adresse du vendeur. C'est-à-dire vous.

email@domain.com

pay_from_email

Ce champ correspond à l'adresse du client. Celui qui vous a versé de l'argent.

email_client@domain.com

merchant_id

ID unique de votre compte marchand. Ce champ n'est utile que pour effectuer des requêtes sur le site de Moneybookers.

100005

customer_id

ID unique du compte du client qui a effectué le virement.

200005

transaction_id

ID unique que vous avez fourni pour la transaction. Si vous n'en avez pas fourni, le mb_transaction_id sera affiché dans ce champ.

A205220

mb_transaction_id

ID unique fourni par Moneybookers, pour la transaction.

A205220

mb_amount

Montant total crédité sur votre compte, dans la devise définie dans les options de votre compte Moneybookers

26.9

mb_currency

Devise définie dans les options de votre compte Moneybookers

EUR

status

Statut de la transaction.
-2 = échec / 2 = transfert OK / 0 = paiement en attente / -1 = paiement annulé par le client

2

md5sig

Signature numérique. Ce champ permet de certifier l'exactitude des données transmises. En d'autres mots, qu'elles n'ont pas été piratées.

327638C253A4637199CEBA6642371F20

amount

Montant total crédité sur votre compte, dans la devise définie lors du transfert

26.9

currency

Devise définie lors du transfert

EUR

payment_type

Type de paiement utilisé pour ce virement, par votre client.
Exemple : PBT = Paiement par virement bancaire / MBD = paiement direct.

MBD

merchant_fields
(id_client et sit_ref)

Les champs additionnels que vous avez définis précédemment dans le champ merchant_fields vous sont également retournés...

(15
siteduzero.com)

Pour mieux vous rendre compte des variables qui vous sont retournées par Moneybookers, vous pouvez écrire un petit script qui enregistre les données récoltées dans un fichier, et ainsi faire vos tests et constater les résultats retournés suivant les actions que vous avez entreprises...

Comme par exemple :

<?php
$fichier = fopen("retour_moneybookers.htm","a+"); //Ouvre un fichier en lecture - écriture. S'il n'existe pas, on le crée.
// on ajoute la date et l'heure de l'exécution du script comme titre, et on ouvre une balise de liste
fputs($fichier, '
<h1>'.date('d.m.Y H:s').'</h1>
<ul>
');
// Pour toutes les variables passées en POST
foreach ($_POST as $nom => $list_var)
        {
                // Écrit la liste des variables passées en POST
                fputs($fichier, '
                <li><strong>'.$nom. "</strong> => " .$list_var.'</li>');
        }
// On ferme la balise de liste.
fputs($fichier, '
</ul>');
fclose($fichier); // On ferme le fichier
?>

Vous avez ainsi un script capable de vous enregistrer un petit rapport des données récupérées de Moneybookers.
Note : il faut avoir les droits d'écriture dans le dossier pour créer un fichier de rapport.

Bien entendu, ce n'est pas - et de loin - le script final, mais il permet d'effectuer déjà quelques tests.

Anti-piratage

Maintenant que vous pouvez récupérer les champs retournés par Moneybookers, il serait très simple d'effectuer vos traitements grâce à votre script défini dans par le champ status_url.

Exemple :

<?php
if ($_POST['status'] == "2") // Si la vente est OK
{
  // Mise à jour de votre base de données.
  mysql_query("UPDATE liste_commandes SET etat_commande='OK' WHERE id_commande =".mysql_real_escape_string($_POST['transaction_id']));
  // ** autres traitements... **
}
?>

Mais votre script serait extrêmement vulnérable aux attaques des pirates.

Pourquoi tu dis ça, on a pourtant ajouté un mysql_real_escape_string !!! Et Moneybookers me dit que la vente est OK, alors pourquoi tu paniques ?

Je vois que vous avez bien révisé le cours de M@teo, mais là, votre script est encore beaucoup trop vulnérable. Je ne vais pas vous faire un cours de hacking, mais on va prendre un cas simple :
Un pirate crée une page identique à la vôtre, et invoque Moneybookers. Mais à la place de votre adresse e-mail, il met la sienne. Il effectue le paiement, Moneybookers vous retourne le statut du paiement (à l'adresse indiquée dans le champ status_url), et vous informe que le paiement a bien été effectué. Et vlan ! Vos traitements contenus dans votre script vont s'exécuter alors que vous n'aurez pas reçu un seul centime.

Avant d'exécuter vos traitements, il est donc impératif de contrôler l'exactitude des éléments suivants :

  • pay_to_email correspond bien à votre adresse e-mail ;

  • amountcorrespond bien au montant total de la transaction ;

  • currency correspond bien à la devise définie pour la transaction ;

  • *status correspond bien à 2 (paiement OK) ou à 0 (paiement en attente).

* Lorsque le paiement est en attente, c'est que votre client s'est inscrit à Moneybookers et qu'il s'apprête à effectuer un virement bancaire. Il va donc falloir attendre 3 ou 4 jours avant que l'argent soit transféré sur votre compte. Si après 14 jours, aucun transfert bancaire n'a été réalisé, la transaction est considérée comme annulée.
Moneybookers ré-exécute automatiquement votre script pour vous transmettre le nouveau statut. N'envoyez donc pas la marchandise si le statut est '0' (en attente).

Ce qui nous donnerait quelque chose comme ceci :

<?php
// Récupère la commande à traiter
$resultat_sql = mysql_query("SELECT * FROM liste_commandes WHERE id_commande =".mysql_real_escape_string($_POST['transaction_id']));
$commande = mysql_fetch_array($resultat_sql);
// Vérifie l'exactitude de l'e-mail à créditer, le montant et la devise.
if (
$_POST['pay_to_email'] == "email@domaine.com"
AND
$_POST['amount'] == $commande['amount']
AND
$_POST['currency'] == $commande['currency']
   )
{
   // Selon le statut de l'opération
   switch ($_POST['status'])
   {
      case "-2":
         mysql_query("UPDATE SET etat_commande='erreur' FROM liste_commandes WHERE id_commande =".mysql_real_escape_string($_POST['transaction_id']));
         break;
      case "2":
         mysql_query("UPDATE SET etat_commande='OK' FROM liste_commandes WHERE id_commande =".mysql_real_escape_string($_POST['transaction_id']));
         break;
      case "0":
         mysql_query("UPDATE SET etat_commande='attente' FROM liste_commandes WHERE id_commande =".mysql_real_escape_string($_POST['transaction_id']));
         break;
      case "-1":
         mysql_query("UPDATE SET etat_commande='annulé' FROM liste_commandes WHERE id_commande =".mysql_real_escape_string($_POST['transaction_id']));
         break;
   }
}
else
{
   // Traitement à effectuer en cas de piratage (coup de fouets, travaux forcés, etc.)
}
?>

Mais ce n'est pas tout...
Si maintenant le pirate remplit lui-même un formulaire avec les données qu'il veut à l'intérieur, et l'envoie directement à la page de votre script, il peut vous faire croire que c'est Moneybookers qui vous dit que le traitement a été correctement effectué ; vous aurez effectivement les bonnes données dans le formulaire, mais vous n'aurez toujours pas un seul centime sur votre compte. Il va falloir maintenant contrer ce deuxième type d'attaque.

Pour cela, il vous faudra procéder comme suit.

Sur le site de Moneybookers, connectez-vous, puis cliquez sur le lien Outils marchands situé dans la barre de menu, sur votre gauche.
Si vous n'avez pas cette option, c'est que vous n'avez pas de compte marchand. Pour y remédier, contactez le service marchand de Moneybookers, à l'adresse suivante : merchantservices@moneybookers.com, afin qu'ils modifient votre compte pour vous ajouter cette option. Ou alors, créez-vous un compte marchand, sur leur site.

Une fois dans les Outils marchands, entrez un mot secret dans le champ Mot secret. Ce mot doit être écrit en minuscules. Si vous mettez des lettres en majuscules, elles seront converties en minuscules.
Ce mot secret vous servira à vérifier les données transmises par Moneybookers.

Maintenant, retournons du côté de notre programme. Vous vous rappelez du champ md5sig que Moneybookers nous retourne ? Eh bien il s'agit d'une clé numérique générée grâce à la concaténation des champs suivants, cryptés en 128 bits, avec l'algorithme MD5 :

  • merchant_id ;

  • transaction_id ;

  • Le md5en majuscules du mot secreten minuscules défini dans les outils marchands ;

  • mb_amount ;

  • mb_currency ;

  • status.

Il n'existe aucun moyen de retrouver les valeurs initiales d'un md5. Il va donc nous falloir également crypter cette concaténation, et vérifier qu'elle soit bien égale au md5sig de Moneybookers.

Pour cela, nous aurons besoin du md5 de votre mot secret. Vous pouvez le trouver grâce à la fonction PHP md5. Ensuite, vous n'aurez plus qu'à concaténer vos champs, d'effectuer un autre md5 de cette concaténation, et vous voilà avec un md5 scrupuleusement identique à celui généré par Moneybookers.

Si nous ajoutons toutes ces modifications à notre premier programme (celui qui génère un rapport), ça nous donne ceci :

<?php
$fichier = fopen("retour_moneybookers.htm","a+"); 
fputs($fichier, '
<h1>'.date('d.m.Y H:s').'</h1>
<ul>
');
foreach ($_POST as $nom => $list_var)
        {
                fputs($fichier, '
               <li><strong>'.$nom. "</strong> => " .$list_var.'</li>');
        }
fputs($fichier, '
</ul>');
 
$mot_secret = md5("abc1234"); // Calcul du MD5 de notre mot secret, abc123 pour prendre un exemple.
$mot_secret = strtoupper($mot_secret); // Convertit notre md5 du mot secret, en majuscules
$mon_md5 = md5($_POST['merchant_id'].$_POST['transaction_id'].$mot_secret.$_POST['mb_amount'].$_POST['mb_currency'].$_POST['status']); // Calcul du MD5 de notre concaténation.
$mon_md5 = strtoupper($mon_md5); // Convertit notre md5 de la concaténation, en majuscules
// Ajoute notre md5 de la concaténation dans le fichier de rapport.
fputs($fichier, '
<p>Mon MD5 => <strong>'.$mon_md5.'</strong></p>');
fclose($fichier); 
?>

Et dans le second qui effectue les traitements, ça nous donne ceci :

<?php
// Récupère la commande à traiter
$resultat_sql = mysql_query("SELECT * FROM liste_commandes WHERE id_commande =".mysql_real_escape_string($_POST['transaction_id']));
$commande = mysql_fetch_array($resultat_sql);
 
// Pour éviter de devoir mettre votre mot secret en clair dans votre programme, et surtout pour éviter que votre script s'efforce à chaque fois de calculer le md5 de votre mot secret, indiquez directement le md5 plutôt que d'effectuer cette opération : $mot_secret = strtoupper(md5("abc1234")); 
$mot_secret = "A141C47927929BC2D1FB6D336A256DF4";
// Calcul du md5 de notre concaténation
$mon_md5 = md5($_POST['merchant_id'].$_POST['transaction_id'].$mot_secret.$_POST['mb_amount'].$_POST['mb_currency'].$_POST['status']); // Calcul du MD5 de notre concaténation.
strtoupper($mon_md5); // Convertit notre md5 de la concaténation, en majuscules
 
// Vérifie l'exactitude de l'e-mail à créditer, le montant, la devise et la signature md5.
if (
$_POST['md5sig'] == $mon_md5
AND
$_POST['pay_to_email'] == "email@domaine.com"
AND
$_POST['amount'] == $commande['amount']
AND
$_POST['currency'] == $commande['currency']
   )
{
   // Selon le statut de l'opération
   switch ($_POST['status'])
   {
      case "-2":
         mysql_query("UPDATE SET etat_commande='erreur' FROM liste_commandes WHERE id_commande =".mysql_real_escape_string($_POST['transaction_id']));
         break;
      case "2":
         mysql_query("UPDATE SET etat_commande='OK' FROM liste_commandes WHERE id_commande =".mysql_real_escape_string($_POST['transaction_id']));
         break;
      case "0":
         mysql_query("UPDATE SET etat_commande='attente' FROM liste_commandes WHERE id_commande =".mysql_real_escape_string($_POST['transaction_id']));
         break;
      case "-1":
         mysql_query("UPDATE SET etat_commande='annulé' FROM liste_commandes WHERE id_commande =".mysql_real_escape_string($_POST['transaction_id']));
         break;
   }
}
else
{
   // Traitement à effectuer en cas de piratage (coup de fouets, travaux forcés, etc.)
}
?>

Vous avez maintenant l'ébauche d'un programme qui peut tourner de manière automatique, et qui contient tous les éléments pour ne pas être piraté.

Autres informations utiles

En plus de tout ce que je vous ai montré dans ce tutoriel, vous avez également la possibilité de :

  • définir quels types de paiement vous souhaitez accepter grâce au champ : payment_methods. Par défaut, tous les types de paiements disponibles sont affichés. Cette option est utile uniquement si vous souhaitez faire choisir le type de paiement à vos visiteurs, avant de les rediriger sur le site de Moneybookers ;

  • transmettre à Moneybookers les données de votre client (nom, prénom, adresse, etc.). Si votre client est déjà enregistré sur votre site, c'est très intéressant de lui pré-remplir les champs d'inscription à Moneybookers, s'il n'est pas déjà enregistré. C'est un gain de temps et un confort supplémentaire pour vos clients ;

  • vous pouvez envoyer les données du formulaire à Moneybookers depuis le serveur, puis diriger votre client sur le site de Moneybookers en passant en paramètre l'ID de la session ouverte par votre serveur. Ainsi, votre client n'a aucun moyen de voir quels sont les champs vous avez transmis à Moneybookers (comme le merchant_fields, par exemple...) ;

  • interroger la base de données de Moneybookers afin de retrouver tous les paiements exécutés ou annulés, grâce à l'interface nommée Merchant Query Interface. Cette interface s'utilise de la même manière que celle du Merchant Payment Interface que nous avons vu dans ce tutoriel.

Vous retrouvez toutes ces informations dans le document officiel de Moneybookers, ainsi que d'autres infos tel que les codes pays ISO, les codes monnaies ISO, etc.

Moneybookers a également une interface nommée Moneybookers Automated Payments Interface qui vous permet d'effectuer des paiements automatiquement depuis votre propre compte. Ainsi, vous pouvez payer vos créanciers par Moneybookers, d'un simple clic. Vous trouverez une documentation officielle sur leur site.

Annexes :

Voilà : vous avez maintenant un système complet vous permettant d'accepter plusieurs types de paiements.

Logo PayPalPour ceux que ça intéresse, j'ai également créé un tutoriel sur PayPal.
Mais ce type de paiement est un peu plus compliqué à gérer si on veut le rendre dynamique, car il utilise un système d'API.

Il est possible également d'utiliser une autre méthode plus ou moins similaire à celle de Moneybookers, mais je n'ai pas encore rédigé de chapitre concernant cette seconde méthode.

Voici l'adresse de ce tutoriel : Paiement en ligne par PayPal

Exemple de certificat de réussite
Exemple de certificat de réussite