0

这是我有的两个脚本

脚本 1:

  <?

include('config.php');
$json = $_POST['payload'];
$fine = var_dump($json);
$secret = "78f12668216b562a79d46b170dc59f695070e532";
$obj = json_decode($json, true);
$fp = fopen('data.txt', 'w');
fwrite($fp, $json);
fwrite($fp, $fine);
fclose($fp);

if(sha1($json . $secret) == $_POST['signature']) {
    $conversion_id = md5(($obj['amount']));
    echo "OK";
    echo $conversion_id;
    mysql_query("INSERT INTO completed (`id`,`uid`,`completedid`) VALUES ('','".$obj['uid']."','".$conversion_id."')");
} else {

}
?>

脚本 2:

<?
$json = $_POST['payload'];
$secret = "78f12668216b562a79d46b170dc59f695070e532";
$obj = json_decode($json);

if(sha1($json+$secret) == $_POST['signature']) {
    print "OK";
} else {

}
?>

这里的问题是它返回所有 NULL 值。我不是 JSON 专家,所以我不知道这里发生了什么。我真的无法测试它,因为信息来自外部网站,发送如下信息:

{
  payload: {
    uid: "900af657a65e",
    amount: 50,
    adjusted_amount: 25
  },
  signature: "4dd0f5da77ecaf88628967bbd91d9506"
}

该站点允许我测试脚本,但由于 json_decode 提供 NULL 值,它不会通过签名块。

根据谷歌浏览器的开发工具,当我尝试从他们的服务器测试脚本时它发送的响应是{"error":"The start uri returned a non-200 response."}它给我的所有信息,它没有说明正在发送的内容,只是收到

有什么方法可以让我自己测试吗?或者这个脚本中是否有我刚刚查看过的简单错误?

编辑

我设置了一个文件来写入正在传递的信息,这就是他们的服务器发送的信息

{"job_id":1337,"job_title":"CrowdFlower test job","amount":30,"uid":"inspire","adjusted_amount":50}

起初有斜线,所以我添加stripslashes()$json变量中,显然摆脱了斜线,但是一旦它击中json_decode()它就不会拉信息传递的信息有什么问题吗?

4

4 回答 4

1

当我尝试验证您的 JSON 时,我收到以下错误:

Parse error on line 1:
{    payload: {        u
-----^
Expecting 'STRING', '}'

您是要连接还是添加?

if(sha1($json+$secret) == $_POST['signature'])

如果是连接,将替换为+as..PHP 中的连接运算符。

if(sha1($json . $secret) == $_POST['signature'])
于 2012-10-13T03:28:56.663 回答
1

已对此答案进行了完整编辑

您需要做的是获取通过 POST 请求发送给您的 JSON 数据,并使用有效负载和密钥验证签名。JSON 是作为原始 HTTP POST 数据提供给您的(我不确定这是否是正确的术语),因此无法通过 PHP 的$_POST全局访问。所以这里是解决方案:

$myJSON = file_get_contents('php://input');

$decodedJSON = json_decode($myJSON);

if (sha1($decodedJSON['payload'] . $secret) == $decodedJSON['signature']) {
  /* 
     If you need to do some database actions or such prior to sending the 
     response 200, you can do it here. Just don't output anything to the 
     screen before.
  */
  header("HTTP/1.1 200 OK");
}
else {
  // sha1 test failed, do something else here
}
于 2012-10-13T03:39:23.517 回答
0

看起来 ($json+$secret) 正在弄乱您的数据结构。尝试 $json['secret'] = NUM​​BER 或 $json->secret = NUM​​BER

于 2012-10-13T03:30:17.347 回答
0

取决于外部站点如何发送数据,但我的猜测是

$_POST['payload'] 已经是一个数组,你不需要解码它。只是var_dump($_POST)用来检查它。

例如,数据是由外部站点使用 javascript 发送的,如下所示:

var data = {
  payload: {
    uid: "900af657a65e",
    amount: 50,
    adjusted_amount: 25
  },
  signature: "4dd0f5da77ecaf88628967bbd91d9506"
};

$.ajax({
  url: ....,
  data: data,
  //....

});
于 2012-10-13T03:31:38.963 回答