"1", "eng"=>"2", "spa"=>"3", "fra"=>"4", "ger"=>"5" var $codiceValuta = '242';//EUR var $controllaConfermatoInStep = []; var $restart_params = array( "a"=>"", "b"=>"", ); function demoInfo() { //Al fine di effettuare dei test occorre utilizzare una carta di credito reale, per ottenere un codice di autorizzazione. La carta di credito rimarrà prenotata per un mese dalla data dell\'autorizzazione e non verrà addebitata per l\'importo autorizzato, qualora venga utilizza su un codice esercente di prova. In fase di test l\'importo viene forzato a 0,01€

return ' Numeri di carta di test: 4775718800002026 scadenza 5/27 per esito OK, 4775718800003024 scadenza 5/27 per esito KO, 4012001037141112 scadenza 5/20 per simulare 3d secure (password "OK") Accesso backoffice di test con credenziali tnxdemotest/tnxdemotest (GESPAY59091)

Configurazione iniziale nuovi backoffice: SOLO PROFILI NON-BASIC (per i profili basic impostare contrattoConParametriAbilitati = false): '; return ' Al fine di effettuare dei test occorre utilizzare una carta di credito reale, per ottenere un codice di autorizzazione. La carta di credito rimarrà prenotata per un mese dalla data dell\'autorizzazione e non verrà addebitata per l\'importo autorizzato, qualora venga utilizza su un codice esercente di prova. Consigliamo quindi di effettuare prove per importi minimi

Accesso backoffice di test con credenziali GESPAY59091/tnxdemotest/tnxdemotest

Nei nuovi backoffice è necessario aggiungere i campi OK/KO/S2S/ERROR e configurare Buyer Name / Buyer E-Mail come input nella sezione Campi&parametri'; } function setValuta($code){ //https://api.gestpay.it/#currency-codes $valute = "187 AED 784 United Arab Emirates dirham 109 AUD 36 Australian dollar 262 BGN 975 Bulgarian lev 234 BRL 986 Brazilian real 12 CAD 124 Canadian dollar 3 CHF 756 Swiss franc 144 CNY 156 Chinese yuan 223 CZK 203 Czech koruna 7 DKK 208 Danish krone 242 EUR 978 Euro 2 GBP 826 Pound sterling 103 HKD 344 Hong Kong dollar 229 HRK 191 Croatian kuna 153 HUF 348 Hungarian forint 123 IDR 360 Indonesian rupiah 203 ILS 376 Israeli new shekel 31 INR 356 Indian rupee 62 ISK 352 Icelandic króna 71 JPY 392 Japanese yen 119 KRW 410 South Korean won 55 MYR 458 Malaysian ringgit 81 NGN 566 Nigerian naira 8 NOK 578 Norwegian krone 113 NZD 554 New Zealand dollar 66 PHP 608 Philippine peso 26 PKR 586 Pakistani rupee 237 PLN 985 Polish złoty 270 RON 946 Romanian leu 244 RUB 643 Russian ruble 75 SAR 682 Saudi riyal 9 SEK 752 Swedish krona/kronor 124 SGD 702 Singapore dollar 73 THB 764 Thai baht 267 TRY 949 Turkish lira 143 TWD 901 New Taiwan dollar 241 UAH 980 Ukrainian hryvnia 1 USD 840 United States dollar 145 VND 704 Vietnamese đồng 82 ZAR 710 South African rand"; $valute = explode("\n", $valute); $codiceValuta = ''; foreach($valute as $k=>$v){ $v = array_map('trim', explode("\t", $v)); if($v[1] == $code){ $codiceValuta = $v[0]; break; } } if(!$codiceValuta) trigger_error("Valuta imprevista"); else $this->codiceValuta = $codiceValuta; } function ignoreSetupError(){//banca sella ha un url s2s fisso, senza parametri, quindi non si riesce a settare importo e identificativo // if(in_array($_GET[$this->step_var], array('s2s', 'return_ok'))) return true; if ($_GET[$this->step_var]) return true; else return false; } function auto() { $this->indiLingua(); if ($this->demo) { // $this->importo = 0.01; $this->dominio = 'test'.$this->dominio; $this->id = 'GESPAY59091'; $this->contrattoConParametriAbilitati = true; } if(!is_null($this->importo))//nella s2s non c'è $this->importo = number_format(str_replace(",", ".", $this->importo), 2, ".", ""); $step = $_GET[$this->step_var]; $objCrypt = new GestPayCryptHS(); // $objCrypt->debug = true; $objCrypt->DomainName = $this->dominio; if (!$step) { $this->Procedura->iniziato($this->nome_metodo); //config $objCrypt->SetShopLogin($this->id); $objCrypt->SetCurrency($this->codiceValuta); if ($this->demo || $this->contrattoConParametriAbilitati) {//altrimenti da' errore $objCrypt->SetLanguage($this->lingua); //dati cliente if ($this->cliente_nome) $objCrypt->SetBuyerName(substr($this->cliente_nome, 0, 50)); if ($this->cliente_email) $objCrypt->SetBuyerEmail(substr($this->cliente_email, 0, 50)); } //dati transazione $objCrypt->SetAmount($this->importo); $objCrypt->SetShopTransactionID($this->identificativo); $linkRestart = $this->Procedura->genera_link_restart(); if ($this->contrattoConParametriAbilitati) { $mycustominfo = array( "LINK_PAGAMENTO=".$linkRestart, ); $objCrypt->SetCustomInfo(implode($objCrypt->separator, $mycustominfo)); } else { $_SESSION['LINK_PAGAMENTO'] = $linkRestart; } if (!$objCrypt->Encrypt()) { trigger_error("Errore durante la comunicazione con banca sella ordine #".$this->identificativo.": errore ".$objCrypt->GetErrorCode()." - ".$objCrypt->GetErrorDescription(), E_USER_ERROR); return $this->Procedura->errore(); } else $this->Procedura->redirect("https://".$this->dominio."/gestpay/pagam.asp?a=".$objCrypt->GetShopLogin()."&b=".$objCrypt->GetEncryptedString()); } else { if($_GET['pagamentoConcluso']){//redirect senza parametri dopo pagamento, altrimenti se l'utente recupera una vecchia pagina con a/b parte la richiesta ai server bancasella che poi ci dicono Errore: 1141: Chiamata non accettata: stringa di parametri non accettabile $this->Procedura->identificativo = stripslashes($_GET['pagamentoConcluso']); if($_GET['ErrorCode']){ if ($_GET['ErrorCode'] == 1143){ return $this->Procedura->annulla();//[ErrorDescription] => Transazione abbandonata dal compratore } return $this->Procedura->errore(); } return $this->Procedura->concluso(); } else if (!$_GET['a'] || !$_GET['b']) { return $this->Procedura->errore(); } else{ //in entrambe le situazioni non ci sono dettagli, quindi nemmeno l'identificativo per loggare questo tipo di errore che provo a recuperare dalla sessione altrimenti va insieme a quelli con identificativo vuoto $errore_1136_9999 = "INFOTNX: Questo errore arriva quando un utente usa il tasto back del browser o la cronologia provando di fatto a riavviare un pagamento con parametri a/b utilizzati precedentemente. La banca fa una s2s comunicante errore 1136, se l'utente visita nuovamente la pagina di ritorno con i vecchi paramentri a/b si verifica un errore di decrypt (9999). Sembra succeda anche quando i parametri vengono generati subito prima di mezzanotte e l'utente va sulla banca dopo (problema non risolto al 15/01/2015)."; $objCrypt->SetShopLogin(trim($_GET['a'])); $objCrypt->SetEncryptedString(trim($_GET['b'])); $url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; if (!$objCrypt->Decrypt()) { $code = $objCrypt->GetErrorCode(); if ($code == 9999) { $errore = $errore_1136_9999; $erore_specifico_al_cliente = 'il pagamento che hai richiesto non è più disponibile'; } else { $errore = "Errore decrypt da Banca Sella (Errore: ".$objCrypt->GetErrorCode().": ".$objCrypt->GetErrorDescription().")"; $erore_specifico_al_cliente = ''; // if (is_local()) mail("c@localhost", "objdeCrypt error", $url."\n\n".$errore); // else trigger_error($errore, E_USER_ERROR); } //$this->identificativo è sicuramente vuoto (ignoreSetupError), provo a recuperarlo dalla sessione $identificativoFromSession = $this->Procedura->identificativoFromSession(); if (!$identificativoFromSession) $errore .= "Non è stato possibile recuperare l'identificativo neanche dalla sessione (l'utente avrà chiuso il browser, rimane loggato grazie al cookie, ma la sessione si resetta)"; $this->Procedura->logga(array( 'identificativo_ordine' => $identificativoFromSession, 'ultimo_stato' => $errore )); return $this->Procedura->errore($erore_specifico_al_cliente); } else { //if(is_local()) mail("c@localhost", "objdeCrypt", $url."\n\n".print_r($objCrypt, true)); $result = trim($objCrypt->GetTransactionResult()); //PAY1_3DLEVEL=HALF*P1*PAY1_CUSTOMINFO=*P1*KO=http://demo.tnx.it/base/TEST/gataway-pagamenti/metodo:bancasella/step:return_ko/*P1*S2S=http://demo.tnx.it/base/TEST/gataway-pagamenti/metodo:bancasella/step:s2s/*P1*OK=http://demo.tnx.it/base/TEST/gataway-pagamenti/metodo:bancasella/step:return_ok/*P1*ERROR=http://demo.tnx.it/base/TEST/gataway-pagamenti/metodo:bancasella/step:error/ $mycustominfo_list = explode($objCrypt->separator, trim($objCrypt->GetCustomInfo())); $mycustominfo = array(); foreach($mycustominfo_list as $l) { $l = explode("=", $l); $k = array_shift($l); $mycustominfo[$k] = implode("=", $l); } /* [ShopLogin] => GESPAY59091 [Currency] => 242 [Amount] => 12.34 [ShopTransactionID] => 12345 [CardNumber] => [ExpMonth] => [ExpYear] => [BuyerName] => [BuyerEmail] => DEMO_carlo@tnx.it [Language] => [CustomInfo] => PAY1_3DLEVEL=HALF*P1*PAY1_CUSTOMINFO= [AuthorizationCode] => [ErrorCode] => 1143 [ErrorDescription] => Transazione abbandonata dal compratore [BankTransactionID] => [AlertCode] => [AlertDescription] => [EncryptedString] => El9f9ZTCSHiWLoJ69BbycGE5p3ApAAYLOSPNfk8ZxFyY8dPnoiFkIoLRURORI1dHqHmxL*sCaBHxt3_Fx0ohJWPFT8rLbDD_wQl1cTlLT0502vQ*vHwMPxGPGi6VRBF2xxwtJpLO731l*9P8pw58peM7fdt5Q1pIGPoryHVkoz5ZXWuaiEkOWptio_0T05km9GXM_Ccek_vCibO398wAMRjGeHwydJZwA9kV6Ndy2XK6Gl33EardBwiBoajjRVMYJTyea8TqukCbo2Wi7MXZf4YabXC97YQEjtnrKOEs99zZfIKt5V1TL9pl*HyIwqpUO4mmgVKXmzlo7svZNDBjZIxVB9cH7bqll3L08K72B2F5dZWPKqCCi431b_IeaRUn7UzTheH8hTjqeMelPnzSsShOGH31Goh36t0zaokjw*c0*kMxuKQlJ4gPmTOtUrnh650IKIBUnMjxBNQMyLmHLXTAoVcCkEUP8wxSlMNk3qEajskpkvBN__DBpuWvL68jthq6ehNaRuXMkAs0oPYMzA [ToBeEncript] => [Decrypted] => PAY1_TRANSACTIONRESULT=KO*P1*PAY1_SHOPTRANSACTIONID=12345*P1*PAY1_BANKTRANSACTIONID=*P1*PAY1_UICCODE=242*P1*PAY1_AMOUNT=12.34*P1*PAY1_AUTHORIZATIONCODE=*P1*PAY1_ERRORCODE=1143*P1*PAY1_ERRORDESCRIPTION=Transazione abbandonata dal compratore*P1*PAY1_VBVRISP=*P1*PAY1_VBV=OK*P1*PAY1_3DLEVEL=HALF*P1*PAY1_COUNTRY=*P1*PAY1_CHNAME=*P1*PAY1_CHEMAIL=DEMO_carlo@tnx.it*P1*PAY1_CUSTOMINFO= [TransactionResult] => KO [ProtocolAuthServer] => http [DomainName] => testecomm.sella.it [separator] => *P1* [errDescription] => [errNumber] => 0 [Version] => 2.0 [Min] => [CVV] => [country] => [vbvrisp] => [vbv] => [ToBeEncrypt] => [ScriptEnCrypt] => /CryptHTTP/Encrypt.asp [ScriptDecrypt] => /CryptHTTP/Decrypt.asp [debug] => */ $info = ''; $data = array(); foreach($objCrypt as $k=>$v) { $v = trim((string)$v); if ($v && !in_array($k, array('CustomInfo', 'EncryptedString', 'Decrypted', 'ProtocolAuthServer', 'separator', 'Version', 'ScriptEnCrypt', 'ScriptDecrypt'))) { $data[$k] = $v; $info .= "\t$k:\t$v\n"; } } $info = utf8_encode($info);//necessario altrimenti in caso di accenti la query da' errore (Illegal mix of collations (latin1_swedish_ci,IMPLICIT), (utf8_general_ci,COERCIBLE), (utf8_general_ci,COERCIBLE) for operation 'concat') $this->Procedura->identificativo = $data['ShopTransactionID']; $this->Procedura->restart_url = $mycustominfo['LINK_PAGAMENTO']?$mycustominfo['LINK_PAGAMENTO']:$_SESSION['LINK_PAGAMENTO']; $this->identificativo = $data['ShopTransactionID']; //$data['TransactionResult'] può essere OK, KO o XX in caso di bonifico switch ($step) { case 'return_ok': $this->Procedura->redirect($this->Procedura->genera_link_agg(array("a"=>"", "b"=>"", "pagamentoConcluso"=>$this->identificativo))); return; case 's2s': if($data['TransactionResult'] === 'OK'){ if($this->Procedura->isConfermato($data['ShopTransactionID'])){//il controllo durante il setup salta perchè non c'è $this->identificativo $this->Procedura->logga(array( 'identificativo_ordine' => $data['ShopTransactionID'], 'ultimo_stato' => "Operazioni di conferma annullate (procedura già confermata)" )); } else{ $this->Procedura->confermato($data['ShopTransactionID']); } } else if($data['TransactionResult'] === 'KO' && $data['ErrorCode'] == 1136) { //in questo caso non ho $this->identificativo, nemmeno con identificativoFromSession perchè è una s2s $info .= "\t".$errore_1136_9999."\n"; } $this->Procedura->comunicazione_s2s($this->identificativo, $info); $this->pulisciOutput(); echo "";//la pagina residente nel server dell'esercente dovrà necessariamente avere nel sorgente i tag html die; case 'error'://banca sella rimanda sull'url configurato come risposta negativa sia in caso di annullamento che di pagamento non accettato, viene chiamato anche in s2s in caso di abbandano! case 'return_ko'://non viene usato $this->Procedura->redirect($this->Procedura->genera_link_agg(array("a"=>"", "b"=>"", "pagamentoConcluso"=>$this->identificativo, "ErrorCode"=>$data['ErrorCode']))); return; } } } } } function indiLingua() { switch ($GLOBALS['DATI']["lang"]) { case "ita": $this->lingua = 1; break; case "fra": $this->lingua = 4; break; case "spa": $this->lingua = 3; break; case "ger": $this->lingua = 5; break; default: $this->lingua = 2; break; } } } ?>