V dnešnom príspevku nájdete jednoduchú PHP implementáciu TatraPay a CardPay od TatraBanky.
Implementácia sa skladá z troch tried. Trieda TatraBanka obsahuje deklaráciou premenných a metódy GetSign() na výpočet bezpečnostného kľúča zo zadaného reťazca. Z tejto triedy su odvodené triedy TatraPay a CardPay, ktoré implementujú konštruktor a metódy GetUrl(), ktorá vracia URL pre vykonanie platby a VerifyReply(), ktorá slúži na overenie odpovede z banky.
Triedy boli implementované podľa technických príručiek od TatraBanky. Príručky si môžete stiahnuť tu: TatraPay, CardPay.
Použitie je veľmi jednoduché. Presmerovanie na stránku TB pre vykonanie platby:
require('TatraBanka.class.php');
// parametre: suma, mena, VS, návratová URL
$objTP = new TatraPay('123.4', '978', '1234', 'http://www.example.com/');
header('Location: ' . $objTP->GetUrl());
exit;
Overenie odpovede z banky:
require('TatraBanka.class.php');
$objTP = new TatraPay();
if($objTP->VerifyReply()) {
echo "Odpoveď je OK";
} else {
echo "Pozor odpoveď nie je platná!";
}
Spomínané triedy sú tu:
<?php
/*
* Zakladna trieda pre triedy TatraPay a CardPay
*/
class TatraBanka {
const KEY = 'tajny_kluc';
const MID = '1234';
const RSMS = ''; // cislo kam sa maju posielat SMS notifikacie o platbe
const REM = ''; // mail kam sa maju posielat notifikacie o platbe
/**
* Suma. Max 13+2 číslic. Desatinná čiarka musí byť '.'
* @var Float
*/
protected $strAMT;
/**
* Mena transakcie. Kód 978 je pre EURO.
* @var String
*/
protected $strCURR;
/**
* Variabilný symbol. Max 10 číslic.
* @var String
*/
protected $strVS;
/**
* Špecifický symbol - nepovinný. Max 10 číslic.
* @var String
*/
protected $strSS;
/**
* Konštantný symbol. Max 4 číslice.
* @var String
*/
protected $strCS;
/**
* Návratová URL
* @var String
*/
protected $strRURL;
/**
* Bezpečnostný podpis
* @var String
*/
protected $strSIGN;
/**
* GetSign vracia bezpečnostný podpis zo zadaného reťazca
* @param $str reťazec z ktorého sa vypočíta podpis
* @return string
*/
public function GetSign($str) {
$strSIGN = sha1($str, true);
$strSIGN = substr($strSIGN, 0, 8);
$des = mcrypt_module_open(MCRYPT_DES, "", MCRYPT_MODE_ECB, "");
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($des), MCRYPT_RAND);
mcrypt_generic_init($des, self::KEY, $iv);
$strSIGN = mcrypt_generic($des, substr($strSIGN, 0, 8));
mcrypt_generic_deinit($des);
mcrypt_module_close($des);
$strSIGN = strtoupper(bin2hex($strSIGN));
return $strSIGN;
}
protected function SanitizeFloat($flt) {
return str_replace(',', '.', sprintf('%.2f', $flt));
}
}
/**
* Trieda pre CardPay
*/
class TatraPay extends TatraBanka {
/**
* Constructor
* @param $AMT suma
* @param $CURR mena
* @param $VS variabilný symbol
* @param $RURL návratová URL
* @return New TatraPay object
*/
public function __construct($AMT = null, $CURR = null, $VS = null, $RURL = null, $SS = null, $CS = '0308') {
$this->strAMT = $this->SanitizeFloat($AMT);
$this->strCURR = $CURR;
$this->strVS = $VS;
$this->strRURL = $RURL;
$this->strSS = $SS;
$this->strCS = $CS;
$this->strSS = $SS;
$strSIGN = $this->GetSign(self::MID . $this->strAMT . $CURR . $VS . $CS . $RURL);
$this->strSIGN = $strSIGN;
}
public function GetUrl() {
$url = sprintf('https://moja.tatrabanka.sk/cgi-bin/e-commerce/start/e-commerce.jsp?PT=TatraPay&MID=%s&AMT=%s&CURR=%s&VS=%s&CS=%s&RURL=%s&SIGN=%s',
self::MID,
$this->strAMT,
$this->strCURR,
$this->strVS,
$this->strCS,
$this->strRURL,
$this->strSIGN
);
if(self::RSMS != '')
$url .= '&RSMS=' . self::RSMS;
if(self::REM != '')
$url .= '&REM=' . self::REM;
return $url;
}
public function VerifyReply() {
if(!isset($_GET['VS']))
return false;
if(!isset($_GET['RES']))
return false;
if(!isset($_GET['SIGN']))
return false;
$strToSign = $_GET['VS'] . $_GET['RES'];
if($_GET['SIGN'] == $this->GetSign($strToSign)) {
return true;
}
return false;
}
}
/**
* Trieda pre CardPay
*/
class CardPay extends TatraBanka {
/**
* IP adresa klienta
* @var String
*/
protected $strIPC;
/**
* Meno klienta
* @var String
*/
protected $strNAME;
/**
* Constructor
* @param $AMT suma
* @param $CURR mena
* @param $VS variabilný symbol
* @param $RURL návratová URL
* @return new CardPay object
*/
public function __construct($NAME = null, $AMT = null, $CURR = null, $VS = null, $RURL = null, $SS = null, $CS = '0308') {
setlocale(LC_CTYPE, 'en_US.UTF-8');
$this->strNAME = strtr(iconv('UTF-8', 'US-ASCII//TRANSLIT', $NAME), array("'" => ''));
$this->strAMT = $this->SanitizeFloat($AMT);
$this->strCURR = $CURR;
$this->strVS = $VS;
$this->strRURL = $RURL;
$this->strSS = $SS;
$this->strCS = $CS;
if(array_key_exists('X_FORWARDED_FOR', $_SERVER)) {
$this->strIPC = $_SERVER['X_FORWARDED_FOR'];
} else {
$this->strIPC = $_SERVER['REMOTE_ADDR'];
}
$strSIGN = $this->GetSign(self::MID . $this->strAMT . $this->strCURR . $this->strVS . $this->strCS . $RURL . $this->strIPC . $this->strNAME);
$this->strSIGN = $strSIGN;
}
public function GetUrl() {
$url = sprintf('https://moja.tatrabanka.sk/cgi-bin/e-commerce/start/e-commerce.jsp?PT=CardPay&MID=%s&AMT=%s&CURR=%d&VS=%s&CS=%s&RURL=%s&SIGN=%s&IPC=%s&NAME=%s',
self::MID,
$this->strAMT,
$this->strCURR,
$this->strVS,
$this->strCS,
$this->strRURL,
$this->strSIGN,
$this->strIPC,
urlencode($this->strNAME)
);
if(self::RSMS != '')
$url .= '&RSMS=' . self::RSMS;
if(self::REM != '')
$url .= '&REM=' . self::REM;
return $url;
}
public function VerifyReply() {
if(!isset($_GET['VS']))
return false;
if(!isset($_GET['RES']))
return false;
if(!isset($_GET['SIGN']))
return false;
if(!isset($_GET['AC']))
return false;
$strToSign = $_GET['VS'] . $_GET['RES'] . $_GET['AC'];
if($_GET['SIGN'] == $this->GetSign($strToSign)) {
return true;
}
return false;
}
}
Ako vidíte tak implementácia je veľmi jednoduchá a nesnaží sa byť univerzálnym riešením. Ak by ste mali záujem o univerzálnu knižnicu a dokonca aj pre iné banky ako TatraBanka, tak môžete použiť knižnicu MONOGRAM EPayment.
Pridaj komentár