JSON在PHP中返回Null

时间:2012-10-13 03:24:40

标签: php json

这是我有的两个脚本

脚本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值,因此无法通过签名块。

根据Google Chrome的Dev Tools,当我尝试从他们的服务器测试脚本时,它发送的响应是{"error":"The start uri returned a non-200 response."},这是它给我的所有信息,它没有说明发送的是什么,只是收到了< / p>

有没有办法可以自己测试一下?或者这个脚本中是否有一个我可能刚看过的简单错误?

修改

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

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

起初有斜杠,所以我将stripslashes()添加到$json变量,这显然摆脱了斜线,但一旦它到达json_decode()它就不会提取信息传递的信息有问题吗?

4 个答案:

答案 0 :(得分:1)

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

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

您是要尝试连接还是添加?

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

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

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

答案 1 :(得分: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
}

答案 2 :(得分:0)

看起来($ json + $ secret)搞乱了你的数据结构。尝试$ json ['secret'] = NUM​​BER或$ json-&gt; secret = NUM​​BER

答案 3 :(得分:0)

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

$_POST['payload'] 已经是数组,您无需对其进行解码。只需使用var_dump($_POST)进行检查即可。

例如,数据由外部网站发送,如下所示:javascript:

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

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

});