Commit 778b7b22 authored by Skia's avatar Skia

Add Eboutic user guides and reference examples

parent a12b7725
Pipeline #929 passed with stage
in 5 minutes and 8 seconds
<?php
// --------------- VARIABLES A MODIFIER ---------------
// Ennonciation de variables
$pbx_site = '1520411'; //variable de test 1999888
$pbx_rang = '001'; //variable de test 32
$pbx_identifiant = '650995411'; //variable de test 3
$pbx_cmd = 'CMD_1'; //variable de test cmd_test1
$pbx_porteur = 'skia@git.an'; //variable de test test@test.fr
$pbx_total = '510'; //variable de test 100
// Suppression des points ou virgules dans le montant
$pbx_total = str_replace(",", "", $pbx_total);
$pbx_total = str_replace(".", "", $pbx_total);
// Paramétrage des urls de redirection après paiement
$pbx_effectue = 'http://www.votre-site.extention/page-de-confirmation';
$pbx_annule = 'http://www.votre-site.extention/page-d-annulation';
$pbx_refuse = 'http://www.votre-site.extention/page-de-refus';
// Paramétrage de l'url de retour back office site
$pbx_repondre_a = 'http://www.votre-site.extention/page-de-back-office-site';
// Paramétrage du retour back office site
$pbx_retour = 'Amount:M;BasketID:R;Auto:A;Error:E;Sig:K';
// Connection à la base de données
// mysql_connect...
// 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;
//$keyTest = '0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF';
$keyTest = '2d21b1f0d5b64bce056b342b5259db312dfc0176dcafb33eb804b6aaaa3acc07320742954ef3b052f36942b09f86ccb9d24c8814586c1a0d24319fd8985c19e5';
// --------------- TESTS DE DISPONIBILITE DES SERVEURS ---------------
/*
$serveurs = array('tpeweb.paybox.com', //serveur primaire
'tpeweb1.paybox.com'); //serveur secondaire
$serveurOK = "";
//phpinfo(); <== voir paybox
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.
}
//curl_close($ch); <== voir paybox
if(!$serveurOK){
die("Erreur : Aucun serveur n'a été trouvé");}
// Activation de l'univers de préproduction
//$serveurOK = 'preprod-tpeweb.paybox.com';
//Création de l'url cgi paybox
$serveurOK = 'https://'.$serveurOK.'/cgi/MYchoix_pagepaiement.cgi';
// echo $serveurOK;
*/
// --------------- TRAITEMENT DES VARIABLES ---------------
// On récupère la date au format ISO-8601
$dateTime = date("c");
$dateTime = "2016-07-26T15:38:11+02:00";
// 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=978".
"&PBX_CMD=".$pbx_cmd.
"&PBX_PORTEUR=".$pbx_porteur.
// "&PBX_REPONDRE_A=".$pbx_repondre_a.
"&PBX_RETOUR=".$pbx_retour.
// "&PBX_EFFECTUE=".$pbx_effectue.
// "&PBX_ANNULE=".$pbx_annule.
// "&PBX_REFUSE=".$pbx_refuse.
"&PBX_HASH=SHA512".
"&PBX_TIME=".$dateTime;
// echo $msg;
// Si la clé est en ASCII, On la transforme en binaire
$binKey = pack("H*", $keyTest);
// On calcule l’empreinte (à renseigner dans le paramètre PBX_HMAC) grâce à la fonction hash_hmac et //
// la clé binaire
// On envoi 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());
echo $msg, "\n\n";
var_dump($binKey);
$hmac = strtoupper(hash_hmac('sha512', $msg, $binKey));
// La chaîne sera envoyée en majuscule, d'où l'utilisation de strtoupper()
// On crée le formulaire à envoyer
// ATTENTION : l'ordre des champs est extrêmement important, il doit
// correspondre exactement à l'ordre des champs dans la chaîne hachée
?>
<!------------------ ENVOI DES INFORMATIONS A PAYBOX (Formulaire) ------------------>
<form method="POST" action="<?php echo $serveurOK; ?>">
<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="978">
<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="SHA512">
<input type="hidden" name="PBX_TIME" value="<?php echo $dateTime; ?>">
<input type="hidden" name="PBX_HMAC" value="<?php echo $hmac; ?>">
<input type="submit" value="Envoyer">
</form>
package signver;
import java.security.interfaces.RSAPublicKey;
import java.security.Signature;
import java.security.KeyFactory;
import java.security.spec.X509EncodedKeySpec;
import java.io.FileInputStream;
import java.io.DataInputStream;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.net.URLCodec;
public class SignVer {
// verification signature RSA des donnees avec cle publique
private static boolean verify( byte[] dataBytes, byte[] sigBytes, String sigAlg, RSAPublicKey pubKey) throws Exception
{
Signature sig = Signature.getInstance(sigAlg);
sig.initVerify(pubKey);
sig.update(dataBytes);
return sig.verify(sigBytes);
}
// chargement de la cle AU FORMAT der :
// openssl rsa -inform PEM -in pbx_pubkey.pem -outform DER -pubin -out /tmp/pubkey.der
private static RSAPublicKey getPubKey(String pubKeyFile) throws Exception
{
FileInputStream fis = new FileInputStream(pubKeyFile);
DataInputStream dis = new DataInputStream(fis);
byte[] pubKeyBytes = new byte[fis.available()];
dis.readFully(pubKeyBytes);
fis.close();
dis.close();
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
// extraction cle
X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(pubKeyBytes);
RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(pubSpec);
return pubKey;
}
// exemple de verification de la signature
public static void main(String[] unused) throws Exception {
String sData = ""; // donnees signees URL encodees
String sSig = ""; // signature Base64 et URL encodee
// decodage ...
byte[] dataBytes = URLCodec.decodeUrl(sData.getBytes());
byte[] sigBytes = Base64.decodeBase64( URLCodec.decodeUrl(sSig.getBytes()));
// lecture de la cle publique
RSAPublicKey pubK = getPubKey("/tmp/pubkey.der");
// verification signature
boolean result = verify(dataBytes, sigBytes, "SHA1withRSA", pubK);
// affichage resultat
System.out.println("Resultat de la verification de signature : " + result);
}
}
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCvDYKaLH2xz4goZYXZWoHo6wyMb24A1iF7s70tB/g3XthEVS+/
Wov+ZGqNTMLc0L+HZAJjcEc9h8Br5jPLR4VhaoKi+rezDxTQweaC24ydJWFKRhyX
Bhm2Wfnhppgzv9EqZKOrFaTlLQHu0F+KWEd7LngP4xcW9qjt19MfEmk0swIDAQAB
AoGABqXztNlFuNAR8r7QU43tayQqKNc+jUeUo/cSkzg/RBMVEZtOoezVbkbwCQfG
Ss6ex4yTzqT//6U9OJvYkbrYpOdq2BinuRv9n/NlKhCJ/Ym9s/DS8D6xdEX/R5lg
mIURQYl9uHS6VVnLq79j38BsjIhDAvjuSzZGZUa4v0iBTHkCQQDWp4iPqv2jUzBW
UgDP6C+QFqLgYKuYxF+yyBCXO0XzaHaEJUBuxuvTU/kuIifk3lhXnV5r0sXJd2Ax
aQkoJXc1AkEA0MU+4SSYPYADQm1gcXXuR4Kjb0/QhIGRiotxVu2nLGS7aULe1D8p
XoLpSQCv3j5amtXVx1yTWuaEYZqHVeQxRwJAdOprh1UrMXpuKZYgux1MSr8JmA0P
afYL6eTupHC0eQ+8/d0Ma0oNyN1EK8yOzioNFCuy8ierc0CCNGdxhVxiwQJAP/cv
fOwpeS5v0TqSAjGQAHkWelSKHw9T+I8g+vF19zQl9+p1O7LeigayU5vSRtX0DNzX
022Z+JAIn58pODfioQJBALQGN2kFCSk935VnMUJ4X5qFCKiXBgebuARUSw6tDEpY
gFdqyJE4WQ4uWVz0D9M27lCa8wj7pYrOhB/UiMKbuqY=
-----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvDYKaLH2xz4goZYXZWoHo6wyM
b24A1iF7s70tB/g3XthEVS+/Wov+ZGqNTMLc0L+HZAJjcEc9h8Br5jPLR4VhaoKi
+rezDxTQweaC24ydJWFKRhyXBhm2Wfnhppgzv9EqZKOrFaTlLQHu0F+KWEd7LngP
4xcW9qjt19MfEmk0swIDAQAB
-----END PUBLIC KEY-----
<?php
$montant=$_GET['montant'];
$ref_com=$_GET['ref'];
$auto=$_GET['auto'];
$trans=$_GET['trans'];
print ("<center><b><h2>Votre transaction a été acceptée</h2></center></b><br>");
print ("<br><b>MONTANT : </b>$montant\n");
print ("<br><b>REFERENCE : </b>$ref_com\n");
print ("<br><b>AUTO : </b>$auto\n");
print ("<br><b>TRANS : </b>$trans\n");
?>
\ No newline at end of file
<?php
$montant=$_GET['montant'];
$ref_com=$_GET['ref'];
#$auto=$_GET['auto'];
$trans=$_GET['trans'];
print ("<center><b><h2>Votre transaction a été annulée</h2></center></b><br>");
print ("<br><b>MONTANT : </b>$montant\n");
print ("<br><b>REFERENCE : </b>$ref_com\n");
#print ("<br><b>AUTO : </b>$auto\n");
print ("<br><b>TRANS : </b>$trans\n");
?>
\ No newline at end of file
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Exemple_mail_ticket_client</title>
<style>
<!--
/* Font Definitions */
@font-face
{font-family:"Bernard MT Condensed";
panose-1:0 0 0 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman";}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;}
p
{font-size:12.0pt;
font-family:"Times New Roman";}
p.style1, li.style1, div.style1
{margin-right:0cm;
margin-left:0cm;
font-size:9.0pt;
font-family:"Bernard MT Condensed";}
@page Section1
{size:595.3pt 841.9pt;
margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.Section1
{page:Section1;}
-->
</style>
</head>
<body lang=FR link=blue vlink=purple>
<div class=Section1>
<p class=style1 align=center style='text-align:center'><b><i><span
style='font-size:10.0pt;font-family:Arial;color:#333399'>Merci de votre
commande</span></i></b></p>
<p class=style1 align=center style='text-align:center'><b><i><span
style='font-size:10.0pt;font-family:Arial;color:#333399'>Celle-ci sera traite
dans les meilleurs dlais</span></i></b></p>
<p class=style1 align=center style='text-align:center'><b><i><span
style='font-size:10.0pt;font-family:Arial;color:#333399'>Cordialement,</span></i></b></p>
<p align=center style='text-align:center'><img width=200 height=50
src="Boutique.fr/Images/votre_logo.jpg" alt="Votre Enseigne"></p>
<p align=center style='margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt;
margin-left:0cm;text-align:center'><b><span style='font-size:8.0pt;font-family:
Arial;color:#FF9900'>Gardez les rfrences de votre commande et n'hsitez pas
nous contacter si vous avez des questions :</span></b></p>
<p align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center'><b><span
style='font-size:8.0pt;font-family:Arial;color:#FF9900'>tel : 00 00 00 00 00</span></b></p>
<p align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center'><b><span
style='font-size:8.0pt;font-family:Arial;color:#FF9900'>courriel : <a
href="mailto:contact@maboutique.fr"><span style='color:#FF9900;text-decoration:
none'>contact@maboutique.fr</span></a></span></b></p>
</div>
</body>
</html>
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDe+hkicNP7ROHUssGNtHwiT2Ew
HFrSk/qwrcq8v5metRtTTFPE/nmzSkRnTs3GMpi57rBdxBBJW5W9cpNyGUh0jNXc
VrOSClpD5Ri2hER/GcNrxVRP7RlWOqB1C03q4QYmwjHZ+zlM4OUhCCAtSWflB4wC
Ka1g88CjFwRw/PB9kwIDAQAB
-----END PUBLIC KEY-----
<?php
$montant=$_GET['montant'];
$ref_com=$_GET['ref'];
#$auto=$_GET['auto'];
$trans=$_GET['trans'];
print ("<center><b><h2>Votre transaction a été refusée</h2></center></b><br>");
print ("<br><b>MONTANT : </b>$montant\n");
print ("<br><b>REFERENCE : </b>$ref_com\n");
#print ("<br><b>AUTO : </b>$auto\n");
print ("<br><b>TRANS : </b>$trans\n");
?>
\ No newline at end of file
///// script PHP de vérification de la signature Paybox.
///// Ce code peut s'executer dans un contexte Apache/PHP.
///// Il affiche alors une page web qui permet de vérifier et signer des données.
<html>
<head>
<title>formulaire d'exemple pour test signature</title>
</head>
<body>
<?php
$status = "GUY";
function LoadKey( $keyfile, $pub=true, $pass='' ) { // chargement de la clé (publique par défaut)
$fp = $filedata = $key = FALSE; // initialisation variables
$fsize = filesize( $keyfile ); // taille du fichier
if( !$fsize ) return FALSE; // si erreur on quitte de suite
$fp = fopen( $keyfile, 'r' ); // ouverture fichier
if( !$fp ) return FALSE; // si erreur ouverture on quitte
$filedata = fread( $fp, $fsize ); // lecture contenu fichier
fclose( $fp ); // fermeture fichier
if( !$filedata ) return FALSE; // si erreur lecture, on quitte
if( $pub )
$key = openssl_pkey_get_public( $filedata ); // recuperation de la cle publique
else // ou recuperation de la cle privee
$key = openssl_pkey_get_private( array( $filedata, $pass ));
return $key; // renvoi cle ( ou erreur )
}
// comme precise la documentation Paybox, la signature doit être
// obligatoirement en dernière position pour que cela fonctionne
function GetSignedData( $qrystr, &$data, &$sig ) { // renvoi les donnes signees et la signature
$pos = strrpos( $qrystr, '&' ); // cherche dernier separateur
$data = substr( $qrystr, 0, $pos ); // et voila les donnees signees
$pos= strpos( $qrystr, '=', $pos ) + 1; // cherche debut valeur signature
$sig = substr( $qrystr, $pos ); // et voila la signature
$sig = base64_decode( urldecode( $sig )); // decodage signature
}
// $querystring = chaine entière retournée par Paybox lors du retour au site (méthode GET)
// $keyfile = chemin d'accès complet au fichier de la clé publique Paybox
function PbxVerSign( $qrystr, $keyfile ) { // verification signature Paybox
$key = LoadKey( $keyfile ); // chargement de la cle
if( !$key ) return -1; // si erreur chargement cle
// penser à openssl_error_string() pour diagnostic openssl si erreur
GetSignedData( $qrystr, $data, $sig ); // separation et recuperation signature et donnees
return openssl_verify( $data, $sig, $key ); // verification : 1 si valide, 0 si invalide, -1 si erreur
}
if( !isset( $_POST['data'] )) // pour alimentation par defaut quand premier affichage du formulaire
$_POST['data'] = 'arg1=aaaa&arg2=bbbb&arg3=cccc&arg4=dddd';
if( isset( $_POST['signer']) ) { // si on a demande la signature
$key = LoadKey( 'TestK004.prv.pem', false ); // chargement de la cle prive (de test, sans mot de passe)
if( $key ) {
openssl_sign( $_POST['data'], $signature, $key ); // generation de la signature
openssl_free_key( $key ); // liberation ressource (confidentialite cle prive)
$status = "OK";
}
else $status = openssl_error_string(); // diagnostic erreur
$_POST['signeddata'] = $_POST['data']; // construction chaine data + signature
$_POST['signeddata'] .= '&sig=';
$_POST['signeddata'] .= urlencode( base64_encode( $signature ));
}
if( isset( $_POST['verifier']) ) { // si on a demande la verification
$CheckSig = PbxVerSign( $_POST['signeddata'], 'TestK004.pub.pem' );
if( $CheckSig == 1 ) $status = "Signature valide";
else if( $CheckSig == 0 ) $status = "Signature invalide : donnees alterees ou signature falsifiee";
else $status = "Erreur lors de la vérification de la signature";
}
?>
<form action="testsign.php" method="POST">
<table border="0" cellpadding="3" cellspacing="0" align="center">
<tr>
<td>status = <?php echo $status; ?></td>
</tr>
<tr>
<td><input type="text" name="data" size="80"value="<?= $_POST['data'] ?>"></td>
<td><input type="submit" name="signer" value="signer"/></td>
</tr>
<tr>
<td><input type="text" name="signeddata" size="80"value="<?= $_POST['signeddata'] ?>"></td>
<td><input type="submit" name="verifier" value="verifier"/></td>
</tr>
</table>
</form>
</body>
</html>
/* CSS Document */
/* feuille de style par d?faut pour les pages
de choix de paiement et de paiement
paybox system*/
th { /* headers de tables (dans choix paiement les ent?tes de table en bleu )*/
color: black;
background-color: #2890D6;
font-size: 16px;
font-weight: bold;
}
td {/* cellules */
font-size: 13px;
}
h2 {/*le texte 'paiement de' et '?'*/
margin:0;
padding: 0;
}
.pbx_table_logo td {/*les cellules de la table logo (la table a la classe "pbx_table_logo")*/
background-color: #FFFFFF;
text-align: center;
}
.pbx_h1{/* le premier bloc de texte dans choixpaiement */
font-size: 14px;
font-family: verdana;
font-weight:normal;
}
.pbx_h2{/* le second bloc de texte dans choixpaiement (choisisseze un moyen...)*/
font-family: verdana;
font-size:12px;
font-weight:bold;
}
.pbx_h3{/* l'ent?te reprenant le libell? du type de moyen de paiement*/
font-family: verdana;
font-size:12;
font-weight:normal;
}
.pbx_h4{/* nom d'enseigne, en page de paiement*/
color:#444;
display: block;
margin: 8px 0 0 0;
padding: 0;
border-top: 1px solid #ccc;
padding: 5px;
display: block;
background-color: #f5f5f5;
height: 35px;
line-height: 35px;
font-size: 12px;
font-weight: normal;
text-shadow: none;
}
.pbx_copyright h5{/*mention paybox en bas de page (choix et paiement)*/
font-size:10px;
font-weight: normal;
}
a {
text-decoration: none;
color : gray;
font-weight: bold;
font-style: italic;
padding: 0 5px;
}
#tabledevises {
color: #AAA;
}
a:hover {
color : #222;
}
body { color: #555555;
font-family: arial,verdana,sans-serif;
padding : 0px;
margin: 0;
}
#idframe_pay {
border-color: #CCCCCC;
border-radius: 6px 6px 6px 6px;
border-style: solid;
border-width: 1px;
margin: 20px;
position: relative;
}
#idframe_pay table {
border-spacing:0;
border-collapse:collapse;
width: 100%;
}
#idframe_pay h2 {
width: 100%;
background: url("main_header_background.png") repeat scroll 0 0 transparent;
border-color: #CCCCCC;
border-radius: 5px 5px 0 0;
border-style: solid;
border-width: 0 0 1px 0;
box-shadow: 1px 1px 0 0 #888888 inset;
color: #EEEEEE;
font-weight: bold;
text-shadow: 1px 1px 1px #444444;
font-size: 16px;
font-weight: bold;
text-align: center;
padding: 8px 0 0 0;
}
/*
#idframe_pay td {
vertical-align: top;
}
*/
.pbx-align-center {
text-align: center;
padding: 20px 10px;
width: 50%;
}
.pbx-align-right {
text-align: right;
padding: 2px 10px;
width: 50%;
white-space: nowrap;
}
.pbx-align-button-right img {
vertical-align:middle;
}
.pbx-align-left {
text-align: left;
padding: 2px 10px;
width: 50%;
}
.pbx-align-left img {
vertical-align:middle;
}
.pbx-align-very-left {
text-align: left;
padding: 2px 10px;