#!perl

#---------------------------------------------------------------
# Topic	  : Exemple PERL traitement de l'autoréponse de paiement
# Version : P600
#
# 	Dans cet exemple, les données de la transaction	sont
#	décryptées et sauvegardées dans un fichier log.
#
#---------------------------------------------------------------

payment_autoresponse();



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_autoresponse
{

  # 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; <INFO>; $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];

  # Initialisation du chemin du fichier log (à modifier)
  # ex :
  #    -> Windows : $logfile="c:\\repertoire\\log\\log.txt";
  #    -> Unix    : $logfile="/home/repertoire/log/log.txt";
  #

$logfile="chemin_du_fichier_de_log";

# Ouverture du fichier de log en append

open(LOG, ">>$logfile");

# analyse du code retour

 if (( $code eq "" ) && ( $error eq "" ) )
	{
 	print LOG "fichier response non trouve\n";
 	close(LOG);
    	return;
	};

 if ( $code != 0 )
 	{
 	print LOG "message erreur : $error\n";
 	close(LOG);
    	return;
	};

 # sauvegarde des champs de la reponse

 print LOG "merchant_id : $merchant_id\n";
 print LOG "merchant_country : $merchant_country\n";
 print LOG "amount : $amount\n";
 print LOG "transaction_id : $transaction_id\n";
 print LOG "transmission_date: $transmission_date\n";
 print LOG "payment_means: $payment_means\n";
 print LOG "payment_time : $payment_time\n";
 print LOG "payment_date : $payment_date\n";
 print LOG "response_code : $response_code\n";
 print LOG "payment_certificate : $payment_certificate\n";
 print LOG "authorisation_id : $authorisation_id\n";
 print LOG "currency_code : $currency_code\n";
 print LOG "card_number : $card_number\n";
 print LOG "cvv_flag: $cvv_flag\n";
 print LOG "cvv_response_code: $cvv_response_code\n";
 print LOG "bank_response_code: $bank_response_code\n";
 print LOG "complementary_code: $complementary_code\n";
 print LOG "complementary_info: $complementary_info\n";
 print LOG "return_context: $return_context\n";
 print LOG "caddie : $caddie\n";
 print LOG "receipt_complement: $receipt_complement\n";
 print LOG "merchant_language: $merchant_language\n";
 print LOG "language: $language\n";
 print LOG "customer_id: $customer_id\n";
 print LOG "order_id: $order_id\n";
 print LOG "customer_email: $customer_email\n";
 print LOG "customer_ip_address: $customer_ip_address\n";
 print LOG "capture_day: $capture_day\n";
 print LOG "capture_mode: $capture_mode\n";
 print LOG "data: $data";

 # Fermeture du fichier log

 close(LOG);

}


