我正在寫一個PHP函數,它需要一個$ _GET參數的數組,並且將這些SHA的簽名(用祕密醃製)吐出來驗證真實性。PHP ksort()函數在遠程服務器上根本沒有排序。拋出沒有錯誤
目前,它看起來像這樣:
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.SECRETSALT」格式,並對其排序(使用ksort())
現在,這對我的本地環境非常有效,返回的SHA等於獲取請求中的SHA var,並且一切順利。完全排序,它不會拋出錯誤河
快速的print_r($短語)返回(故障遠程服務器上):
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()不選什麼在遠程環境中。因此,爲什麼要編碼的短語中的參數順序與GET請求中的順序完全相同。
爲什麼ksort()不能正常工作並且不會拋出錯誤令我困惑不已。
本地我運行PHP/5.4.22(Apache)。而遠程我-believe- PHP 5.3(NGINX)
UPDATE:
ksort返回false。不知道爲什麼它失敗了。
任何幫助,非常感謝!
你一定錯誤報告被關在遠程服務器上?通過添加'ini_set('display_errors','1')來測試。 error_reporting(E_ALL);' –
這不是ksort的問題。您的「故障」服務器正在輸入不同的數據。你需要做一個'var_dump($ fields)',然後跟蹤數據來自哪裏。 –
有點偏離主題,但您應該考慮使用與您在生產環境中使用的相同版本的軟件。如果您的現場服務器使用PHP 5.3,則應該使用PHP 5.3進行開發。這避免了很多問題。最好的方法是使用[Vagrant](http://www.vagrantup.com/)。你可以使用[PuPHPet](https:// puphpet。com /)來生成配置。 – ragol