Platobné rozhranie VÚB e-platby
Všeobecná úverová banka poskytuje záujemcom o priame platby na ich účet vo VÚB možnosť implementovať službu e-Platby. Jedná sa o technicky vyspelú službu disponujúcu štandardnými modernými bezpečnostnými prvkami s vhodne navrhnutou štruktúrou prenášaných parametrov. Významným plusom je publikovanie technických detailov implementácie priamo na stránach VÚB - pozri Technický popis k službe e Platby VÚB.
Základná štruktúra parametrov odosielaných na rozhranie platobného servera VÚB:
Povinné parametre:
- MID
- ID obchodu, ktoré prideľuje banka (maximálne 20 alfanumerických znakov bez medzier)
- AMT
- Suma SKK, maximálne 13 znakov (ako oddeľovac desatinných miest sa použije bodka [.])
- VS
- Variabilný symbol, jednoznačný identifikátor platby (maximálne 10 numerických znakov)
- CS
- Konštantný symbol (max. 4 numerické znaky)
- RURL
- URL adresa, na ktorú banka presmeruje klienta po realizácii platby alebo po chybe
- SIGN
- Bezpečnostný kód pre zabezpečenie integrity prenášaných údajov. Pre vygenerovanie kľúča je potrebné heslo, ktoré obchodník obdrží od banky
Nepovinné parametre:
- SS
- Špecifický symbol (max. 10 numerických znakov)
- DESC
- Popis transakcie. Parameter je nepovinný a klient ho bude môcť na stránke Internet Bankingu zmeniť
- REM
- Emailová adresa obchodníka, kam bude zaslaná informácia o realizácii platby
- RSMS
- Slovenské mobilné číslo obchodníka, kam bude zaslaná informácia o realizácii platby (09XXXXXXXX)
Generácia parametru SIGN pri odosielaní na platobný server
Z hľadiska technickej implementácie je najzaujímavejším parameter SIGN. Ide o kód, ktorý je jedinečný pre každú realizovanú transakciu a kontrolou na strane odosielajúceho klienta (klientského prehliadača) ako aj platobného servera je zaručená neporušenosť prenášaných parametrov. (Pozn. SIGN je skrátením anglického SIGNature, tzn. kryptovaný podpis transakčných parametrov). SIGN ja vlastne reťazec s pevnou dĺžkou 16 znakov a vyzerá napríklad takto: [08BFDD71F7373FD1]. Pre jeho generáciu je nevyhnutné mať inštalovanú kryptovaciu knižnicu mcrypt (týka sa PHP). Príklady rutín pre generáciu SIGN parametra sú obsiahnuté v Technickom popise k službe e platby.
Parameter SIGN sa vygeneruje sa nasledovne:
- vytvorí sa reťazec z nasledovných parametrov: MID, AMT, VS, CS, RURL
- vypočíta sa SHA1 vytvoreného reťazca (raw_output, 20 znakov)
- reťazec SHA1 sa zakryptuje prostredníctvom obchodníkovho hesla
- prvých 8 bajtov zakryptovaného reťazca bude binárne prekonvertovaných do hexadecimálnej podoby
- výsledný SIGN parameter má dĺžku 16 alfanumerických znakov
Vďaka zakryptovaniu návratovej URL adresy (RURL) priamo do SIGN parametra nie je obchodník počas implementácie obmedzený na použitie jedinej návratovej adresy - tá sa dá pružne kedykoľvek prenastaviť. V porovnaní s ČSOB, kde musí byť návratová linka zmluvne dohodnutá pri podpise zmluvy je to významé uľahčenie procesu implementácie.
Kontrola parametru SIGN pri prijatí odpovede z platobného servera
Platobný server VÚB odosiela na zadanú návratovú linku (RURL) nasledovnú štruktúru parametrov:
Povinné parametre:
- VS
- Variabilný symbol, jednoznačný identifikátor platby (maximálne 10 numerických znakov)
- RES
- Výsledok transakcie (RESult) - [OK] alebo [FAIL]
- SIGN
- Bezpečnostný kód pre zabezpečenie integrity prenášaných údajov
Nepovinné parametre:
- SS
- Špecifický symbol (max. 10 numerických znakov)
Server obchodníka zkontroluje integritu parametrov opäť vypočítaním kontrolného SIGN parametra a jeho porovnaním so SIGN parametrom obsiahnutým v odpovedi platobného servera. Postup kryptovania je podobný, ako pri generácii SIGN parametra odosielaného na platobný server, avšak v prvom kroku sa vytvorí reťazec len z parametrov VS, RES a prípadne SS, ak je neprázdny. Pri generácii sa taktiež opäť vyžije heslo obchodníka známe len v systéme platobného servera VÚB alebo obchodníkovi.
Zhrnutie
VÚB poskytuje štandardne bezpečné, relatívne jednoduché a pritom dostatočne pružné platobné rozhranie. Správnosť vygenerovaného kľúča SIGN je možné overiť na testovacej linke https://ib.vub.sk/Development/EPayments.aspx. Technická príručka obsahuje taktiež predprogramované rutiny pre generáciu SIGN kľúča v jazyku JAVA, C# alebo PHP.
Rutiny pre generáciu SIGN kľúča:
// Java
private String CalculateSIGN(String MID, String AMT, String VS, String CS, String RURL, String PWD){
String SIGN = "";
try{
String StringToEncypher = MID + AMT + VS + CS + RURL;
MessageDigest hash = MessageDigest.getInstance("SHA-1");
byte bytesHash[] = hash.digest(StringToEncypher.getBytes());
Cipher des = Cipher.getInstance("DES/ECB", "Cryptix");
des.initEncrypt(new RawSecretKey("DES", PWD.getBytes()));
byte bytesSIGN[] = des.crypt(bytesHash, 0, 8);
SIGN = Hex.dumpString(bytesSIGN);
} catch (Exception e){
;
}
return SIGN;
}
// C#
private string CalculateSIGN(string MID, string AMT, string VS, string CS, string RURL, string PWD){
string SIGN = "";
try{
string StringToEncypher = MID + AMT + VS + CS + RURL;
byte[] bytesStringToEncypher = Encoding.ASCII.GetBytes(StringToEncypher);
HashAlgorithm hash = new SHA1Managed();
byte[] bytesHash = hash.ComputeHash(bytesStringToEncypher);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = Encoding.ASCII.GetBytes(PWD);
des.Mode = CipherMode.ECB;
ICryptoTransform transform = des.CreateEncryptor();
byte[] bytesSIGN = new byte[8];
transform.TransformBlock(bytesHash, 0, 8, bytesSIGN, 0);
SIGN = BitConverter.ToString(bytesSIGN).Replace("-", "");
}catch (Exception e){
e = e;
}
return SIGN;
}
// PHP4, PHP5
function CalculateSIGN ($MID, $AMT, $VS, $CS, $RURL, $PWD){
$SIGN = "";
$StringToEncypher = $MID . $AMT . $VS . $CS . $RURL;
$bytesHash = sha1($StringToEncypher, true);
$bytesHash = CheckAndConvert($bytesHash); // nutne pre PHP < 5.0
$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, $PWD, $iv); // IV je ignorovaný pri ECB
$bytesSIGN = mcrypt_generic($des, substr($bytesHash, 0, 8));
mcrypt_generic_deinit($des);
mcrypt_module_close($des);
$SIGN = strtoupper(bin2hex($bytesSIGN));
return $SIGN;
}
function CheckAndConvert($str){
if (StrLen($str) == 20) return $str;
$bytes = "";
for ($i = 0; $i < StrLen($str); $i+=2){
$bytes = $bytes . chr(hexdec(substr($str, $i, 2)));
};
return $bytes;
}
Technický popis k službe e-Platby - na stiahnutie: