require_once("MedodoDiPagamento.php");
require_once(dirname(__FILE__)."/../../banca_sella/GestPayCrypt.inc.php");
class SellaGestPay extends MedodoDiPagamento {
//contratto con la possibilità di usare il parametro CustomInfo
//mi serve per portarmi dietro il link restart
//se il contratto del cliente non lo prevede allora lo appoggio in sessione
var $contrattoConParametriAbilitati = true;
var $nome_metodo = "Carta di credito";
var $step_var = "vp_step";
//configurazione merchant
var $id = "GESPAY59091";
var $dominio = "ecomm.sella.it";
var $descrizione = '';
var $identificativo = '';//fino 256 caratteri
var $lingua = 1;//"ita"=>"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:
- impostare URL per risposta positiva: '.$this->Procedura->genera_link(array_merge($this->restart_params, array($this->Procedura->metodo_var=>$this->metodo_key, $this->step_var=>"return_ok"))).'
- impostare URL per risposta negativa: '.$this->Procedura->genera_link(array_merge($this->restart_params, array($this->Procedura->metodo_var=>$this->metodo_key, $this->step_var=>"error"))).'
- impostare URL Server to Server: '.$this->Procedura->genera_link(array_merge($this->restart_params, array($this->Procedura->metodo_var=>$this->metodo_key, $this->step_var=>"s2s"))).'
SOLO PROFILI NON-BASIC (per i profili basic impostare contrattoConParametriAbilitati = false):
- configurare Language come "Parametro" nella sezione Campi¶metri
- configurare Buyer Name / Buyer E-Mail come "Input" e "Parametro" nella sezione Campi¶metri
- aggiungere il campo LINK_PAGAMENTO (possibile farlo comparire anche nella mail di risposta al cliente, basta compilare il campo dell\'etichetta in lingua abbinata)
';
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¶metri';
}
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;
}
}
}
?>