升级到 VPS 协议 3.00 后,实时加密密钥不起作用
live encryption key not working after upgrading to VPS protocol 3.00
与 this question 类似,我已经迁移了一个站点以使用 VPS 协议 3.00。
我已经使用测试加密密钥对测试站点进行了测试,并且一切正常。当我将其切换为使用带有实时加密密钥的实时站点时,我遇到了可怕的 3045 : The Currency field is missing
错误。
当使用 VPS 协议 2.22 时,相同的加密密钥在实时站点上有效,但在切换到 3.00 时无效。
我还将 post 数据提供给解密脚本,该脚本使用相同的密钥解密 crypt
没有问题。
谁能想到为什么代码会针对 test.
而不是 live.
使用适当的密钥,或者为什么 2.22 接受密钥而 3.0 不接受密钥? live.
是否对 3.00 进行了任何额外检查,而 test.
不是?
我的代码稍微修改了集成工具包中的功能:
function addPKCS5Padding($input) {
$blockSize = 16;
$padd = "";
// Pad input to an even block size boundary.
$length = $blockSize - (strlen($input) % $blockSize);
for ($i = 1; $i <= $length; $i++) {
$padd .= chr($length);
}
return $input . $padd;
}
// AES encryption, CBC blocking with PKCS5 padding then HEX encoding.
function sagepay_encrypt($string, $key) {
// Add PKCS5 padding to the text to be encrypted.
$string = addPKCS5Padding($string);
// Perform encryption with PHP's MCRYPT module.
$crypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $string, MCRYPT_MODE_CBC, $key);
// Perform hex encoding and return.
return "@" . strtoupper(bin2hex($crypt));
}
通过填充 $crypt_values
数组并调用:
来调用它
$crypt_source = sagepay_buildcrypt($crypt_values);
$crypt = sagepay_encrypt($crypt_source, $sagepay_key);
$crypt_source
在所有情况下都有效且(大致)相同:
VendorTxCode=20150721020857Deannatest&VendorData=Deanna test&Amount=1&Currency=GBP&Description=Quote Reference Deanna test&BillingSurname=Earley&BillingFirstnames=Deanna&BillingAddress1.....
查看加密密码,太短了一个字符。我通过在末尾添加 'X'(大写)对其进行了更新,因此只需相应地更新您的值即可。
我已经试过了,现在可以了。
我假设您使用的密码以“3Gd”开头(如果不知道请告诉我)。
与 this question 类似,我已经迁移了一个站点以使用 VPS 协议 3.00。
我已经使用测试加密密钥对测试站点进行了测试,并且一切正常。当我将其切换为使用带有实时加密密钥的实时站点时,我遇到了可怕的 3045 : The Currency field is missing
错误。
当使用 VPS 协议 2.22 时,相同的加密密钥在实时站点上有效,但在切换到 3.00 时无效。
我还将 post 数据提供给解密脚本,该脚本使用相同的密钥解密 crypt
没有问题。
谁能想到为什么代码会针对 test.
而不是 live.
使用适当的密钥,或者为什么 2.22 接受密钥而 3.0 不接受密钥? live.
是否对 3.00 进行了任何额外检查,而 test.
不是?
我的代码稍微修改了集成工具包中的功能:
function addPKCS5Padding($input) {
$blockSize = 16;
$padd = "";
// Pad input to an even block size boundary.
$length = $blockSize - (strlen($input) % $blockSize);
for ($i = 1; $i <= $length; $i++) {
$padd .= chr($length);
}
return $input . $padd;
}
// AES encryption, CBC blocking with PKCS5 padding then HEX encoding.
function sagepay_encrypt($string, $key) {
// Add PKCS5 padding to the text to be encrypted.
$string = addPKCS5Padding($string);
// Perform encryption with PHP's MCRYPT module.
$crypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $string, MCRYPT_MODE_CBC, $key);
// Perform hex encoding and return.
return "@" . strtoupper(bin2hex($crypt));
}
通过填充 $crypt_values
数组并调用:
$crypt_source = sagepay_buildcrypt($crypt_values);
$crypt = sagepay_encrypt($crypt_source, $sagepay_key);
$crypt_source
在所有情况下都有效且(大致)相同:
VendorTxCode=20150721020857Deannatest&VendorData=Deanna test&Amount=1&Currency=GBP&Description=Quote Reference Deanna test&BillingSurname=Earley&BillingFirstnames=Deanna&BillingAddress1.....
查看加密密码,太短了一个字符。我通过在末尾添加 'X'(大写)对其进行了更新,因此只需相应地更新您的值即可。
我已经试过了,现在可以了。
我假设您使用的密码以“3Gd”开头(如果不知道请告诉我)。