class ProceduraDiPagamento{
var $Metodi = array(
// 'identificativo1' => '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 .= '
';
}
$return .= '
';
$return .= '
';
$return .= '
';
$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 '';
}
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 '';
}
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 '';
}
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 '';
}
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 '';
}
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
));
}
}
?>