Tema: Re: Banklink diegimas
Autorius: Justas Butkus
Data: 2009-09-25 10:48:09
Labas.

Kurioje vietoje klaida? Neteisingas parašas, ar apdorojimo klaida?
var_dump($ok); // 5 eilutė nuo pabaigos

Kokį paslaugos numerį siunčia (i.e. VK_SERVICE)?

Ir dar - banke žmonės draugiški. ;)



--
JB

Mantas rašė:
> 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;
>     }
> }