1

问题

我正在尝试在 PHP 中复制以下 C# 代码。这是一个 API 的示例代码,我需要使用 PHP5 进行交互。

string key = "9c132d31-6a30-4cac-8d8b-8a1970834799";
int developerId = 2;
string url = "/v2/mode/2/line/787/stops-for-line";

// add developer id
url = string.Format("{0}{1}devid={2}",url,url.Contains("?") ? "&" : "?",developerId);
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
// encode key
byte[] keyBytes = encoding.GetBytes(key);
// encode url
byte[] urlBytes = encoding.GetBytes(url);
byte[] tokenBytes = new System.Security.Cryptography.HMACSHA1(keyBytes).ComputeHash(urlBytes);
var sb = new System.Text.StringBuilder();
// convert signature to string
Array.ForEach<byte>(tokenBytes, x => sb.Append (x.ToString("X2")));
// add signature to url
url = string.Format("{0}&signature={1}",url,sb.ToString());

// extra code to add base URL – the resultant url should be:
//  base URL . /v2/mode/2/line/787/stops-for-line?devid=2&signature=D5474F344CDAA7B92F2253169F6C1D66C1A15001

我从中得到的是hmac_hash('sha1','/v2/mode/2/line/787/stops-for-line?devid=2','/v2/mode/2/line/787/stops-for-line?devid=2')需要输出D5474F344CDAA7B92F2253169F6C1D66C1A15001

尝试的解决方案

通读代码后,我找不到任何可能暗示非标准哈希例程的明显内容,因此我采用了以下方法:

$devID = 2;
$key = '9c132d31-6a30-4cac-8d8b-8a1970834799';
$url = '/v2/mode/2/line/787/stops-for-line?devid=' . $devID;

$my_sign = hash_hmac('sha1', $url, $key, false);

但是,这给出1fd3ac2ec7fe0ea39d7d5ef44a23b89aa7974b41了哈希值,这显然是不正确的。我读过 base64 解码密钥并对生成的哈希进行编码有时可能是诀窍,但遗憾的是事实并非如此。您可以指出我的任何资源或代码示例将不胜感激。

4

0 回答 0