使用PHP和SHA1处理JSON POST请求

时间:2012-02-23 22:10:38

标签: php ruby json post sha1

所以我使用REST API,API以JSON格式向我的服务器发出POST请求。以下是它发送的信息:

info: {
id: "9890dsds8",
number: 5,
amount: 33
},
sig: "8jhjbhb78979899h"

sig是info的SHA1签名,这应该用于验证帖子。例如,我们可以在Ruby中验证信息(如他们的示例中所示):

require 'json'
require 'cgi'
require 'digest/sha1'

key = "some_key"
params = CGI::parse(post_body)
digest = Digest::SHA1.hexdigest(params["info"]+key)

if digest == params["sig"]
# Valid signature
info = JSON.parse(params["info"])
# Respond with status code 200 and some unique_id
else
# Invalid signature. You should response with a non-200 response code.
end

unique_id必须是长度不超过50个字符的UTF8字符串,并且应该是响应正文的唯一内容。

虽然我完全能够理解正在发生的事情,但我并不能完全弄清楚一切。大多数情况下,可能是因为它在Ruby中。

有人可以帮我解决如何在PHP中执行此操作的问题吗?我无法在PHP中处理此JSON POST请求。 PHP片段的PHP转换版本将非常受欢迎。我也不确定,如何处理PHP中的SHA1方面,需要什么特殊知识?

非常感谢!!

1 个答案:

答案 0 :(得分:2)

我认为API会填充"响应" POST数组中的变量。

然后:

//Get the JSON string
$json_string = $_POST['response'];

//Decode JSON string to array
$decoded = json_decode($json_string);

//Calculate SHA1 (I am not sure how ruby is concatenating a string with an array, so I will just convert the array to string using implode).
$key = 'somekey';
$hash = sha1(implode("",$decoded['info']) . $key);

if($hash == $decoded['sig']){
 //OK!
}else{
 //Not OK!
}