我正在编写一个PHP函数,该函数接受一个$_GET参数数组,并输出这些参数的SHA签名(用秘密腌制)来验证真实性。
目前看起来是这样的:
private function generateShasign($fields) {
unset($fields['SHASIGN']);
ksort($fields, SORT_NATURAL | SORT_FLAG_CASE);
$phrase = "";
foreach($fields as $key => $field){
// if(!empty($field) && $field != '0'){
$phrase .= strtoupper($key) . '=' . $field . 'SECRETSALT';
// }
}
return strtoupper(sha1($phrase));
}
它从请求中取消设置SHA-SIGNATURE参数,将它们放在"KEY=value.CSECRETSALT"格式中,并对它们进行排序(使用ksort())
现在,这在我当地的环境中非常有效。返回的SHA等于get请求中的SHA-var,一切正常。
然而,在远程测试服务器上,它不起作用。Ksort似乎根本没有排序。并且它不会抛出错误。
快速print_r($phrase)返回(在有故障的远程服务器上):
SHA SIGN: ORDERID=ge9xBpZjXSECRETSALTCURRENCY=EURSECRETSALTAMOUNT=50SECRETSALTPM=CreditCardSECRETSALTACCEPTANCE=test123SECRETSALTSTATUS=5SECRETSALTCARDNO=XXXXXXXXXXXX1111SECRETSALTED=0214SECRETSALTCN=MATTHIASSECRETSALTTRXDATE=02/22/14SECRETSALTPAYID=28345877SECRETSALTNCERROR=0SECRETSALTBRAND=VISASECRETSALTIP=84.198.21.23SECRETSALT7F0B539A1DECC55E57860DEB9F7B3A301E1960AD
以及适当的工作环境:
ACCEPTANCE=test123SECRETSALTAMOUNT=50SECRETSALTBRAND=VISASECRETSALTCARDNO=XXXXXXXXXXXX1111SECRETSALTCN=MATTHIASSECRETSALTCURRENCY=EURSECRETSALTED=0214SECRETSALTIP=84.198.21.23SECRETSALTNCERROR=0SECRETSALTORDERID=iXAVBM1SBSECRETSALTPAYID=28345882SECRETSALTPM=CreditCardSECRETSALTSTATUS=5SECRETSALTTRXDATE=02/22/14SECRETSALT
显然,ksort()并没有对远程环境中的任何内容进行排序。因此,为什么要sha编码的短语中的参数顺序与GET请求中的顺序完全相同。
为什么ksort()不起作用并且没有抛出错误一直困扰着我。
在本地,我运行的是PHP/5.4.22(Apache)。和远程i-相信-PHP 5.3(NGINX)
更新:
ksort返回false。但我不明白为什么会失败。
非常感谢您的帮助!
开始:
http://php.net/ChangeLog-5.php#5.4.0
Added support for SORT_NATURAL and SORT_FLAG_CASE in array sort functions (sort, rsort, ksort, krsort, asort, arsort and array_multisort).
SORT_NATURAL和SORT_FLAG_CASE在远程环境中不工作。出于其他原因,我不知道。然而,SORT_STRING正在运行。因此,我通过先将键转换为大写,然后使用SORT_STRING进行排序来解决我的问题。
虽然不能解决问题,但我想这是一个可行的解决办法。