所以我正在使用这个API并使用Laravel,我正在尝试构建一个auth字符串。这是我得到的文件,但我有一点麻烦,因为这对我来说是相对较新的东西
以下是身份验证说明:
身份验证参数是一个字符串,可以通过调用者或调用者可以选择将该值另存为参数以及连接ID和API密钥。
身份验证是HMAC SHA1散列的base64字符串。这是使用中的API密钥的二进制计算
##########################格式的所有小写和UTF8编码作为密钥和计算机的二进制上的HMAC SHA1散列#######################格式的连接ID,所有更低case和UTF8编码。
然后对结果二进制散列进行base64编码,文本结果为什么应该作为身份验证参数传递。在C#中的代码计算身份验证可能看起来像:
HMACSHA1 hmac = new HMACSHA1( UTF8Encoding.UTF8.GetBytes(apiKey.ToString("N").ToLower()) ); string authentication = Convert.ToBase64String( hmac.ComputeHash( UTF8Encoding.UTF8.GetBytes(connectionId.ToString("N").ToLower()) ) );
例如,以下凭据:
连接ID:
5fecbc200f0e4a7cbf41040e11047e56
API密钥:
2de51c4fd0f04b9fabeb95225e87da70
应导致计算出的身份验证值
m5/Vc1RzhUETQvEtx/JdIglQpTg=
所以我一直在尝试的是:
$a = strtolower('5fecbc200f0e4a7cbf41040e11047e56');
$b = strtolower('2de51c4fd0f04b9fabeb95225e87da70');
$z = hash_hmac("sha1", utf8_encode(decbin($b)), utf8_encode(decbin($a)), true);
dd(base64_encode($z));
哪个输出QjG3kzUs7U1UukNd++3t24pBWNk=
我尝试了更多的变体,但我只是对这一个迷失了方向。第一次真正解码或编码任何东西。非常感谢任何能帮助我解决这个问题的技巧、想法或片段。已经花了几个小时了,这让我很烦恼。
第一:去掉utf8_encode()
,通常不使用它。它假设输入字符串是ISO-88591-1,如果它是其他任何东西,它将静默地损坏数据。这个函数有一个令人难以置信的误导性名称,我甚至建议任何人都不应该使用它或相应的utf8_decode()
,它会以同样的方式破坏您的数据,但会反过来。
如果您需要在PHP中转换字符串编码,请使用显式定义输入和输出编码的东西,例如:mb_convert_encoding()
。[你仍然不需要它]
第二:无论你认为decbin()
做了什么,你都是错的。它将整数转换为由0
和1
字符组成的大写字符串。
第三:PHP字符串没有固有编码,如果你为了描述而扭曲我的手臂,它们大致相当于字节数组。你放入其中的字节就是你从中取出的字节。
第四:我不是C#专家[或中级,甚至是初学者],但那个示例代码太可怕了。N
在connectionId.ToString("N")
中的意义是什么?我找不到任何有关这方面的文件。
从简单开始,使用有意义的变量名,构建并阅读文档。
$connectionID = strtolower('5fecbc200f0e4a7cbf41040e11047e56');
$apiKey = strtolower('2de51c4fd0f04b9fabeb95225e87da70');
$hash = hash_hmac("sha1", $connectionID, $apiKey, true);
var_dump(base64_encode($hash));
输出:
string(28) "m5/Vc1RzhUETQvEtx/JdIglQpTg="