2011-11-14 51 views
3

我試圖複製生成簽名哈希與API通信的方法,有麻煩重現基於c#方法示例的PHP中的相同示例結果我被給了。試圖創建api的C#簽名哈希方法的PHP

字問題的版本我試圖做的是:(從API文檔)

計算請求籤名

的請求籤名,與SHA-1散列碼的HMAC,通過按順序連接服務,方法和時間戳參數的值,然後使用祕密訪問密鑰作爲「密鑰」計算符合RFC 2104的HMAC來計算。所計算的HMAC值必須Base64編碼

測試數據:

service_name = 「Zoyto Fulfillment Service」 
timestamp: 「2010-07-21T04:33:55Z」 
api_secret = 「2c0774063f4bb1a10ca39ba6c806636a57d78dc3」 
method = 「getOrderStatus」 

Result should be: 
signature: 「mlePFDcrTAxd+PWA6hOGGtvu2Zc=」 

我有交流#方法的下面的代碼例如用於創建簽名散列作出API調用:

public string createSignature(string api_secret, string method, string timestamp, string service_name) { 
    DateTime currentTime = DateTime.UtcNow; string toSign = service_name.ToLower() + method.ToLower() + timestamp.ToLower(); 
    byte[] toSignBytes = Encoding.UTF8.GetBytes(toSign); byte[] secretBytes = Encoding.UTF8.GetBytes(api_secret); 
    HMAC signer = new HMACSHA1(secretBytes byte[] sigBytes = signer.ComputeHash(toSignBytes); 
    string signature = Convert.ToBase64String(sigBytes); 
    return signature; 
} 

目前,我的PHP方法是這樣的:

$testSecret = '2c0774063f4bb1a10ca39ba6c806636a57d78dc3'; 
$testSvc = 'Zoyto Fulfillment Service'; 
$testStamp = strtotime('2010-07-21 04:33:55'); 
$method = 'getOrderStatus'; 

$sig = utf8_encode($testSvc.$method.$testStamp); 

$hash = hash_hmac("sha1", $sig, $testSecret, true); 

$sig = base64_encode($hash); 
return $sig; 

//returns: 
//OUhgiIqxngaFm1Rquxm1lZ/3CzE= 

任何幫助表示讚賞

+0

C#代碼對第四行語法錯誤。如果您可以先解決這個問題,我可以幫助您使用PHP代碼。 –

回答

1

我不確定你從哪裏得到那個C#代碼,但它不起作用。這個PHP代碼將爲您提供給定的輸入所需的輸入。

function createSignature($api_secret, $method, $timestamp, $service_name) { 
    $toSign = strtolower($service_name) . strtolower($method) . strtolower($timestamp); 
    $sig = hash_hmac('sha1', $toSign, $api_secret, true); 
    return base64_encode($sig); 
} 

$api_secret = '2c0774063f4bb1a10ca39ba6c806636a57d78dc3'; 
$method = 'getOrderStatus'; 
$timestamp = '2010-07-21T04:33:55Z'; 
$service_name = 'Zoyto Fulfillment Service'; 

echo createSignature($api_secret, $method, $timestamp, $service_name); 
// output: mlePFDcrTAxd+PWA6hOGGtvu2Zc= 

注意:需要PHP 5> = 5.1.2或PECL散列> = 1.1

+0

廢話,我正在傳遞unix時間戳到散列而不是日期字符串。謝啦 – dorkass