2014-02-22 23 views
0

我正在寫一個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」格式,並對其排序(使用kso​​rt())

現在,這對我的本地環境非常有效,返回的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。不知道爲什麼它失敗了。

任何幫助,非常感謝!

+0

你一定錯誤報告被關在遠程服務器上?通過添加'ini_set('display_errors','1')來測試。 error_reporting(E_ALL);' –

+1

這不是ksort的問題。您的「故障」服務器正在輸入不同的數據。你需要做一個'var_dump($ fields)',然後跟蹤數據來自哪裏。 –

+1

有點偏離主題,但您應該考慮使用與您在生產環境中使用的相同版本的軟件。如果您的現場服務器使用PHP 5.3,則應該使用PHP 5.3進行開發。這避免了很多問題。最好的方法是使用[Vagrant](http://www.vagrantup.com/)。你可以使用[PuPHPet](https:// puphpet。com /)來生成配置。 – ragol

回答

1

這裏,我們去:

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).

+0

呵呵,我實際上在文檔中讀了幾行......被「(PHP 4,PHP 5)」標誌弄糊塗了Ksort()頭。謝謝! – matthiasdv

0

SORT_NATURAL和SORT_FLAG_CASE在遠程環境中不起作用。因爲天氣原因,我不知道。 SORT_STRING然而工作。所以我解決了我的問題,先將鍵轉換爲大寫,然後使用SORT_STRING進行排序。

不解決問題,但它是一個可行的解決方法,我猜。

相關問題