#!perl
#----------------------------------------------------------------------------
#
# Topic : Exemple PERL de traitement de la réponse de paiement
# Version : P600
#
# traitement de la reponse "manuelle" du serveur de paiement quand
# l'acheteur retourne a la boutique apres le paiement
#
#----------------------------------------------------------------------------
payment_response();
sub get_data_field {
# Accès au STDIN à l'aide de la fonction read
read(STDIN, $save_string, $ENV{CONTENT_LENGTH});
# Dissocie la chaîne de caractères en une liste
@prompts = split(/&/, $save_string);
# parcours de la liste
foreach (@prompts) {
# dissocie la paire nom=valeur
($name, $value) = split (/=/, $_);
# decode les valeurs
$name=~ s/\%(..)/pack("c",hex($1))/ge;
$value=~ s/\%(..)/pack("c",hex($1))/ge;
# cree une liste associative
$fields{$name} = $value;
}
$data=$fields{'DATA'};
}
sub payment_response
{
# affichage du debut de la page de resultat
print "Content-Type: text/html\n\n";
print "";
print "
SHERLOCKS - Paiement Securise sur Internet";
print "";
print "";
print "Test de l'API plug-in SHERLOCKS
";
# récupération de la variable cryptée postée
# Initialisation de la variable message pour le binaire
get_data_field();
$message="message=$data";
# Initialisation du chemin du fichier pathfile (à modifier)
# ex :
# -> Windows : $pathfile="pathfile=c:\\repertoire\\pathfile";
# -> Unix : $pathfile="pathfile=/home/repertoire/pathfile";
$pathfile="pathfile=chemin du fichier pathfile";
# Initialisation du chemin de l'executable response (à modifier)
# ex :
# -> Windows : $path_bin = "c:\\repertoire\\bin\\response";
# -> Unix : $path_bin = "/home/repertoire/bin/response";
#
$path_bin = "chemin_de_l'executable_response";
# Tous les paramètres initialisés précédemment doivent être passés
# en paramètre à la fonction pesponse pour être pris en compte
# L'ordre n'a pas d'importance
# Exemple : $parm = $message . " " . $pathfile;
$parm = $message;
# Appel du binaire response
open(INFO, $path_bin . " " . $pathfile . " " . $parm . "|");
for ($result = 0, $i = 0; ; $i++)
{
$result = $result . $_;
}
close(INFO);
# Sortie de la fonction : !code!error!v1!v2!v3!...!v29
# - code=0 : la fonction retourne les données de la transaction dans les variables v1, v2, ...
# : Ces variables sont décrites dans le GUIDE DU PROGRAMMEUR
# - code=-1 : La fonction retourne un message d'erreur dans la variable error
# on separe les differents champs et on les met dans une variable tableau
@tableau = split("!",$result);
# recuperation des donnees de la reponse
$code = $tableau[1];
$error = $tableau[2];
$merchant_id = $tableau[3];
$merchant_country = $tableau[4];
$amount = $tableau[5];
$transaction_id = $tableau[6];
$payment_means = $tableau[7];
$transmission_date= $tableau[8];
$payment_time = $tableau[9];
$payment_date = $tableau[10];
$response_code = $tableau[11];
$payment_certificate = $tableau[12];
$authorisation_id = $tableau[13];
$currency_code = $tableau[14];
$card_number = $tableau[15];
$cvv_flag = $tableau[16];
$cvv_response_code = $tableau[17];
$bank_response_code = $tableau[18];
$complementary_code = $tableau[19];
$complementary_info = $tableau[20];
$return_context = $tableau[21];
$caddie = $tableau[22];
$receipt_complement = $tableau[23];
$merchant_language = $tableau[24];
$language = $tableau[25];
$customer_id = $tableau[26];
$order_id = $tableau[27];
$customer_email = $tableau[28];
$customer_ip_address = $tableau[29];
$capture_day = $tableau[30];
$capture_mode = $tableau[31];
$data = $tableau[32];
# analyse du code retour
if (( $code eq "" ) && ( $error eq "" ) )
{
print "
erreur appel response
";
print "executable response non trouve : $path_bin";
print "";
return;
};
if ( $code != 0 )
{
print "
erreur appel API de paiement
";
print "message erreur : $error";
print "