* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ * $Source$ * * Classe de gestion du retour RSTS du systeme de paiement en ligne * CyberPaiement (TM) de la Banque Populaire de Lorraine * * Certaine fonction de cette classe existe de base dans PHP4 mais ont été * ré-écrites ici pour le support de PHP3 */ class Retourbplc { var $db; var $ipclient; var $montant; var $num_compte; var $ref_commande; var $num_contrat; var $num_transaction; var $date_transaction; var $heure_transaction; var $num_autorisation; var $cle_acceptation; var $code_retour; var $ref_commande; /* * Initialisation des valeurs par défaut */ function Retourbplc($db) { $this->db = $db; } /** * \brief Insertion dans la base de donnée de la transaction * */ function insertdb() { $sql = "INSERT INTO ".MAIN_DB_PREFIX."transaction_bplc"; $sql .= " (ipclient, num_transaction, date_transaction, heure_transaction, num_autorisation, cle_acceptation, code_retour, ref_commande)"; $sql .= " VALUES ('$this->ipclient', '$this->num_transaction', '$this->date_transaction', '$this->heure_transaction', '$this->num_autorisation', '$this->cle_acceptation', $this->code_retour, $this->ref_commande)"; $result = $this->db->query($sql); if ($result) { return $this->db->last_insert_id(); } else { print $this->db->error(); print "


$sql

"; return 0; } } /** * \brief Verification de la validitée de la clé * */ function check_key($key) { $A = $this->montant; $B = $this->num_contrat; $C = $this->num_transaction; $D = $this->ref_commande; $E = $this->num_compte; /* * Etape 1 * */ $A1 = $A . $E; $B1 = $B . $E; $C1 = $C . $E; $D1 = $D . $E; $map = range(0, 9); $L1= $this->cle_luhn($A1, $map); $L2= $this->cle_luhn($B1, $map); $L3= $this->cle_luhn($C1, $map); $L4= $this->cle_luhn($D1, $map); /* * Etape 2 * */ $N1 = $L1 . $L2 . $L3 . $L4; $N0 = $L1 + $L2 + $L3 + $L4; $C5 = $this->corres($N0); /* * Comparaison * */ if ($key == $this->calcul_pos($N1,$N0, $C5)) { return 1; } else { return 0; } } /** * \brief Table de correspondance de l'algorithme de Luhn * */ function corres($value) { $map[0] = 0; for ($i = 65 ; $i < 91 ; $i++) { $map[$i-64] = chr($i); } for ($i = 0 ; $i < 10 ; $i++) { $map[27+$i] = $i; } return $map[$value]; } /** * \brief Calcul de la cle de Luhn * */ function cle_luhn($cle, $map) { $buffer = $this->array_reverse($cle); $totalVal = 0; $flip = 1; reset ($buffer); while (list($key, $posVal) = each ($buffer)) { if (!isset($map[$posVal])){ return FALSE; } $posVal = $map[$posVal]; if ( $flip = !$flip) { $posVal *= 2; } while ($posVal>0) { $totalVal += $posVal % 10; $posVal = floor($posVal / 10); } } return substr($totalVal, strlen($totalVal)-1, 1); } /** * \brief Postion de C5 dans N0 * * */ function calcul_pos($N1, $N0, $C5) { if ($N0 >= 0 && $N0 <= 6) { /* clé = 2 premiers de N0 . C5 . 2 derniers de N0 */ $cle = substr($N1,0,2) . $C5 . substr($N1,2,2); } elseif ($N0 >= 7 && $N0 <= 14) { /* clé = 4 premiers de N0 . C5 */ $cle = substr($N1,0,4) . $C5; } elseif ($N0 >= 15 && $N0 <= 21) { /* clé = premier de N1 . C5 . 3 derniers de N1 */ $cle = substr($N1,0,1) . $C5 . substr($N1,1,3); } elseif ($N0 >= 22 && $N0 <= 29) { /* clé = C5 . 4 derniers de N1 */ $cle = $C5 . substr($N1,0,4); } elseif ($N0 >= 30 && $N0 <= 36) { /* clé = 3 premiers de N1 . C5 . dernier de N1 */ $cle = substr($N1,0,3) . $C5 . substr($N1,1,1); } else { $cle = "ERREUR"; } return $cle; } /** * \brief Retournement du tableau * */ function array_reverse($string) { $len = strlen($string); $i = $len; $j = 0; $rever = array(); while ($i > 0) { $rever[$j]= substr($string, $i-1, 1); $i = $i - 1; $j = $j + 1; } return $rever; } } ?>