我尝试使用“表单集成”方法将SagePay支付网关集成到网站中。
基本上,只要选择了FORM的“提交”按钮,表单集成方法就可以在网页中插入FORM并将信息发布到SagePay的服务器。在将信息发送到SagePay服务器之前,必须先使用AES / CBC / PKCS#5算法对其进行加密,然后再进行Base 64编码。
我有加密的基本知识,但我没有在PHP中使用它的经验。请问有人可以帮我用PHP制定AES / CBC / PKCS#5算法吗?
到目前为止,这是我的努力:
$CRYPT = "Text Goes Here";
$blocksize = 16;//Does 16 Refer To 16 Bytes Or 16 Bits? 16 Bytes = 128 Bits.
$cryptLength = strlen($CRYPT);
$cryptLengthModuloBlocksize = $cryptLength % $blocksize;
$pad = $blocksize - $cryptLengthModuloBlocksize;
$padString = str_repeat(chr($pad), $pad);
$CRYPT = $CRYPT . $padString;
$encryptionPassword = 'password';
$Encrypted_CRYPT = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryptionPassword, $CRYPT, MCRYPT_MODE_CBC);
$Base64_Encrypted_CRYPT = base64_encode($Encrypted_CRYPT);
echo "<form action = 'https://test.sagepay.com/gateway/service/vspform-register.vsp' method = 'POST'>
<input type = 'hidden' name = 'VPSProtocol' value = '3.00' />//
<input type = 'hidden' name = 'TxType' value = 'PAYMENT' />
<input type = 'hidden' name = 'Vendor' value = 'vendorName' />
<input type = 'hidden' name = 'Crypt' value = '" . $Base64_Encrypted_CRYPT . "' />
<input type= 'submit' value = 'Submit'>
</form>";
非常感谢任何帮助。
答案 0 :(得分:8)
这是AES / CBC / PKCS#5的工作实现,与Sagepay的表单集成一起使用 您将需要安装mcrypt。 sp_encryption是加密密钥的定义。
/**
* @param string $data - the key=value pairs separated with &
* @return string
*/
protected function encode_data($data) {
$strIn = $this->pkcs5_pad($data);
$strCrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, sp_encryption, $strIn, MCRYPT_MODE_CBC, sp_encryption);
return "@" . bin2hex($strCrypt);
}
/**
* @param string $data - crypt response from Sagepay
* @return string
*/
protected function decode_data($data) {
if (substr($data, 0, 1) == "@") {
$strIn = hex2bin(substr($data, 1));
return $this->pkcs5_unpad(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, sp_encryption, $strIn, MCRYPT_MODE_CBC, sp_encryption));
}
return '';
}
protected function pkcs5_pad($text) {
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$pad = $size - (strlen($text) % $size);
return $text . str_repeat(chr($pad), $pad);
}
protected function pkcs5_unpad($text) {
$pad = ord($text{strlen($text) - 1});
if ($pad > strlen($text)) return false;
if (strspn($text, $text{strlen($text) - 1}, strlen($text) - $pad) != $pad) {
return false;
}
return substr($text, 0, -1 * $pad);
}
在旁注中确保您使用的VPSProtocol是'3.00'而不是3,而不是3.0,因为这些不起作用!
Hoep这有助于sagepay尽快获得一些官方PHP文档。
答案 1 :(得分:5)
是的,没关系。 (只要我们有一个v3.00的PHP工具包,我们就会在我们的网站上显示它。)
希望以下帮助你。
示例:
使用Base64编码进行AES加密 AES加密,使用PKCS5填充进行CBC阻塞,然后使用HEX编码
//** Wrapper function do encrypt an encode based on strEncryptionType setting **
function encryptAndEncode($strIn) {
global $strEncryptionType
,$strEncryptionPassword;
{
//** AES encryption, CBC blocking with PKCS5 padding then HEX encoding **
//** use initialization vector (IV) set from $strEncryptionPassword
$strIV = $strEncryptionPassword;
//** add PKCS5 padding to the text to be encypted
$strIn = addPKCS5Padding($strIn);
//** perform encryption with PHP's MCRYPT module
$strCrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $strEncryptionPassword, $strIn, MCRYPT_MODE_CBC, $strIV);
//** perform hex encoding and return
return "@" . bin2hex($strCrypt);
}
}
//** Wrapper function do decode then decrypt based on header of the encrypted field **
function decodeAndDecrypt($strIn) {
global $strEncryptionPassword;
if (substr($strIn,0,1)=="@")
{
//** HEX decoding then AES decryption, CBC blocking with PKCS5 padding **
//** use initialization vector (IV) set from $strEncryptionPassword
$strIV = $strEncryptionPassword;
//** remove the first char which is @ to flag this is AES encrypted
$strIn = substr($strIn,1);
//** HEX decoding
$strIn = pack('H*', $strIn);
//** perform decryption with PHP's MCRYPT module
return removePKCS5Padding(
mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $strEncryptionPassword, $strIn, MCRYPT_MODE_CBC, $strIV));
}
}
答案 2 :(得分:2)
您使用PKCS5填充然后使用HEX编码,因为我们的旧PHP套件使用了这个。
您可能需要查看previous post来比较您要发送的内容。它使用较旧的协议v2.23和XOR。如果您使用我们的新协议,您将使用v3.00和AES。
如果您想发送电子邮件至feedback@sagepay.com,我们可以进一步讨论。请引用此论坛帖子网址。
Sage Pay支持
答案 3 :(得分:2)
您可以在此处查看正在运行的v3示例:https://github.com/tolzhabayev/sagepayForm-php