'ClasseMetodopagamento1', // 'identificativo2' => 'ClasseMetodopagamento2' ); var $exit_url;//pagina di ritorno al sito var $restart_url;//può essere forzato, vedi genera_link_restart() var $valuta = "";//settando un three-character (uppercase) ISO-4217 (https://en.wikipedia.org/wiki/ISO_4217#Active_codes) questo viene passato ai metodi di pagamento che hanno il metodo setValuta definito /* vengono passate automaticamente al metodo di pagamento */ var $demo = false; var $importo; var $descrizione; var $identificativo; //opzionali per precompilare i campi sul server del pagamento var $cliente_nome; var $cliente_email; /* FINE vengono passate automaticamente al metodo di pagamento */ var $useRadioButton = false; var $tabella_log = false;//se valorizzata viene creata in automatico var $controllaConfermato = true;//viene controllato prima della scelta del metodo e durante gli step definiti in metodo->controllaConfermatoInStep var $metodo_var = "metodo"; var $procedura_step_var = "pstep"; var $metodo_step_var = "step";//meglio sia sempre uguale in tutti i metodi così posso resettarla in sicurezza con $this->genera_link_agg(array($this->metodo_var=>'', $this->procedura_step_var=>'', $this->metodo_step_var=>'')) var $usa_credito_var = "usa"; var $importo_credito_var = "credito"; var $setup_ok = false; var $metodo_scelto = ''; var $metodo_scelto_class = ''; var $testo_scegli = "Scegli il metodo di pagamento con cui procedere"; var $testo_bottone_procedi = "Procedi al pagamento su server sicuro"; var $testo_errore = "Si è verificato un errore durante la procedura di pagamento"; var $testo_pagamento_incerto = "Non è stato possibile verificare l'esito del tuo pagamento, controlla il tuo estratto conto prima di riprovare"; var $testo_errore_dati = "Impossibile trovare i dati necessari al pagamento"; var $testo_errore_pagamento_effettuato = "questo pagamento risulta già effettuato"; var $testo_bottone_uscita = "ANNULLA PAGAMENTO"; var $testo_concluso = "Ti ringraziamo per il pagamento"; var $testo_uscita_dopo_esito = "Torna al sito"; var $testo_annullato = "Pagamento annullato"; var $testo_rinizia_dopo_errore = "Continua"; var $testo_utilizza_carta_salvata = "Utilizza questa carta"; var $testo_rimuovi_carta_salvata = "Rimuovi carta"; var $testo_procedi_con_altra_carta = "Utilizza un'altra carta"; var $testo_procedi_con_carta_salvata = "Utilizza una carta precedentemente salvata"; var $testo_salva_carta = "Memorizza per i pagamenti successivi"; var $testo_conferma_rimozione_carta = "Vuoi rimuovere questa carta?"; var $testo_non_supportato = "Pagamento non supportato su questo browser"; var $testo_oppure_paga_con_carta = "oppure inserisci i dati della tua carta"; var $valuteHtml = array( "EUR" => "€", "GBP" => "£", "CHF" => " CHF", "USD" => "$", ); var $loadingImg = '
'; var $ignoreSetupError = false; var $classeDivContainer = 'pagamento_cont'; function newMetodo($classe){ require_once("metodi/".$classe.".php"); $css = '_files/pagamenti/'.$classe.'.css'; if(is_file($GLOBALS["DATI"]["cdn_basepath"].'/'.$css)) $GLOBALS["DATI"]['file:'.$css] = 'CDN,VIS,HEAD,LESS'; return new $classe(); } function __construct($is_demo = false){ //mi serve per avere simulazione anche se non uso auto() if($is_demo) $this->Metodi['simulazione'] = 'Simulazione'; //inizializzo foreach($this->Metodi as $var=>$classe){ $this->Metodi[$var] = $this->newMetodo($classe); } } function setup(){ //setta la configurazione analizzando i paramentri in get, deve ritornare true altrimenti viene chiamato $this->errore if($this->tabella_log){ $this->db_q(" CREATE TABLE IF NOT EXISTS `$this->tabella_log` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `identificativo_ordine` varchar(255) NOT NULL, `identificativo_pagamento` varchar(255) NOT NULL, `completato` int(1) NOT NULL, `confermato` int(1) NOT NULL, `descrizione` varchar(255) DEFAULT NULL, `importo` decimal(10,2) DEFAULT NULL, `ultimo_stato` varchar(255) DEFAULT NULL, `ultimo_metodo_scelto` varchar(255) DEFAULT NULL, `ultima_data` datetime DEFAULT NULL, `info` longtext NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `identificativo_ordine` (`identificativo_ordine`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; "); if(!$this->db_qrs("SHOW COLUMNS FROM `$this->tabella_log` LIKE 'identificativo_pagamento';")){ $this->db_q("ALTER TABLE `$this->tabella_log` ADD COLUMN `identificativo_pagamento` VARCHAR(255) NOT NULL AFTER `identificativo_ordine`;"); } } foreach($this->Metodi as $var=>$classe){ //controllo conflitto parametri di restart con quelli in uso nella pagina di pagamento if(!$_GET[$this->metodo_var]){//primo step del metodo if($this->Metodi[$var]->restart_params){//il metodo ha dei restart_params foreach($this->Metodi[$var]->restart_params as $k=>$v){ if($_GET[$k]){//controllo che non influenzino il mio schema di url $e = "Attenzione: un parametro usato nell'url del pagamento ($k) viene usato anche dal metodo ".get_class($this->Metodi[$var])." e verrà resettato in caso di restart!"; trigger_error($e);//usato solo in sviluppo, ma non si sa mai // die($e); } } } } if(method_exists($this->Metodi[$var], "postSetup")) $this->Metodi[$var]->postSetup(); } return true; } function riepilogoPagamentoHtml(){ $valuta = $this->valuta ? $this->valuta : "EUR"; if(!$this->valuteHtml[$valuta]) trigger_error("Manca il simbolo html della valuta per il riepilogo pagamento"); $return = "
".nl2br($this->htmlentities($this->descrizione)).""; if($this->riepilogoCustom) $return .= "
".nl2br($this->htmlentities($this->riepilogoCustom)).""; else if($this->importo) $return .= "
".number_format($this->importo, 2, ",", ".").$this->valuteHtml[$valuta].""; $return .= "
"; return $return; } function htmlentities($testo){ //if($GLOBALS['DATI']['mcharset'] == 'iso-8859-1') $testo = utf8_decode($testo);//i testi sono scritti in un file in utf8 di solito return indi_htmlentities($testo); } function redirect($url){ if(!$url){ $e = "attenzione: redirect senza url"; if(is_local()) die($e." (alert solo in locale)"); trigger_error($e); } else return indi_redirect($url); } function genera_link_restart(){ if($this->restart_url) return $this->restart_url;//può essere forzato $restart_params = $this->Metodi[$this->metodo_scelto]->restart_params; $restart_params[$this->metodo_var] = ''; $restart_params[$this->procedura_step_var] = ''; $restart_params[$this->metodo_step_var] = ''; return $this->genera_link_agg($restart_params); } function _genera_link($function, $agg, $lang=null){ if($GLOBALS['CONF']["REW"] == 'NO')//con la rew3-4 i link sono sempre assoluti, prima no (vedi bacciromano) return $function(null, $lang, $agg, null, "&", 0, 1); else return $function(null, $lang, $agg); } function genera_link($params, $lang=null){ return $this->_genera_link("genera_link", $params, $lang); } function genera_link_agg($agg = array(), $lang=null){//genera un link che mantiene tutti i parametri in get return $this->_genera_link("genera_link_agg", $agg, $lang); } function triggerErrorAndReturn($str){ trigger_error($str); return $str; } function auto(){ //se passo il parametro al costruttore questa riga non serve if($this->demo) $this->Metodi['simulazione'] = $this->newMetodo('Simulazione'); foreach($this->Metodi as $var=>$classe){ //passo subito la roba fissa perchè mi può servire nel setup o nell'ignoreSetupError (genera_link ad es) $this->Metodi[$var]->Procedura = $this; $this->Metodi[$var]->step_var = $this->metodo_step_var; $this->Metodi[$var]->metodo_key = $var; } $setup_ok = true; if($_GET[$this->metodo_var]){//se ho scelto un metodo deve essere configurato altrimenti non faccio niente if(array_key_exists($_GET[$this->metodo_var], $this->Metodi)){ $this->metodo_scelto = $_GET[$this->metodo_var]; $this->metodo_scelto_class = get_class($this->Metodi[$_GET[$this->metodo_var]]); } else $setup_ok = false; } if($setup_ok){ $setup_ok = $this->setup()//setup normale || $this->ignoreSetupError || ($this->metodo_scelto && $this->Metodi[$this->metodo_scelto] && $this->Metodi[$this->metodo_scelto]->ignoreSetupError())//necessario in caso di url s2s statici tipo bancasella e ideal (non implementato su ideal) ; } if(!$setup_ok){//era nel costruttore, l'ho spostato qui perchè altrimenti in setup() non avevo la variabile demo settata correttamente return $this->errore($this->testo_errore_dati); } else{ $nascondiMetodi = []; foreach($this->Metodi as $var=>$classe){ //passo tutte le variabili ai metodi $this->Metodi[$var]->demo = $this->demo; $this->Metodi[$var]->importo = $this->importo; $this->Metodi[$var]->metodoprocedura_id = $var; $this->Metodi[$var]->descrizione = $this->descrizione; $this->Metodi[$var]->identificativo = $this->identificativo; $this->Metodi[$var]->cliente_nome = $this->cliente_nome; $this->Metodi[$var]->cliente_email = $this->cliente_email; $this->Metodi[$var]->cliente_indirizzo = $this->cliente_indirizzo; $this->Metodi[$var]->cliente_citta = $this->cliente_citta; $this->Metodi[$var]->cliente_cap = $this->cliente_cap; $this->Metodi[$var]->cliente_nazione = $this->cliente_nazione; $this->Metodi[$var]->cliente_telefono = $this->cliente_telefono; $this->Metodi[$var]->cliente_riferimento = $this->cliente_riferimento; $this->Metodi[$var]->exit_url = $this->exit_url; if($this->valuta){ if($this->Metodi[$var]->valuteSupportate){ if(!in_array($this->valuta, $this->Metodi[$var]->valuteSupportate)) $nascondiMetodi[] = $var; } else if(method_exists($this->Metodi[$var], "setValuta")) $this->Metodi[$var]->setValuta($this->valuta); else{ trigger_error("E' stata settata una valuta ma il metodo ".get_class($classe)." non ha il metodo setValuta, andrebbe disattivato"); //unset($this->Metodi[$var]); } } if(method_exists($this->Metodi[$var], "getCredito") && !$this->Metodi[$var]->getCredito()){ $nascondiMetodi[] = $var; } } if($this->rimborso){ //imposto metodo di pagamento e infoRimborso // if(!is_local()){ // return $this->triggerErrorAndReturn("rimborso non autorizzato"); // } $this->infoRimborso = $this->db_qr("select * from $this->tabella_log where identificativo_ordine = '".addslashes($this->identificativo)."'"); if(!$this->infoRimborso['identificativo_pagamento']){ return $this->triggerErrorAndReturn("identificativo_pagamento per rimborso non trovato"); } if(!$this->Metodi[$this->infoRimborso['ultimo_metodo_scelto']]){ return $this->triggerErrorAndReturn("metodo ".$this->infoRimborso['ultimo_metodo_scelto']." per rimborso non trovato"); } // statisticheEsercenti("rimborso"); $this->metodo_scelto = $this->infoRimborso['ultimo_metodo_scelto']; //dentro il metodo controllo $this->Procedura->rimborso dopo il setup $this->Metodi[$this->metodo_scelto]->identificativo = $this->identificativo; return $this->Metodi[$this->metodo_scelto]->auto(); } if( $this->controllaConfermato && ( !$this->metodo_scelto || !$this->Metodi[$this->metodo_scelto] /* metodo disattivato oppure metodo=credito e utente non loggato */ || ($_GET[$this->usa_credito_var] && !in_array($_GET[$this->metodo_step_var], ['check', 'return_ok', 's2s']))/*prevengo errore credito cambiato in caso di browser back*/ || in_array($_GET[$this->metodo_step_var], $this->Metodi[$this->metodo_scelto]->controllaConfermatoInStep) ) && $this->isConfermato() ){ //evitare di controllare al ritorno con carta (che arriva dopo il s2s che conferma il pagamento) //se è s2s invece controllo sempre perchè è capitato che un bot ("admantx-euaspb/3.0 (+http://www.admantx.com/service-fetcher.html)") memorizzasse l'indirizzo di ritorno di paypal (Pagamento/metodo:paypal/id:437/step:s2s/?token=..., visitato tramite app oltretutto) e ha triggerato una seconda volta il metodo confermato e le relative operazioni automatiche $ret = $this->pagamento_gia_confermato(); // print_r_tnx($ret, $_SERVER['REMOTE_ADDR'] == '192.168.0.177') || die; if($ret !== false) return $ret; } if($_GET[$this->usa_credito_var] && $this->Metodi[$_GET[$this->usa_credito_var]] && method_exists($this->Metodi[$_GET[$this->usa_credito_var]], "getCredito")){ $credito = $this->Metodi[$_GET[$this->usa_credito_var]]->getCredito(); if(!$_GET[$this->importo_credito_var]) $this->redirect($this->genera_link_agg([$this->importo_credito_var => $credito])); if($_GET[$this->importo_credito_var] > $credito && !in_array($_GET[$this->metodo_step_var], ["check", "return_ok"]) /*il credito potrebbe essere stato scalato dalla s2s*/){ $e = "Credito diminuito durante il pagamento - iniziale: ".$_GET[$this->importo_credito_var]. " adesso: ".$credito; if( $_POST != ['{}'=>'']//chiamate di test di nexi && ($_GET['step'] != 's2s' && get_class($this->Metodi[$this->metodo_scelto]) != 'Satispay')//nei pagamenti abbandonati arrivata anche ore dopo ) trigger_error($e); $this->logga(array( 'ultimo_stato' => $e, 'identificativo_ordine' => $this->identificativo, )); $this->redirect($this->genera_link_agg(array_merge($this->Metodi[$this->metodo_scelto]->restart_params, [$this->usa_credito_var => '', $this->importo_credito_var => '', $this->metodo_step_var => 'error', $this->metodo_var => $_GET[$this->usa_credito_var]]))); } //vanno passe modificate anche ai metodi $this->importo -= $_GET[$this->importo_credito_var]; $this->descrizione .= " (ulteriori ".$_GET[$this->importo_credito_var]."€ pagati tramite ".($this->Metodi[$_GET[$this->usa_credito_var]]->nome_metodo_originale).")"; $nascondiMetodi[] = $_GET[$this->usa_credito_var]; foreach($this->Metodi as $var=>$classe){ if(!$classe->confermabile) $nascondiMetodi[] = $var; //aggiorno le variabili modificate sopra $this->Metodi[$var]->importo = $this->importo; $this->Metodi[$var]->descrizione = $this->descrizione; } } if($this->metodo_scelto){ $this->identificativoToSession(); // if($_GET['fgrjaRGNrbguiwbgaEG']) return $this->Metodi[$this->metodo_scelto]->confermato(18121); if(!$this->Metodi[$this->metodo_scelto]) $this->redirect($this->genera_link_agg([$this->metodo_var => ''])); return $this->Metodi[$this->metodo_scelto]->auto(); } else if($_GET[$this->procedura_step_var] == 'annulla'){ return $this->annulla(); } else{ $this->logga(array( 'ultimo_stato' => 'Aperta pagina selezione metodo di pagamento', 'identificativo_ordine' => $this->identificativo, 'importo' => $this->importo, 'descrizione' => $this->descrizione )); $return = "
classeDivContainer."\">"; $return .= $this->riepilogoPagamentoHtml(); $this->useRadioButton = $this->useRadioButton && count($this->Metodi) > 1; $nomiMetodi = array(); foreach($this->Metodi as $m) $nomiMetodi[$m->nome_metodo]++; if($this->demo) $return .= '
PROCEDURA DEMO: nessun pagamento verrà effettuato realmente (Passa a versione non demo)
'; if(count($this->Metodi) > 1) $return .= '
'.$this->htmlentities($this->testo_scegli).'
'; $return .= "
"; $return .= '
'; if($this->useRadioButton) $return .= '
'; $numeroScelte = 0; $sceltaUnica = ""; foreach($this->Metodi as $var=>$classe) if(!in_array($var, $nascondiMetodi)){ $numeroScelte++; $sceltaUnica = $var; $mostraMetodoId = $nomiMetodi[$this->Metodi[$var]->nome_metodo] > 1;//ci sono due metodi con lo stesso nome (demo gateway ad esempio) $return .= '
'; if($this->useRadioButton) $return .= ' '; else $return .= ''.(count($this->Metodi) > 1 ? $this->Metodi[$var]->nome_metodo : $this->testo_bottone_procedi).($mostraMetodoId?' ('.$var.')':'').''; if($this->demo){ if(!$this->Metodi[$var] || !is_subclass_of($this->Metodi[$var], 'MedodoDiPagamento')){ $error = "Metodo di pagamento \"".$var."\" non valido"; trigger_error($error); die($error); } if($di=$this->Metodi[$var]->demoInfo()){ $return .= '
'.$di.' [POPUP]
'; } } $return .= '
'; } if($numeroScelte == 1 && !$_GET[$this->metodo_var]) $this->redirect($this->genera_link_agg([$this->metodo_var => $sceltaUnica])); $return .= '
'; if($this->useRadioButton){ $return .= ''; $return .= '
'; } $return .= '
'; $return .= '
'; $return .= '
'.$this->htmlentities($this->testo_bottone_uscita).'
'; $return .= '
'; return $return; } } } function dbCall(){ $args = func_get_args(); $func = array_shift($args); if(is_indi()) return call_user_func_array($func, $args); else{ trigger_error("uso fuoti indi abbandonato per ora (gestione dir_lib da fare)"); die; } } function db_q (){return call_user_func_array([$this, 'dbCall'], array_merge([__FUNCTION__], func_get_args()));} function db_qr(){return call_user_func_array([$this, 'dbCall'], array_merge([__FUNCTION__], func_get_args()));} function db_qrs(){return call_user_func_array([$this, 'dbCall'], array_merge([__FUNCTION__], func_get_args()));} function isConfermato($identificativo = null){ if($this->tabella_log){ if(!$identificativo) $identificativo = $this->identificativo; if(!$identificativo) trigger_error("impossibile controllare confermato"); return $this->db_qrs("select confermato from ".$this->tabella_log." where identificativo_ordine = '".addslashes($identificativo)."'"); } return false; } function isErrore($identificativo = null){ if($this->tabella_log){ if(!$identificativo) $identificativo = $this->identificativo; if(!$identificativo) trigger_error("impossibile controllare confermato"); return $this->db_qrs("select count(*) from ".$this->tabella_log." where ultimo_stato LIKE \"%error%\" AND identificativo_ordine = '".addslashes($identificativo)."'"); } return false; } function isConcluso(){ if($this->tabella_log){ if(!$this->identificativo) trigger_error("impossibile controllare concluso"); return $this->db_qrs("select completato from ".$this->tabella_log." where identificativo_ordine = '".addslashes($this->identificativo)."'"); } return false; } function logEmail($subject, $body){ indi_email(array( 'oggetto' => $subject, 'messaggio' => $body )); } function logga($dati){ if(!$this->tabella_log) return; $dati['ultima_data'] = strftime("%Y-%m-%d %H:%M:%S"); $tnx = is_tnx() ? " [TNX]" : ""; $dati['info'] = strftime("%d/%m/%Y %H:%M:%S").$tnx." ".$dati['ultimo_stato']; $fields = array_keys($dati); $sql_values = array(); foreach($dati as $k=>$v) $sql_values[$k] = "'".addslashes($v)."'"; $query = ' insert into '.$this->tabella_log.' ('.implode(",",$fields).') values ('.implode(",",$sql_values).') on duplicate key update ultimo_stato = '.$sql_values['ultimo_stato'].', ultima_data = '.$sql_values['ultima_data'].', info = concat(info, "\n", '.$sql_values['info'].') '; if($dati['ultimo_metodo_scelto']) $query .= ', ultimo_metodo_scelto = '.$sql_values['ultimo_metodo_scelto']; if($dati['completato']) $query .= ', completato = 1'; if($dati['confermato']) $query .= ', confermato = 1'; //aggiornamento importo aggiunto 11/3/2024 if($dati['importo']) $query .= ', importo = '.$sql_values['importo'];//in step confermato non viene passato //se valorizzato l'identificativo pagamento faccio l'update anche di quello //ho tolto il campo perchè tanto l'update lo faccio con un where con il like perchè devo poter aggiornare più payment id per ogni identificativo_ordine ??? if($dati['identificativo_pagamento']) $query .= ',identificativo_pagamento = '.$sql_values['identificativo_pagamento']; $this->db_q($query); } function pagamento_gia_confermato(){ $this->restart_url = $this->exit_url; return $this->errore($this->testo_errore_pagamento_effettuato); } var $identificativoSessionKey = 'identificativo_ordine_inizio_procedura_di_pagamento_INAFFIDABILE'; function identificativoToSession(){ if($this->identificativo){//potrebbe anche non esserci, anzi è probabile che nelle situazioni in cui lo cerco è proprio perchè non riesco a impostarlo $_SESSION[$this->identificativoSessionKey] = $this->identificativo; } } function identificativoFromSession(){//da chiamare solo in caso sia impossibile risalire all'identificativo, si basa sulla sessione quindi non è affidabile, non funziona sulle s2s if($this->identificativo){ trigger_error("Chiamata funzione identificativoFromSession() ma l'identificativo era già presente: ".$this->identificativo, E_USER_ERROR); } return $_SESSION[$this->identificativoSessionKey]; } function iniziato($tipo){ //leggo log $log_file = fopen(dirname(__FILE__)."/usi.csv", "r"); if(!$log_file){ trigger_error("File usi.csv non trovato"); return; } while(($u = fgetcsv($log_file)) !== false) $usiArray[$u[0]] = $u; fclose($log_file); //aggiorno log $key = $GLOBALS['DATI']['nome_sito'] ? $GLOBALS['DATI']['nome_sito'] : __FILE__; $data = date("Y-m-d H:i:s"); $metodi = array(); foreach($this->Metodi as $m) $metodi[] = get_class($m); $usiArray[$key] = array($key, implode(", ", $metodi), $data, $tipo); //scrivo log ksort($usiArray); $log_file = fopen(dirname(__FILE__)."/usi.csv", "w"); foreach($usiArray as $u) fputcsv($log_file, $u); fclose($log_file); indiAdminLog("pagamento_iniziato", $this->metodo_scelto_class); $this->logga(array( 'identificativo_ordine' => $this->identificativo, 'ultimo_metodo_scelto' => $this->metodo_scelto,//era $tipo 'ultimo_stato' => 'Scelto '.$tipo.' ('.$this->metodo_scelto_class.')', //importanti se si attiva il pagamento con un metodo già selezionato: 'importo' => $this->importo, 'descrizione' => $this->descrizione, )); } function concluso($messaggioPersonalizzato = ""){ /*procedura completata con successo*/ $this->logga(array( "identificativo_ordine" => $this->identificativo, "ultimo_stato" => "Pagamento completato", "completato" => 1 )); return '

'.$this->htmlentities($messaggioPersonalizzato?$messaggioPersonalizzato:$this->testo_concluso).'

'.$this->htmlentities($this->testo_uscita_dopo_esito).'

'; } function incerto(){//al 12/5/2016 è usato solo da iDEAL olandese $this->logga(array( "identificativo_ordine" => $this->identificativo, "ultimo_stato" => "Pagamento con esito incerto" )); return '

'.$this->htmlentities($this->testo_pagamento_incerto).'

'.$this->htmlentities($this->testo_uscita_dopo_esito).'

'; } function errore($specifico = ''){ /*errore durante il pagamento dell'utente*/ if($specifico) $specifico = ": $specifico"; $this->logga(array( 'identificativo_ordine' => $this->identificativo, 'ultimo_stato' => 'Errore durante la procedura di pagamento'.$specifico )); return '

'.$this->htmlentities($this->testo_errore).$specifico.'

'. //fatto per Twint PostFinance pagamento da app Ordinalo ($this->testo_rinizia_dopo_errore?'

'.$this->htmlentities($this->testo_rinizia_dopo_errore).'

':''). '
'; } function annulla(){ /*annullamento dell'utente*/ $this->logga(array( 'identificativo_ordine' => $this->identificativo, 'ultimo_stato' => 'Pagamento annullato'//qui ci passa anche in caso di carta NOT APPROVED )); return '

'.$this->htmlentities($this->testo_annullato).'

'.$this->htmlentities($this->testo_uscita_dopo_esito).'

'; } function non_supportato(){ /* Metodo di pagamento non supportato (usato per ApplePay) */ $this->logga(array( 'identificativo_ordine' => $this->identificativo, 'ultimo_stato' => 'Pagamento non disponibile'//qui ci passa anche in caso di carta NOT APPROVED )); return '

'.$this->testo_non_supportato.'

'.$this->htmlentities($this->testo_rinizia_dopo_errore).'

'; } function confermato($identificativo_comunicato_dal_server_di_pagamento, $dettagliCustomMetodo = null, $identificativoPagamentoDaSalvare = null){ /*s2s*/ if($_GET[$this->usa_credito_var] && $_GET[$this->importo_credito_var]){ if(!$this->Metodi[$_GET[$this->usa_credito_var]]->creaMovimento(-1 * $_GET[$this->importo_credito_var], true, true)){ trigger_error("Errore durante lo step finale del pagamento con credito, faccio die;"); die; } } $this->logga(array( "identificativo_ordine" => $identificativo_comunicato_dal_server_di_pagamento, "identificativo_pagamento" => $identificativoPagamentoDaSalvare, "ultimo_stato" => "Pagamento confermato", "confermato" => 1 )); } function comunicazione_s2s($identificativo_comunicato_dal_server_di_pagamento, $messaggio){ $this->logga(array( "identificativo_ordine" => $identificativo_comunicato_dal_server_di_pagamento, "ultimo_stato" => "[".$this->metodo_scelto_class."] ".$messaggio )); } } ?>