require_once("MedodoDiPagamento.php");
class KeyClientQuiPago extends MedodoDiPagamento{
var $nome_metodo = "Carta di credito";
//configurazione
var $alias = "";
var $mac = "";
var $url = "https://ecommerce.nexi.it/ecomm/ecomm/DispatcherServlet";
//22/3/2017 a telefono mi hanno comunicato che le credenziali di test scadono dopo essere andati online, anche se subito dopo via mail me ne hanno mandate di nuove che non dovrebbero scadere
//con quelle che avevo ho verificato che si può fare il pagamento ma fallisce la s2s perchè omettono il parametro "mac" con cui fare la verifica, questo paramtro esiste per questo motivo
var $ignoraCalcoloMac = false;
var $lingua = "ITA-ENG";
var $idContratto;//contiene l'id (univoco) del contratto precedentemente salvato e attiva il salvataggio della carta
var $contrattoRegistrato;//funzione che riceve l'id contratto (deve essere sempre settata, anche sulla s2s)
var $contrattoAttivo;//contiene l'id del contratto precedentemente salvato e attiva l'utilizzo della carta
var $pulisciUniqueID = false;//la pulizia va fatta "manualmente" altrimenti quando arrivano le s2s non si può risalire all'id originale
var $restart_params = array(
'session_id' => '',
'regione' => '',
'codAut' => '',
'alias' => '',
'orario' => '',
'data' => '',
'mac' => '',
'importo' => '',
'$BRAND' => '',
'tipoProdotto' => '',
'cognome' => '',
'languageId' => '',
'pan' => '',
'nazionalita' => '',
'divisa' => '',
'email' => '',
'scadenza_pan' => '',
'esito' => '',
'codTrans' => '',
'nome' => '',
'messaggio' => '',
//nuovi da transazione 5/11/2018 (nexi italiandesigncontract)
'mail' => '',
'brand' => '',
'codiceEsito' => '',
'codiceWallet' => '',
'tipoTransazione' => '',
'tipo_richiesta' => '',
'aliasEffettivo' => '',
'OPTION_CF' => '',
'TCONTAB' => '',
//per operazioni di registrazione carta
'trnexi' => '',
'merchantnumber' => '',
'tipo_servizio' => '',
'num_contratto' => '',
'hash' => '',
);
var $azioniGestioneCartaSenzaTransazione = [/*'RC', 'AC'*/];//nei primi test a volte non faceva addebito, strano
var $azioniGestioneCarta = [
'PP' => 'Paga e salva carta per prossimi pagamenti',
'PR' => 'Utilizza carta salvata precendemente',
'RC' => 'Cambia dati carta salvata',
'NS' => 'Paga senza salvare la carta',
// 'AC' => 'Ripeti autorizzazione su carta salvata'// https://ecommerce.nexi.it/specifiche-tecniche/servertoserver/pagamentoricorrente-pagamento1click/aggiornacontratto.html
];
function demoInfo(){
return "Per il pagamento usare numero carta 4539970000000006 (esito ok) 4539970000000014 (esito KO) scadenza 12/30 e cvv casuale, backoffice: https://int-ecommerce.nexi.it/ecomm/web/reporting/ReportLogin.jsp
Merchant: 00070862
User: ADMIN
Password: 3RU854SJ09 (altre qui)";
}
function auto(){
$this->indiLingua();
if($this->demo){
//dati a limaste 24/4/2015
//non funzionano per mazzei il 21/7/2016 (la procedura si avvia ma fallisce il calcolo del mac nella s2s), ho usato quelli vecchi sopra e tutto ok
//$this->alias = 'payment_3444153';
//$this->mac = 'TLGHTOWIZXQPTIZRALWKG';
//22/3/2017 a telefono mi hanno comunicato che le credenziali di test scadono dopo essere andati online
//con queste (mazzei 2014) ho verificato che si può fare il pagamento ma fallisce la s2s perchè omettono il parametro "mac" con cui fare la verifica
// $this->alias = 'payment_testm_urlmac';
// $this->mac = 'esempiodicalcolomac';
// $this->ignoraCalcoloMac = true;
//22/3/2017 queste credenziali non dovrebbero scadere mai, l'interfaccia è diversa rispetto mazzei
//NON FUNZIONA 3D SECURE
// $this->alias = '3444153';
// $this->mac = 'TLGHTOWIZXQPTIZRALWKG';
// $this->url = "https://coll-ecommerce.nexi.it/ecomm/ecomm/DispatcherServlet";
// $this->url = "https://int-ecommerce.nexi.it/ecomm/ecomm/DispatcherServlet";
//01/09/2025
$this->alias = 'ALIAS_WEB_00070862';
$this->mac = 'ALH1PU2RQYHLV3E2RXGHI21O211FBF4F';
$this->url = "https://int-ecommerce.nexi.it/ecomm/ecomm/DispatcherServlet";
// $this->importo = mt_rand(0,1) ? 1 : 0.01;
}
switch($_GET[$this->step_var]){
default:
$params = array(
'alias' => $this->alias,
'importo' => round(floatval(str_replace(",", ".", $this->importo)) * 100),
'divisa' => 'EUR',
// codice di identificazione del pagamento composto da caratteri alfanumerici, escluso il carattere #.
// Il codice dev’essere univoco per ogni richiesta di autorizzazione, solo in caso di esito negativo
// dell’autorizzazione il merchant può riproporre la stessa richiesta con medesimo codTrans per altre 2
// volte, in fase di configurazione l’esercente può scegliere di diminuire i 3 tentativi.
'codTrans' => str_replace("#", "", $this->uniqueID(30)),
'mail' => $this->cliente_email,
// url del merchant verso la quale il PG indirizza l’utente al completamento della transazione
// passando,in GET, i parametri di risposta con il risultato della transazione.
// Si veda il capitolo 7 “Messaggio di notifica on line” (solo se le esigenze del merchant richiedono
// questo tipo di esito)
'url' => $this->Procedura->genera_link_agg(array($this->step_var=>"check")),//torna qui anche in caso di autenticazione negata
'url_back' => $this->Procedura->genera_link_agg(array($this->step_var=>"return_ko")),
'urlpost' => $this->Procedura->genera_link_agg(array($this->step_var=>"s2s")),
'languageId' => $this->lingua,
);
if($this->idContratto){
if(strlen($this->idContratto) < 5 || strlen($this->idContratto) > 30){
trigger_error("Lunghezza numero contratto errata");
}
else if(!$_GET['trnexi']){
$azioni = $this->azioniGestioneCarta;
if($this->contrattoAttivo) unset($azioni['PP']); //se il contratto è già registrato da' errore
else{
unset($azioni['PR']);
unset($azioni['RC']);
}
$return = '
'.
'
';
foreach($azioni as $cod=>$desc) $return .= '
'.$desc.'';
$return .= '
'.
'
';
return $return;
}
else{
$this->Procedura->iniziato($this->nome_metodo." - ".$this->azioniGestioneCarta[$_GET['trnexi']]);
if($_GET['trnexi'] != 'NS'/* non salvare */){
$params['num_contratto'] = $this->idContratto;
$params['tipo_servizio'] = 'paga_oc3d';
$params['tipo_richiesta'] = $_GET['trnexi'];
}
}
}
else $this->Procedura->iniziato($this->nome_metodo);
//mac= HASH SHA(codTrans=divisa=importo=)
$params['mac'] = sha1("codTrans=$params[codTrans]divisa=$params[divisa]importo=$params[importo]$this->mac");
$this->Procedura->redirect($this->url."?".http_build_query($params));
break;
case 's2s':
// $_POST:
// Array
// (
// [indi_rew1] => ita_pagamento_gateway/descrizione:Mazzei Wine Club /email:l.cappelli@mazzei.it/step:return_ok/
// [session_id] =>
// [regione] => EUROPE
// [codAut] => TESTOK
// [alias] => payment_testm_urlmac
// [orario] => 160916
// [data] => 20140314
// [mac] => b6bd86dc7289aa1d9ec55415bcdf8b5b64402672
// [importo] => 1
// [$BRAND] => MasterCard
// [tipoProdotto] => MASTERCARD - CREDIT - N
// [cognome] => c
// [languageId] => ITA
// [pan] => 525599XXXXXX9992
// [nazionalita] => ITA
// [divisa] => EUR
// [email] => l.cappelli@mazzei.it
// [scadenza_pan] => 201405
// [esito] => OK
// [codTrans] => 20140314_160745_u10_1394809746
// [nome] => c
// [messaggio] => Message OK
// [l] => ita
// [p] => pagamento_gateway
// [1] => descrizione:Mazzei Wine Club
// [descrizione] => Mazzei Wine Club
// [2] => email:l.cappelli@mazzei.it
// [3] => step:return_ok
// [step] => return_ok
// [metodo] => carta
// )
$params = array();
foreach($_POST as $k=>$v){
$params[$k] = mb_convert_encoding(stripslashes($v), 'UTF-8', 'ISO-8859-1');
}
$identificativo = $this->identificativoFromUniqueID($params['codTrans']);
//mac= HASH SHA(codTrans=esito= importo=divisa=data=orariocodAut=mac");
if($this->ignoraCalcoloMac || $verifica_mac == $params['mac']){
$this->Procedura->comunicazione_s2s($identificativo, $params['esito']);
// $body = '';
// foreach($params as $k=>$v) $body .= "\n| $k:\t$v";
// mail("c@localhost", " OK OK OK OK OK OK", $body);
if($params['esito'] == 'OK'){
if($params['tipo_richiesta'] == 'PP'){
if(call_user_func($this->contrattoRegistrato, $params['num_contratto'])){
$this->Procedura->comunicazione_s2s($identificativo, "Contratto registrato");
}
else trigger_error("Errore registrazione contratto");
}
if(in_array($params['tipo_richiesta'], $this->azioniGestioneCartaSenzaTransazione)) $this->Procedura->comunicazione_s2s($identificativo, "Procedura ".$this->azioniGestioneCarta[$params['tipo_richiesta']]." completata");
else $this->Procedura->confermato($identificativo);
}
else{
$body = '';
foreach($params as $k=>$v) $body .= "\n| $k:\t$v";
$this->Procedura->comunicazione_s2s($identificativo, $body);
}
}
else if($_POST != ['{}'=>'']){//10/24: nexi sta verificando se le chiamate vengono accettate dal loro nuovo ip pubblico, vedi mail "Messaggi di notifica pagamento vuoti (urlpost)"
$body = "ERRORE VERIFICA FIRMA DELLA COMUNICAZIONE S2S";
foreach($params as $k=>$v) $body .= "\n| $k:\t$v";
$this->Procedura->comunicazione_s2s($identificativo?$identificativo:$this->identificativo, $body);
$body .= "\nhttp://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI] " . date ("d-M-Y H:i:s", mktime()) . " " . __FILE__ . ":" . __LINE__;
$body .= "\n\n" . print_r(array('$_POST'=>$_POST, 'php://input'=>file_get_contents('php://input'), '$_GET'=>$_GET, '$_SERVER'=>$_SERVER, '$_SESSION'=>$_SESSION), TRUE);
mail("carlo@tnx.it", "ERRORE S2S ".$this->nome_metodo, $body);
}
break;
case 'return_ok':
return $this->Procedura->concluso();
case 'check':
// $_GET:
// Array
// (
// [indi_rew1] => ita_pagamento_gateway/descrizione:Mazzei Wine Club /email:l.cappelli@mazzei.it/step:check/
// [session_id] =>
// [regione] => EUROPE
// [codAut] => TESTOK
// [alias] => payment_testm_urlmac
// [orario] => 160916
// [data] => 20140314
// [mac] => b6bd86dc7289aa1d9ec55415bcdf8b5b64402672
// [importo] => 1
// [$BRAND] => MasterCard
// [tipoProdotto] => MASTERCARD - CREDIT - N
// [cognome] => c
// [languageId] => ITA
// [pan] => 525599XXXXXX9992
// [nazionalita] => ITA
// [divisa] => EUR
// [email] => l.cappelli@mazzei.it
// [scadenza_pan] => 201405
// [esito] => OK
// [codTrans] => 20140314_160745_u10_1394809746
// [nome] => c
// [messaggio] => Message OK
// [l] => ita
// [p] => pagamento_gateway
// [1] => descrizione:Mazzei Wine Club
// [descrizione] => Mazzei Wine Club
// [2] => email:l.cappelli@mazzei.it
// [3] => step:check
// [step] => check
// [metodo] => carta
// )
//arriva qui anche in caso di pagamento non autorizzato
if($_GET['esito'] == 'OK'){
if(in_array($_GET['tipo_richiesta'], $this->azioniGestioneCartaSenzaTransazione)) $this->Procedura->redirect($this->Procedura->genera_link_agg(array_merge($this->restart_params, [$this->Procedura->metodo_step_var => ''])));
else $this->Procedura->redirect($this->Procedura->genera_link_agg(array($this->step_var=>"return_ok")));
}
else{
$this->Procedura->comunicazione_s2s($this->identificativo, $_GET['messaggio']);
return $this->Procedura->errore($_GET['messaggio']);
}
break;
case 'return_ko':
//qui arriva se preme "indietro" dalla pagina della banca
return $this->Procedura->annulla();
break;
}
}
function indiLingua(){
// ITA Italiano
// GER Tedesco
// ENG Inglese
// JPN Giapponese
// SPA Spagnolo
// ITA-ENG Italiano/Inglese
// FRA Francese
switch($GLOBALS['DATI']["lang"]) {
case "ita":
$this->lingua = "ITA";
break;
case "eng":
$this->lingua = "ENG";
break;
case "fra":
$this->lingua = "FRA";
break;
case "spa":
$this->lingua = "SPA";
break;
case "ger":
$this->lingua = "GER";
break;
default:
$this->lingua = "ITA-ENG";
break;
}
}
}
?>