Kažkada man teko su šita nesamone dirbt, tai veikiantį sprendimą pasiekiau taip:
Failas, iš kurio siunčiama informacija į banką
<?php
$HP = array
(
'VK_SERVICE' => '1001',
'VK_VERSION' => '008',
'VK_SND_ID' => '',
'VK_STAMP' => '',
'VK_AMOUNT' => '0.01',
'VK_CURR' => 'LTL',
'VK_ACC' => '',
'VK_PANK' => '73000',
'VK_NAME' => '',
'VK_REF' => '',
'VK_MSG' => 'Mokėjimas už prekę',
'VK_MAC' => '',
'VK_RETURN' => '',
'VK_LANG' => 'LIT'
);
$VKMac = array(
$HP['VK_SERVICE'],
$HP['VK_VERSION'],
$HP['VK_SND_ID'],
$HP['VK_STAMP'],
$HP['VK_AMOUNT'],
$HP['VK_CURR'],
$HP['VK_ACC'],
$HP['VK_PANK'],
$HP['VK_NAME'],
$HP['VK_REF'],
$HP['VK_MSG'] );
$mac = '';
foreach($VKMac as $str) {
$sl = strlen($str);
if($sl > 0 && $sl < 10) {
$mac .= "00".$sl.$str;
}
if($sl > 9 && $sl < 100) {
$mac .= "0".$sl.$str;
}
if($sl > 99 && $sl < 1000) {
$mac .= $sl.$str;
}
}
$fp = fopen("private.pem", "r");
$priv_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key);
openssl_sign($mac, $signature, $pkeyid);
$signature = base64_encode($signature);
$signature = preg_replace("/[\r|\n]/", "", $signature);
openssl_free_key($pkeyid);
$HP['VK_MAC'] = $signature;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>BankLink</title>
<base href="" />
<meta name="Generator" content="" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1257" />
<meta name="keywords" content="" />
<meta name="description" content="" />
</head>
<body>
<div><?php echo $mac; ?></div>
<div class="container">
<form name="bankLinkForm" action="https://ib.swedbank.lt/banklink/" method="post">
<?php
foreach($HP as $key => $value) {
echo '<input style="width: 300px;" type="text" name="'.$key.'" value="'.$value.'" /><br />'."\n";
}
?>
<button type="submit">siųsti</button>
</form>
</div>
</body>
</html>
Failas, kuris priima informaciją
<?php
header('Content-Type: text/html; charset=ISO-8859-13');
$HP = $_POST;
$VKMac = array(
$HP['VK_SERVICE'],
$HP['VK_VERSION'],
$HP['VK_SND_ID'],
$HP['VK_REC_ID'],
$HP['VK_STAMP'],
$HP['VK_AMOUNT'],
$HP['VK_CURR'],
$HP['VK_REC_ACC'],
$HP['VK_REC_NAME'],
$HP['VK_SND_ACC'],
$HP['VK_SND_NAME'],
$HP['VK_REF'],
$HP['VK_MSG'],
$HP['VK_T_DATE'] );
$fp = fopen("cert.pem", "r");
$pub_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_publickey($pub_key);
$mac = '';
foreach($VKMac as $str) {
//$str = iconv('ISO-8859-13', 'Windows-1257', $str);
$sl = strlen($str);
if($sl > 0 && $sl < 10) {
$mac .= "00".$sl.$str;
}
if($sl > 9 && $sl < 100) {
$mac .= "0".$sl.$str;
}
if($sl > 99 && $sl < 1000) {
$mac .= $sl.$str;
}
}
$ok = openssl_verify($mac, base64_decode($HP['VK_MAC']), $pkeyid);
if ($ok == 1) {
echo "Good signature";
} elseif ($ok == 0) {
echo "Bad signature";
} else {
echo "Error checking signature";
}
openssl_free_key($pkeyid);
?>
Tik va nepamenu ar eilutė
$str = iconv('ISO-8859-13', 'Windows-1257', $str);
būtina ar ne. čia aišku galima pasibandyti ir bus matyti.
Beje, failų koduotė buvo ANSI.
Su sąlyga, kad šūdo nebus...