1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
| #! /usr/bin/perl -w
use DBI;
#---------------------------------------------------------------
# Topic : Exemple PERL traitement de l'autoréponse de paiement
# Version : 500
#
# 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"
#
# Cette variable est facultative. Si elle n'est pas renseignée,
# l'API positionne la valeur à "./pathfile".
$pathfile="pathfile=/home/ok/cgi-bin/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 = "/home/ok/bin/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 . " " . $pathfile;
# Appel du binaire response
open(INFO, $path_bin . " " . $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];
$return_context = $tableau[20];
$caddie = $tableau[21];
$receipt_complement = $tableau[22];
$merchant_language = $tableau[23];
$language = $tableau[24];
$customer_id = $tableau[25];
$order_id = $tableau[26];
$customer_email = $tableau[27];
$customer_ip_address = $tableau[28];
$capture_day = $tableau[29];
$capture_mode = $tableau[30];
$data = $tableau[31];
# Initialisation du chemin du fichier log (à modifier)
# ex :
# -> Windows : $logfile="c:\\repertoire\\log\\log.txt";
# -> Unix : $logfile="/home/repertoire/log/log.txt";
#
$logfile="/home/ok/log/paiement.txt";
# 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 "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);
}
# fixer la source de données $dns (=database name source) et le compte utilisateur
# (l'utilisateur doit bien sûr avoir les droits d'accès à cette base)
$dsn = "dbi:mysql:mabase";
$login = "monlogin";
$password = "monpass";
# Pour se connecter a la base
$dbh = DBI->connect($dsn, $login, $password) or die "Echec de la connexion\n";
# Exemple de requete dinsertion
$req="UPDATE commandes SET etat='2' WHERE id = ".$transaction_id.";";
$dbh -> do($req);
# Pour clore la connexion a la base
$dbh -> disconnect; |
Partager