0

ここに私が持っている2つのスクリプトがあります

スクリプト 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 の専門家ではないので、ここで何が起こっているのかわかりません。情報は次のような情報を送信する外部の Web サイトからのものであるため、実際にテストする方法はありません。

{
  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."}、それが私に提供するすべての情報であり、送信されているものは記載されておらず、受信されているだけです

自分でテストする方法はありますか?または、このスクリプトに単純なエラーがありますか?

編集

渡される情報を書き込むファイルを設定しました。これがサーバーから送信されているものです

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

最初はスラッシュがあったので、変数に追加stripslashes()したところ$json、明らかにスラッシュが取り除かれましたが、ヒットするjson_decode()と情報がプルされず、渡される情報に何か問題がありますか?

4

4 に答える 4

1

この回答は完全に編集されています

必要なのは、POSTリクエストを介して送信されたJSONデータを取得し、ペイロードと秘密鍵を使用して署名を検証することです。JSONは生のHTTPPOSTデータとして提供されるため(これが正しい用語かどうかはわかりません)、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 に答える
1

JSON を検証しようとすると、次のエラーが表示されます。

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

そして、連結または追加しようとしていますか?

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

連結の場合は、PHP の連結演算子である+as.に置き換えます。.

if(sha1($json . $secret) == $_POST['signature'])
于 2012-10-13T03:28:56.663 に答える
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 に答える