<?php

@ini_set('display_errors', 'off');

class ControllerPaymentBe2bill extends Controller {
	protected function index() {
	
	 	$this->data['button_confirm'] = $this->language->get('button_confirm');
		$this->data['button_back'] = $this->language->get('button_back');
	
		$this->load->model('checkout/order');
		
		$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);	

$serveur_test = "https://secure-test.be2bill.com/front/form/process";

ini_set('default_charset', 'UTF-8');

$etat_url_1 = 'oui';
$etat_url_2 = 'oui';
/*
if(!$this->config->get('be2bill_test')){
if (!isset($url1)) {$url1 = "secure-magenta1.be2bill.com";}

$fp = @fsockopen($url1, 80, &$errno, &$errstr, 30);

if (!$fp) { 
$etat_url_1 = 'non';
//echo "Réponse: $url1 n'existe pas<BR>";
}else { 
fputs($fp,"GET / HTTP/1.0nn");
//$reponse = fgets($fp, 128);
//echo "Réponse OK: $url1 existe bien<BR>";
$serveur_prod = "https://secure-magenta1.be2bill.com/front/form/process";
fclose($fp); } 

if($etat_url_1 == 'non'){
if (!isset($url2)) {$url2 = "secure-magenta2.be2bill.com";}
print '<!--';
$fp = @fsockopen($url2, 80, &$errno, &$errstr, 30);
print '-->';
if (!$fp) { 
$etat_url_2 = 'non';
//echo "Réponse: $url2 n'existe pas<BR>";
}else { 
fputs($fp,"GET / HTTP/1.0nn");
//$reponse = fgets($fp, 128);
//echo "Réponse OK: $url2 existe bien<BR>";
$serveur_prod = "https://secure-magenta2.be2bill.com/front/form/process";
fclose($fp); } }
}
*/
$serveur_prod = "https://secure-magenta1.be2bill.com/front/form/process";
if($etat_url_2 == 'non'){ $serveur_prod = HTTPS_SERVER . 'index.php?route=checkout/payment';}
$this->data['etat_url_2'] = $etat_url_2;	

$serveur = ($this->config->get('be2bill_test'))?$serveur_test:$serveur_prod;
$this->data['action'] = $serveur;				

$site_id = $this->config->get('be2bill_site');
$key = html_entity_decode($this->config->get('be2bill_key'));

$amounts = sprintf("%0.0f",$order_info['total'] * 100 ) ;

$order_infos = "Paiement de votre commande numero ".$this->session->data['order_id']." sur ".html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8');
$site = html_entity_decode($this->config->get('config_name'), ENT_QUOTES, 'UTF-8');
$client_infos = $order_info['payment_address_1']." ".$order_info['payment_address_2']." ".$order_info['payment_postcode']." ".$order_info['payment_city'];

//définition des variables
$IDENTIFIER = $site_id; 	
$PASSWORD = $key;

	$this->load->library('encryption');		
	$encryption = new Encryption($this->config->get('config_encryption'));


$D_SECURE = $this->config->get('be2bill_dsecure');
$AMOUNT = $amounts; 
$ORDERID = $this->session->data['order_id'];
$CLIENTEMAIL = $order_info['email'];
$CLIENTIDENT = $site. '_' . $order_info['customer_id']; 
$CLIENTADDRESS = $client_infos;
$DESCRIPTION = $order_infos;
$HIDECARDFULLNAME = $this->config->get('be2bill_hcardname');
$HIDECLIENTEMAIL = $this->config->get('be2bill_hcltemail');
$LANGUAGE = strtoupper($this->session->data['language']);
$OPERATIONTYPE = "payment";
$VERSION = "2.0";

$FIRSTNAME = $order_info['firstname'];
$LASTNAME = $order_info['lastname'];

$extra_data = $encryption->encrypt($D_SECURE . "+" . $AMOUNT . "+" . $ORDERID. "+" . $OPERATIONTYPE);
$EXTRADATA = $extra_data;

//$hash = be2bill_signature
$data_hash = 
$PASSWORD .
"3DSECURE=" . $D_SECURE . 
$PASSWORD .
"AMOUNT=" . $AMOUNT . 
$PASSWORD .
"CLIENTADDRESS=" . $CLIENTADDRESS . 
$PASSWORD .
"CLIENTEMAIL=" . $CLIENTEMAIL . 
$PASSWORD .
"CLIENTIDENT=" . $CLIENTIDENT . 
$PASSWORD .
"DESCRIPTION=" . $DESCRIPTION . 
$PASSWORD .
"EXTRADATA=" . $EXTRADATA . 
$PASSWORD .
"FIRSTNAME=" . $FIRSTNAME .  
$PASSWORD .
"HIDECARDFULLNAME=" . $HIDECARDFULLNAME .
$PASSWORD .
"HIDECLIENTEMAIL=" . $HIDECLIENTEMAIL .
$PASSWORD .
"IDENTIFIER=" . $IDENTIFIER . 
$PASSWORD .
"LANGUAGE=" . $LANGUAGE .
$PASSWORD .
"LASTNAME=" . $LASTNAME .
$PASSWORD .
"OPERATIONTYPE=" . $OPERATIONTYPE .
$PASSWORD .
"ORDERID=" . $ORDERID .
$PASSWORD .
"VERSION=" . $VERSION .
$PASSWORD ;

$hash = hash ( "sha256" , $data_hash); 

//echo $data_hash;

		$this->data['hash'] = $hash;

		$this->data['D_SECURE'] = $D_SECURE;
		$this->data['AMOUNT']	= $AMOUNT;		
		$this->data['CLIENTADDRESS']	= $CLIENTADDRESS;
		$this->data['CLIENTEMAIL']	= $CLIENTEMAIL;
		$this->data['CLIENTIDENT']	= $CLIENTIDENT;
		$this->data['DESCRIPTION']	= $DESCRIPTION;	
		$this->data['EXTRADATA']	= $EXTRADATA;
		$this->data['FIRSTNAME']	= $FIRSTNAME;		
 		$this->data['HIDECARDFULLNAME']	= $HIDECARDFULLNAME; 
 		$this->data['HIDECLIENTEMAIL']	= $HIDECLIENTEMAIL;        
    $this->data['IDENTIFIER']	= $IDENTIFIER;
		$this->data['LANGUAGE']	= $LANGUAGE;    
		$this->data['LASTNAME']	= $LASTNAME;    		
    $this->data['OPERATIONTYPE']	= $OPERATIONTYPE;
    $this->data['ORDERID']	= $ORDERID;
    $this->data['VERSION']	= $VERSION;         		    		

		$invoice	= $this->session->data['order_id'] . ' - ' . html_entity_decode($order_info['payment_firstname'], ENT_QUOTES, 'UTF-8') . ' ' . html_entity_decode($order_info['payment_lastname'], ENT_QUOTES, 'UTF-8');
		$lc		= $this->session->data['language'];
		
		if ($this->request->get['route'] != 'checkout/guest_step_3') {
			$this->data['back'] = HTTPS_SERVER . 'index.php?route=checkout/payment';
		} else {
			$this->data['back'] = HTTPS_SERVER . 'index.php?route=checkout/guest_step_2';
		}
		
		$this->id = 'payment';

		if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/be2bill.tpl')) {
			$this->template = $this->config->get('config_template') . '/template/payment/be2bill.tpl';
		} else {
			$this->template = 'default/template/payment/be2bill.tpl';
		}	
		
		$this->render();	
	}
	

		public function be2bill_cancel() {
		
    $ref = $_GET['ORDERID'];


		$this->data['url_cancel'] = HTTPS_SERVER . 'index.php?route=checkout/checkout';
		
		header("Location: ".$this->data['url_cancel']); exit;
		
 }

		public function be2bill_succes() {
		
    $ref = $_GET['ORDERID'];
    if($_GET['EXECCODE'] == '0000'){
		$this->data['url_success'] = HTTPS_SERVER . 'index.php?route=checkout/success';
		}else{
		$this->data['url_success'] = HTTPS_SERVER . 'index.php?route=checkout/checkout';	
    }			
		header("Location: ".$this->data['url_success']); exit;
		
 }

		public function be2bill_retour_open151() {
		
		$IP = $_SERVER["REMOTE_ADDR"];
		if( 
    (strstr($IP,'80.70.210.')) or
    (strstr($IP,'80.70.211.')) or
    (strstr($IP,'80.70.212.')) or
    (strstr($IP,'80.70.213.'))       
    ) {	
    
		$this->load->library('encryption');
		$encryption = new Encryption($this->config->get('config_encryption'));

    $order_id = $_POST['ORDERID'];

		$this->load->model('checkout/order');
		$order_info = $this->model_checkout_order->getOrder($order_id);

//---------------------Signature de Retour-----------------------------

$site_id = $this->config->get('be2bill_site');
$key = html_entity_decode($this->config->get('be2bill_key'));

//$IDENTIFIER = $site_id; 	
$PASSWORD = $key;

$IDENTIFIER = $_POST['IDENTIFIER'];
$HASH = $_POST['HASH'];
$OPERATIONTYPE = $_POST['OPERATIONTYPE'];
$TRANSACTIONID = $_POST['TRANSACTIONID'];
$CLIENTIDENT = $_POST['CLIENTIDENT'];
$CLIENTEMAIL = $_POST['CLIENTEMAIL'];
$ORDERID = $_POST['ORDERID'];
$AMOUNT = $_POST['AMOUNT'];
$VERSION = $_POST['VERSION'];
$LANGUAGE = $_POST['LANGUAGE'];
$EXTRADATA = $_POST['EXTRADATA'];
$CARDCODE = $_POST['CARDCODE'];
$CARDVALIDITYDATE = $_POST['CARDVALIDITYDATE'];
$CARDFULLNAME = $_POST['CARDFULLNAME'];
$CARDTYPE = $_POST['CARDTYPE'];
$EXECCODE = $_POST['EXECCODE'];
$MESSAGE = $_POST['MESSAGE'];
$DESCRIPTOR = $_POST['DESCRIPTOR'];
$CURRENCY = $_POST['CURRENCY'];
$ALIAS = $_POST['ALIAS'];
$DSECURE = $_POST['3DSECURE'];

//$hash = be2bill_signature
$data_hash = 
$PASSWORD . "3DSECURE=" . $DSECURE .
$PASSWORD . "ALIAS=" . $ALIAS .
$PASSWORD . "AMOUNT=" . $AMOUNT .
$PASSWORD . "CARDCODE=" . $CARDCODE .
$PASSWORD . "CARDFULLNAME=" . $CARDFULLNAME .
$PASSWORD . "CARDTYPE=" . $CARDTYPE .
$PASSWORD . "CARDVALIDITYDATE=" . $CARDVALIDITYDATE .
$PASSWORD . "CLIENTEMAIL=" . $CLIENTEMAIL .
$PASSWORD . "CLIENTIDENT=" . $CLIENTIDENT .
$PASSWORD . "CURRENCY=" . $CURRENCY .
$PASSWORD . "DESCRIPTOR=" . $DESCRIPTOR .
$PASSWORD . "EXECCODE=" . $EXECCODE .
$PASSWORD . "EXTRADATA=" . $EXTRADATA .
$PASSWORD . "IDENTIFIER=" . $IDENTIFIER .
$PASSWORD . "LANGUAGE=" . $LANGUAGE .
$PASSWORD . "MESSAGE=" . $MESSAGE .
$PASSWORD . "OPERATIONTYPE=" . $OPERATIONTYPE .
$PASSWORD . "ORDERID=" . $ORDERID .
$PASSWORD . "TRANSACTIONID=" . $TRANSACTIONID .
$PASSWORD . "VERSION=" . $VERSION .
$PASSWORD ;

    ksort($_POST);
		$Data_Hash = $PASSWORD;
		foreach($_POST as $k => $val) {
	  if($k != 'HASH'){$Data_Hash .= $k . "=" . $val . $PASSWORD ;}}

$Hash_R = hash ( "sha256" , $Data_Hash); 

//$Hash_R = hash ( "sha256" , $data_hash); 

$Ip_Retour = $_SERVER["REMOTE_ADDR"];

if($_POST['OPERATIONTYPE'] != 'refund') {
$extra_data = $encryption->decrypt($EXTRADATA);
$data = explode("+", $extra_data);
$data_3D = $data[0];
$data_MT = $data[1];
$data_ID = $data[2];
$data_OT = $data[3];
}
if($IDENTIFIER != $site_id) {$Hash_R = "Fraude sur l'identifiant be2bill, ";}
if($_POST['OPERATIONTYPE'] != 'refund') {
if($data_3D != $this->config->get('be2bill_dsecure')) {$Hash_R = 'Fraude sur le 3D Secure, ';}
if($data_MT != sprintf("%0.0f",$order_info['total'] * 100 )) {$Hash_R = 'Fraude sur le Montant, ';}
if($data_ID != $order_id) {$Hash_R = 'Fraude sur le mum&eacute;ro de commande, ';}
if($data_OT != 'payment') {$Hash_R = 'Fraude sur le mode de paiement ';}
}  
$site = $this->config->get('config_name');
$site = htmlentities($site, NULL, 'utf-8');
$sit = html_entity_decode($site);

if($this->config->get('be2bill_test') == '1'){
$objet = "Hash retour sur ".$site;
$mes_hash_ok = "\nHash Post tr:".$HASH."\nHash calculé:".$Hash_R."\nDonnées Hash calculé:\n".$data_hash."\n\nIP serveur:".$Ip_Retour."\n\n".$extra_data."\n\n".$Data_Hash;
@mail("contact@host-eco.fr","$objet","$mes_hash_ok");}

$signature_R = $Hash_R;
$signature_Post = $HASH;

//------------------------------ Libelé des reponses ---------------------------

switch($EXECCODE) {
case "0000" :
$detail_result = "Transaction Validée avec succès"; break ;
case "4001" :
$detail_result = "La banque a refusé la transaction."; break ;
case "4002" :
$detail_result = "Fonds insuffisants."; break ;
case "4003" :
$detail_result = "Carte refusée par les réseaux bancaires."; break ;
case "4004" :
$detail_result = "Transaction abandonnée."; break ;
case "4005" :
$detail_result = "Suspicion de fraude. "; break ;
case "4006" :
$detail_result = "La carte a été déclarée perdue. "; break ;
case "4007" :
$detail_result = "La carte a été déclarée volée. "; break ;
case "4008" :
$detail_result = "Authentification 3D Secure"; break ;
case "4009" :
$detail_result = "Authentification 3DSecure expirée"; break ;
case "4010" :
$detail_result = "Transaction invalide"; break ;
case "4011" :
$detail_result = "Transaction doublon"; break ;
case "4012" :
$detail_result = "Données de carte invalide"; break ;
case "4013" :
$detail_result = "Transaction non autorisée par le réseau bancaire pour ce porteur"; break ;
case "3001" :
$detail_result = "Compte désactivée"; break ;
case "3002" :
$detail_result = "Adresse IP serveur non autorisée"; break ;
case "3003" :
$detail_result = "Transaction non permise"; break ;
default :
$detail_result = "Code Erreur = ".$EXECCODE; break ;
}

switch($DSECURE) {
case "YES" :
$garantie_3D = "Le syst&egrave;me 3D-Secure est Activ&eacute;"; break ;
case "NO" :
$garantie_3D = "Le syst&egrave;me 3D-Secure est ABSENT"; break ;
case "" :
$garantie_3D = "le 3D-Secure est non applicable"; break ;
default :
$garantie_3D = "Info 3 D Secure = ".$DSECURE; break ;
}

//---------------------------- Gestion de la Commande et envoie des emails --------------------------------------------------------

		if ($data_ID != $order_id) {$order_id = 0;}

    $mail_admin = $this->config->get('config_email');

    $headers  = "Content-Transfer-Encoding: 8bit\r\n";
	  $headers .= "MIME-Version: 1.0\r\n";
	  $headers .= "X-Mailer: Copyright (c) 2012 Hosteco.fr Agency\r\n"; 
 	  $headers .= "Content-Type: text/html; charset=iso-8859-1\r\n";
    $headers .= "From: Transaction Be2bill<paiement@be2bill.com>"; 	    
    
$total = floatval(number_format($AMOUNT, 2, ',', ''))/100;

$resultat = 
'Montant = '.$total.' Euro
 <br>N&deg; de Commande = '.$order_id.
'<br>N&deg; Transaction = '.$TRANSACTIONID.
'<br>Type Op&eacute;ration =  '.$OPERATIONTYPE.
'<br>Type de Carte = '.$CARDTYPE.
'<br>Validit&eacute; de la Carte = '.$CARDVALIDITYDATE.
'<br>N&deg; de Carte = '.$CARDCODE.
'<br>Non du porteur	= '.$CARDFULLNAME.
'<br>3dSecure = '.$garantie_3D.
'<br>Description = '.$DESCRIPTOR.
//'<br>Message infos = '.$MESSAGE.
'<br><br><b>'.$detail_result.
'</b><br>
';

$mail_client = $_POST['CLIENTEMAIL'];
		
	if ($order_info) {
			if ($signature_R == $signature_Post) {
			if ($EXECCODE == '0000') {	
			$this->model_checkout_order->confirm($order_id, $this->config->get('be2bill_order_status_id'));
      if($this->config->get('be2bill_test') == '1'){ if($LANGUAGE == 'FR'){$TEST =' en mode TEST';}else{$TEST =' in TEST mode';}}else{$TEST='';}
      if($LANGUAGE == 'FR'){$comment = 'Paiement Accept&eacute par Be2bill'.$TEST;} else {$comment = 'Accepted Payment by Be2bill'.$TEST;}

			$this->db->query("UPDATE `" . DB_PREFIX . "order_history` SET comment = '" . $this->db->escape($comment) . "' WHERE order_status_id = '".$this->config->get('be2bill_order_status_id')."' and comment = '' and order_id = '" . (int)$order_id . "' ");

      $mess_ok =	"<font color=green><b><i>La Commande n&deg; $order_id est valid&eacute; par le syst&egrave;me Be2bill$TEST sur </font><br>$site</i></b><p>$resultat</p><font color=red><b>$TEST</b></font>";
      mail("$mail_client","Validation de la Commande n° $order_id par Be2bill$TEST sur $sit","$mess_ok","$headers");
      mail("$mail_admin","Validation de la Commande n° $order_id par Be2bill$TEST sur $sit","$mess_ok","$headers");		

      print "OK";	exit;
      	
			} else
//      if ( ($EXECCODE == '4001')or($EXECCODE == '4002')or($EXECCODE == '4003')or($EXECCODE == '4004')or($EXECCODE == '4005')or($EXECCODE == '4006')or($EXECCODE == '4007')or($EXECCODE == '4008') )
       {
    $order_status_id = '8'; 
    if($this->config->get('be2bill_test') == '1'){ if($LANGUAGE == 'FR'){$TEST =' en mode TEST';}else{$TEST =' in TEST mode';}}else{$TEST='';}
	  if($LANGUAGE == 'FR'){$commentR = 'Refus&eacute;e par Be2bill'.$TEST;} else {$commentR = 'Refused by Be2bill'.$TEST;} 

		$order_query = $this->db->query("SELECT *, l.filename AS filename, l.directory AS directory FROM `" . DB_PREFIX . "order` o LEFT JOIN " . DB_PREFIX . "language l ON (o.language_id = l.language_id) WHERE o.order_id = '" . (int)$order_id . "' ");
		 
		if ($order_query->num_rows) {
			$this->db->query("UPDATE `" . DB_PREFIX . "order` SET order_status_id = '" . (int)$order_status_id . "' WHERE order_id = '" . (int)$order_id . "'");
			$this->db->query("INSERT INTO " . DB_PREFIX . "order_history SET order_id = '" . (int)$order_id . "', order_status_id = '" . (int)$order_status_id . "', notify = '1', comment = '" . $this->db->escape($commentR) . "', date_added = NOW()");
      }	

     $mes_err =	"<font color=red><b><i>La Commande n&deg; $order_id est Refus&eacute; par le syst&egrave;me de s&eacute;curit&eacute; par Be2bill$TEST sur <br></font>$site</i></b><p>$resultat</p><font color=red><b>$TEST</b></font>";
     mail("$mail_admin","Transaction Refusée de la Commande n° $order_id par Be2bill$TEST sur $sit","$mes_err","$headers");	 			

      print "OK";	exit;
			}
		 }
		}		
	 }	
	}
}
?>
