Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON在PHP中返回Null_Php_Json - Fatal编程技术网

JSON在PHP中返回Null

JSON在PHP中返回Null,php,json,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, $fi

这是我的两个脚本

脚本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 {

}
?>
该站点允许我测试脚本,但由于json_decode提供空值,它将无法通过签名块

根据Google Chrome的开发工具,当我试图从他们的服务器测试脚本时,它发送的响应是
{“error”:“start uri返回了一个非200响应。”}
这是它提供给我的所有信息,它没有说明正在发送什么,只是收到了什么

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

编辑

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

{"job_id":1337,"job_title":"CrowdFlower test job","amount":30,"uid":"inspire","adjusted_amount":50}
起初有斜杠,所以我在
$json
变量中添加了
stripslashes()
,这显然消除了斜杠,但一旦它点击
json\u decode()
它就不会提取信息,传递的信息是否有问题?

当我尝试删除你的json时,我得到以下错误:

Parse error on line 1:
{    payload: {        u
-----^
Expecting 'STRING', '}'
您是在尝试连接还是添加

if(sha1($json+$secret) == $_POST['signature'])
如果是串联,则将
+
替换为
,因为
是PHP中的串联运算符

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

看起来($json+$secret)正在破坏您的数据结构。试试$json['secret']=NUMBER或$json->secret=NUMBER,这取决于外部站点发送数据的方式,但我猜是这样的

$\u POST['payload']
已经是一个数组,您不需要解码它。只需使用
var\u dump($\u POST)
进行检查

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

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

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

});

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

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

$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
}

尝试从以下内容开始:var\u dump($\u POST);另外,有效的json使用字符串作为属性名称。您能显示用于请求服务器响应的代码吗?@budwiser所有这些都是自动的,这是针对Crowd Flower的,当用户完成任务时,他们的服务器发送信息,我的服务器只接受它。这就是为什么我弄不明白的原因。@kira423在使用
stripslashes
之前,你能做一个
var\u转储($json)
,然后将输出添加到你的问题中吗?@budwiser它不返回任何内容,它不向文本文件添加任何文本。不幸的是使用
var\u转储($\u POST)
将不起作用,因为当我将其添加到脚本中并使用他们的站点对其进行测试时,它告诉我脚本生成的不是200 OK响应。我尝试将
$obj['uid']
更改为
$\u POST['uid']
,但它在数据库中仍然显示为空白,因此我不确定如何检查它。这只是他们在API文档中显示的一个简短示例,因此我不确定它是否显示了他们使用的整个代码。好的,让我们开始实际操作。你从他们的服务器上得到的输出是什么?我听起来像个白痴,但我怎么知道呢,它在我的访问日志中没有显示这些信息。哈哈,别担心,你是新手,所以你可以原谅。您可以通过Firefox中的Firebug的网络选项卡或Chrome开发者工具中的网络选项卡进行检查。您使用的是哪种浏览器?@kira423按F12,您将在底部看到一个小屏幕。单击
网络
。现在尝试加载页面,网络中将出现一个活动。点击它。得到回应。把它贴在问题上。你知道我也这么想,但这个脚本是直接从他们那里来的,所以我没有再考虑它,但鉴于它不起作用,我应该在问题一开始就改变它,但由于它没有得到信息,在其他一切都得到解决之前,它不会有任何帮助,谢谢你提醒我。
var data = {
  payload: {
    uid: "900af657a65e",
    amount: 50,
    adjusted_amount: 25
  },
  signature: "4dd0f5da77ecaf88628967bbd91d9506"
};

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

});
$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
}