Tema: Banklink diegimas
Autorius: Mantas
Data: 2009-09-24 11:30:09
Sveiki,

Reikia idiegti swedbank'o banklink sistema.
Ir susiduriau su tokia problema.
Gaunu atsakyma ir banko, bet niekaip negaliu patikrinti autentiskumo su 
banko sertifikatu.
Visada gaunu pranesima blogas parasas.

Gal kas galit padeti?

Paraso tikrinimo kodas:


$v = new Verify();

	if ($v->checkPaymentStatus() == true)
	{
		$currency = new Currency(intval($_REQUEST['VK_CURR']));
		$SwedbankBanklink = new SwedbankBanklink();
		$SwedbankBanklink->validateOrder($_REQUEST['VK_REF'], _PS_OS_PAYMENT_, 
$_REQUEST['VK_AMOUNT'], $SwedbankBanklink->displayName, NULL, NULL, 
$currency->id, true);
		
		if($_REQUEST['VK_AUTO'] == 'N'){
			
			$SwedbankBanklink->currentOrder = $SwedbankBanklink->mokejimai_order->id;
			
			$order = new Order($SwedbankBanklink->currentOrder);
			
			$url = 
__PS_BASE_URI__.'order-confirmation.php?id_cart='.$cart->id.'&id_module='.$SwedbankBanklink->id.'&id_order='.$SwedbankBanklink->currentOrder.'&key='.$order->secure_key;
			
			// print $url; exit;
			
			Tools::redirectLink($url);
		}
	}
	else
	{
		header("Location: ../../order.php?step=1");
	}
class Verify{
	
	function checkPaymentStatus()
     {
     	$file_cert = dirname(__FILE__).'/crtbank/rsa_new.crt';
     	if(isset($_REQUEST['VK_MAC']) AND isset($_REQUEST['VK_SERVICE'])){
			if ($this->verifySignature($file_cert))
			{
				if( ($_REQUEST['VK_SERVICE'] != '1101' &&  $_REQUEST['VK_SERVICE'] 
!= '70440') || $_REQUEST['VK_SERVICE'] == '1901' )
				{
					//Apmokėjimas nesėkmingas
					return false;	
				}
			}
			else
			{    	
				//Blogas parašas
				return false;
			}
			return true;
		}else{
			//Blogas kreipinys
			return false;
		}
     }
	
	function generateMac($arrayStr) {
	    $ret = "";
	    foreach($arrayStr as $str ) {
	        $sl = strlen($str);
	        if($sl > 0 && $sl < 10) {
	            $ret .= "00".$sl.$str;
	        }
	        if($sl > 9 && $sl < 100) {
	            $ret .= "0".$sl.$str;
	        }
	        if($sl > 99 && $sl < 1000) {
	            $ret .= $sl.$str;
	        }
	    }
	    return $ret;
	}
	
     function verifySignature($file_cert){
		// -- skaitomas sertifikato failas
		$fp = fopen($file_cert, "r");
		$cert = fread($fp, 8192);
		fclose($fp);
	
			
		switch ($_REQUEST['VK_SERVICE']) {
				// Apmokejimas nepavyko bet patikrinam ar atejo is banko
				case '1901':
						$vk_mac_no[] = $_REQUEST['VK_SERVICE'];
						$vk_mac_no[] = $_REQUEST['VK_VERSION'];
						$vk_mac_no[] = $_REQUEST['VK_SND_ID'];
						$vk_mac_no[] = $_REQUEST['VK_REC_ID'];
						$vk_mac_no[] = $_REQUEST['VK_STAMP'];
						$vk_mac_no[] = $_REQUEST['VK_REF'];
						$vk_mac_no[] = $_REQUEST['VK_MSG'];
				break;
				
				//Apmokejimas sekmingas bet patikrinam ar tikrai tai apmokejo bankas.
				case '1101':
						$vk_mac_no[] = $_REQUEST['VK_SERVICE'];
						$vk_mac_no[] = $_REQUEST['VK_VERSION'];
						$vk_mac_no[] = $_REQUEST['VK_SND_ID'];
						$vk_mac_no[] = $_REQUEST['VK_REC_ID'];
						$vk_mac_no[] = $_REQUEST['VK_STAMP'];
						$vk_mac_no[] = $_REQUEST['VK_T_NO'];
						$vk_mac_no[] = $_REQUEST['VK_AMOUNT'];
						$vk_mac_no[] = $_REQUEST['VK_CURR'];
						$vk_mac_no[] = $_REQUEST['VK_REC_ACC'];
						$vk_mac_no[] = $_REQUEST['VK_REC_NAME'];
						$vk_mac_no[] = $_REQUEST['VK_SND_ACC'];
						$vk_mac_no[] = $_REQUEST['VK_SND_NAME'];
						$vk_mac_no[] = $_REQUEST['VK_REF'];
						$vk_mac_no[] = $_REQUEST['VK_MSG'];  				
						$vk_mac_no[] = $_REQUEST['VK_T_DATE'];
				break;


				default:
					break;
			}


		$vk_mac = $this->generateMac($vk_mac_no);
		$signature = $_REQUEST['VK_MAC'];
		$pubkeyid = openssl_get_publickey($cert);
		$ok = openssl_verify($vk_mac, base64_decode($signature), $pubkeyid);
		openssl_free_key($pubkeyid);
		
		return $ok;
	}
}