【发布时间】:2015-07-21 01:17:28
【问题描述】:
类似于this question,我已经迁移了一个站点以使用 VPS 协议 3.00。
我已经使用测试加密密钥对测试站点进行了测试,并且一切正常。当我将其切换为使用带有实时加密密钥的实时站点时,我得到了可怕的3045 : The Currency field is missing 错误。
在使用 VPS 协议 2.22 时,相同的加密密钥在实时站点上有效,但在切换到 3.00 时无效。
我还将发布数据提供给一个解密脚本,该脚本使用相同的密钥解密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.....
【问题讨论】:
-
如果需要,我可以授予对测试站点的访问权限并演示所有组合。
-
如果您能提供供应商名称,我可以为您调查...