La solution Paybox System

Appel de la page de paiement

Pour afficher la page de paiement au client qui souhaite payer sur le site Marchand, il suffit d’envoyer à l’URL de Paybox System une requête HTTPS avec un certain nombre de variables.

PRÉPARATION DU MESSAGE
Les variables suivantes sont obligatoires dans toute requête :

•    PBX_SITE = Numéro de site (fourni par Paybox)
•    PBX_RANG = Numéro de rang (fourni par Paybox)
•    PBX_IDENTIFIANT = Identifiant interne (fourni par Paybox)
•    PBX_TOTAL = Montant total de la transaction
•    PBX_DEVISE = Devise de la transaction
•    PBX_CMD = Référence commande côté commerçant
•    PBX_PORTEUR = Adresse E-mail de l’acheteur
•    PBX_RETOUR = Liste des variables à retourner par Paybox
•    PBX_HASH = Type d’algorithme de hachage pour le calcul de l’empreinte
•    PBX_TIME = Horodatage de la transaction
•    PBX_HMAC = Signature calculée avec la clé secrète

La signification de ces différentes variables ainsi que des variables optionnelles est disponible dans la partie dictionnaire des données.
L’ensemble de ces variables doit être envoyé par la méthode http POST à l’un de nos serveurs de paiement.
Pour transmettre les variables, vous pouvez utiliser un formulaire comme celui-ci (à titre d’exemple, en pré-production) :

<form method="POST" action="https://preprod-tpeweb.paybox.com/cgi/MYchoix_pagepaiement.cgi">
  <input type="hidden" name="PBX_SITE" value="1999888">
  <input type="hidden" name="PBX_RANG" value="32">
  <input type="hidden" name="PBX_IDENTIFIANT" value="110647233">
  <input type="hidden" name="PBX_TOTAL" value="999">
  <input type="hidden" name="PBX_DEVISE" value="978">
  <input type="hidden" name="PBX_CMD" value="TEST Paybox">
  <input type="hidden" name="PBX_PORTEUR" value="test@paybox.com">
  <input type="hidden" name="PBX_RETOUR" value="Mt:M;Ref:R;Auto:A;Erreur:E">
  <input type="hidden" name="PBX_HASH" value="SHA512">
  <input type="hidden" name="PBX_TIME" value="2013-10-11T09:42:08+00:00">
  <input type="hidden" name="PBX_HMAC" value="D47AB2FDC9ADF9669651C6F8F785F698FB77C75AE314D0060A0528B434F4FE12BA3D027D066A1E8038FA56E7704EC882AA8E44FB36D44957A0F5BA8BE03E03E9">
  <input type="submit" value="Payer">
</form>

Ainsi, le seul élément visible sur la page sera un bouton “Envoyer”. Quand le client cliquera dessus, il sera automatiquement redirigé vers la page de paiement de Paybox System.

Le paiement sera de 1000 centimes d’euros (soit 10 €) et l’identification du paiement par rapport à la commande du commerçant sera la référence  “TEST Paybox”.
Une fois le paiement effectué, si ce dernier est accepté, un ticket de paiement sera envoyé par mail au commerçant ainsi qu’au client à « client@test.com ».
L’identification du commerçant (site 1999888, rang 32 et identifiant 2) correspond à la boutique de test Paybox, accessible sur notre environnement de pré-production.
Des informations complémentaires concernant les conditions de test sur notre environnement de pré-production sont disponibles au chapitre Jeux de tests.
L’exemple ci-dessus fait référence à une URL du serveur de pré-production. Les URLs de pré-production et production sont définies au chapitre Les plateformes de test.

Forçage du moyen de paiement

Si le commerçant préfère se charger lui-même du choix du moyen de paiement, il est possible de fournir directement à l’appel de Paybox System l’information du moyen de paiement choisi. Ceci se fait par l’intermédiaire des variables PBX_TYPEPAIEMENT et PBX_TYPECARTE.
Ainsi, le client sera redirigé directement sur la page de paiement adaptée au moyen de paiement choisi, et ne verra donc pas la page de présélection du moyen de paiement Paybox System.
Exemple : Pour un paiement avec une carte CB classique, il faut documenter PBX_TYPEPAIEMENT à “CARTE” et PBX_TYPECARTE à “CB”.
L’ensemble des valeurs possibles pour ces variables est disponible dans le dictionnaire des données.

Attention : Les 2 variables PBX_TYPEPAIEMENT et PBX_TYPECARTE doivent obligatoirement fonctionner conjointement et l’utilisation de l’une sans l’autre ou bien une valorisation non conforme à ce qui est indiqué dans ce manuel technique peut amener des risques d’erreurs d’accès à la page de paiement ou des comportements non attendus lors de la phase de paiement.

Authentification du message par empreinte

Afin de sécuriser le paiement, c’est-à-dire assurer que c’est bien le commerçant qui en est à l’origine et que personne de malveillant n’a modifié une variable (le montant par exemple), Paybox a choisi d’établir une authentification par empreinte HMAC de l’ensemble des paramètres transmis.

  • Étape 0 : Si ce n’est pas déjà fait, le commerçant doit générer une clé secrète via l’accès Back-Office commerçant. Voir Gestion de la clé d’authentification.
  • Étape 1 : il faut ensuite, lors de la création d’un message à destination des serveurs de Paybox, concaténer l’ensemble des variables en séparant chaque variable par le symbole « & ». Pour le message ci-dessus, il faut donc se baser sur la chaine suivante :
PBX_SITE=1999888&PBX_RANG=32&PBX_IDENTIFIANT=110647233&PBX_TOTAL=999&PBX_DEVISE=978&PBX_CMD=TEST Paybox&PBX_PORTEUR=test@paybox.com&PBX_RETOUR=Mt:M;Ref:R;Auto:A;Erreur:E&PBX_HASH=SHA512&PBX_TIME=2013-10-11T12:21:40+00:00
  •  Étape2 : il est alors possible de lancer le calcul de l’empreinte HMAC en utilisant
  • La chaine qui vient d’être construite
  • La clé secrète obtenue via le Back Office
  • Un algorithme au choix (cf. PBX_HASH dans le dictionnaire des données)
  • Étape 3 : le résultat obtenu (l’empreinte) doit alors être placé dans le champ PBX_HMAC de la requête.

L’ordre dans la chaine à hasher doit être strictement identique à l’ordre des variables dans le formulaire.
Dans la chaine à hasher, il faut utiliser les données « brutes », c’est-à-dire ne pas utiliser les fonctions d’encodage URL.

Voici un exemple de code PHP permettant de calculer l’empreinte du message :

<?php
// clef secrète du commerçant
$secretKeyTest = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
// URL du serveur (ici la pre-production pour les tests)
$PAYBOX_DOMAIN_SERVER = "preprod-tpeweb.paybox.com";
// On récupère la date au format ISO-8601
$dateTime = date("c");
// On renseigne les différents paramètres de la requête de paiement
$PBX_SITE = "1999888";
$PBX_RANG = "32";
$PBX_IDENTIFIANT = "110647233";
$PBX_TOTAL = 999;
$PBX_DEVISE = 978;
$PBX_CMD = "TEST Paybox";
$PBX_PORTEUR = "test@paybox.com";
$PBX_RETOUR = "Mt:M;Ref:R;Auto:A;Erreur:E";
$PBX_HASH = "SHA512";
$PBX_TIME = $dateTime;
// On crée la chaîne à hacher sans URLencodage
$msg =
"PBX_SITE=$PBX_SITE".
"&PBX_RANG=$PBX_RANG".
"&PBX_IDENTIFIANT=$PBX_IDENTIFIANT".
"&PBX_TOTAL=$PBX_TOTAL".
"&PBX_DEVISE=$PBX_DEVISE".
"&PBX_CMD=$PBX_CMD".
"&PBX_PORTEUR=$PBX_PORTEUR".
"&PBX_RETOUR=$PBX_RETOUR".
"&PBX_HASH=$PBX_HASH".
"&PBX_TIME=$PBX_TIME";
// On récupère la clé secrète HMAC (stockée dans une base de données par exemple) et que l’on renseigne dans la variable $keyTest;
// Si la clé est en ASCII, On la transforme en binaire
$binKey = pack("H*", $secretKeyTest);
// On calcule l’empreinte (à renseigner dans le paramètre PBX_HMAC) grâce à la fonction hash_hmac et // la clé binaire
// On envoie via la variable PBX_HASH l'algorithme de hachage qui a été utilisé (SHA512 dans ce cas)
// Pour afficher la liste des algorithmes disponibles sur votre environnement, décommentez la ligne // suivante
//print_r(hash_algos());
$hmac = strtoupper(hash_hmac('sha512', $msg, $binKey));
// La chaîne sera envoyée en majuscules, d'où l'utilisation de strtoupper()
// On crée le formulaire à envoyer à Paybox System
// ATTENTION : l'ordre des champs est extrêmement important, il doit
// correspondre exactement à l'ordre des champs dans la chaîne hachée
?>
<form method="POST" action="https://<?php echo $PAYBOX_DOMAIN_SERVER; ?>/cgi/MYchoix_pagepaiement.cgi">
<input type="hidden" name="PBX_SITE"        value="<?php echo $PBX_SITE; ?>">
<input type="hidden" name="PBX_RANG"        value="<?php echo $PBX_RANG; ?>">
<input type="hidden" name="PBX_IDENTIFIANT" value="<?php echo $PBX_IDENTIFIANT; ?>">
<input type="hidden" name="PBX_TOTAL"       value="<?php echo $PBX_TOTAL; ?>">
<input type="hidden" name="PBX_DEVISE"      value="<?php echo $PBX_DEVISE; ?>">
<input type="hidden" name="PBX_CMD"         value="<?php echo $PBX_CMD; ?>">
<input type="hidden" name="PBX_PORTEUR"     value="<?php echo $PBX_PORTEUR; ?>">
<input type="hidden" name="PBX_RETOUR"      value="<?php echo $PBX_RETOUR; ?>">
<input type="hidden" name="PBX_HASH"        value="<?php echo $PBX_HASH; ?>">
<input type="hidden" name="PBX_TIME"        value="<?php echo $PBX_TIME; ?>">
<input type="hidden" name="PBX_HMAC"        value="<?php echo $hmac; ?>">
<input type="submit" value="Payer">
</form>

 

Attention : Si vous utilisez déjà l’ancienne méthode de communication avec Paybox (par module CGI sur le serveur marchand), le premier appel HMAC bloquera les paiements par l’ancienne méthode sur la plateforme appelée (Utiliser l’authentification HMAC en pré-production, n’affectera pas votre production).

Url appelée

La liste des URLs des serveurs Paybox est détaillée au paragraphe URLs d’appels et adresses IP.
En cas d’indisponibilité de cette URL, des URLs de secours sont disponibles. Il est de la responsabilité du site Marchand de vérifier la disponibilité d’une URL avant de rediriger le client.
Il est possible de tester la disponibilité des serveurs en essayant d’accéder à une page HTML « load.htm ». Cette page contient uniquement la chaîne « OK » qui confirme que le serveur est accessible.
Ci-dessous un exemple de code PHP pour tester la disponibilité des serveurs Paybox (attention les URLs indiquées dans l’exemple sont factices, elles sont à remplacer par les vraies URLs de production) :

<?php
$serveurs = array(
'tpeweb.paybox.com', //serveur primaire
'tpeweb1.paybox.com'
); //serveur secondaire
$serveurOK = "";
foreach ($serveurs as $serveur) {
$doc = new DOMDocument();
$doc->loadHTMLFile('https://' . $serveur . '/load.html');
$server_status = "";
$element = $doc->getElementById('server_status');
if ($element) {
$server_status = $element->textContent;
}
if ($server_status == "OK") {
//Le serveur est prêt et les services opérationnels
$serveurOK = $serveur;
break;
}
// else : La machine est disponible mais les services ne le sont pas.
}
if (!$serveurOK) {
die("Erreur : Aucun serveur n'a été trouvé");
}
?>