在查询字符串中创建十六进制字符串

时间:2015-09-29 07:39:50

标签: php bash sha

我需要创建一个具有以下结构的查询字符串: https://api.company.com/api/hello.json?app_id= $名称&安培;散列=散列$

$ hash变量应该是当前挑战字符串与我的客户端密钥连接的SHA1。

我通过运行以下bash脚本(这给了我正确的响应)在控制台中测试了我的api凭据

$ challenge=$(curl -s "http://www.company.com/api/hello.json?app_id=$name" | head -1 | sed 's/.*"challenge": *"\([0-9]*\)".*/\1/')
$ hash=$(printf $challenge$key | openssl dgst -sha1 | sed 's/^.*\([a-f0-9]\{40\}\).*$/\1/')
$ curl "http://www.company.com/api/hello.json?app_id=$name&hash=$hash"

但是,当我尝试使用PHP以编程方式重新创建$ hash变量时,由于错误的哈希参数,身份验证失败。

要创建我使用的$ hash参数:

$hash = sha1($challenge . $key);

但显然我在这里遗漏了一些东西。我假设bash脚本中的表达式:

a-f0-9]\{40\}\).*$/\1/

检查字符串是否是40个字符的十六进制字符串,但我不确定如何将其集成到我的PHP代码中。

如果我在控制台中检查$ challenge变量的值,我会得到9位数字值,如:244971205,而我的PHP脚本中的同一个变量有一个字符串值。这可能是我的$ hash参数格式不正确的原因吗?

值得注意的是,如果我使用运行

得到的$ hash变量值
echo "$hash"

在我的查询字符串中直接在控制台中api调用成功,但我希望以编程方式获得相同的值。

如果有人能指出我正确的方向,我将非常感激。

1 个答案:

答案 0 :(得分:0)

原来我过于复杂了。为了获得$challenge变量的正确值,我实际需要做的是用json_decode解析JSON数据,之后只需访问保存数值的属性,如{{1} }}