Php 类型的json_解码保存

Php 类型的json_解码保存,php,json,validation,clickbank,Php,Json,Validation,Clickbank,我正在使用json_decode函数进行解码(并验证来自支付处理器的回发)。接收到的json对象如下所示 { "notification":{ "version":6.0, "attemptCount":0, "role":"VENDOR", ..... "lineItems":[ { "itemNo":"1", "productTitle":"A passed i

我正在使用json_decode函数进行解码(并验证来自支付处理器的回发)。接收到的json对象如下所示

{
   "notification":{
      "version":6.0,
      "attemptCount":0,
      "role":"VENDOR",
      .....
      "lineItems":[
         {
            "itemNo":"1",
            "productTitle":"A passed in title",
            "shippable":false,
            "recurring":false,
            "customerProductAmount":1.00,
            "customerTaxAmount":0.00
         }
      ]
   },
   "verification":"9F6E504D"
}
验证工作如下:一个是获取通知节点并附加一个密钥。此字符串的SHA1哈希的前八个字符应与验证节点的内容匹配

但是,我注意到,在使用json_解码时,双精度值6.0、0.00等被截断为整数(6、0等)。这会弄乱字符串(因为它没有生成正确的SHA1哈希)。请注意,我不能使用深度限制来阻止对通知分支进行解码,因为我需要支持PHP5.0。我如何处理这个问题。我编写的(缺陷)验证代码是:

  public function IPN_Check(){
    $o = (json_decode($this->test_ipn));
    $validation_string = json_encode($o->notification);
  }
我尝试了以下方法:

<?php

var_dump(json_decode('
{
   "notification":{
      "version":6.0,
      "attemptCount":0
   }
}
'));
PHP确实对float和int有区别,也许您可以做一些类似于
gettype($o->notification[$i])==“float”
的操作来检查是否需要使用字符串添加零

UPD.
PHP确实对float和int有区别,但是
json\u encode()
-可能没有区别。可以肯定的是,您将所有值按原样进行编码-使用
json\u encode()
json\u PRESERVE\u ZERO\u FRACTION
参数,所有浮点/双精度类型都将正确保存。

看起来像是ClickBank,它们总是以相同的格式发送,只有两个顶级字段“通知”和“验证”。因此,您只需使用
substr
从原始JSON中删除前16个字符(
{“通知”:
)和最后27个字符(
,“验证”:“XXXXXXXX”}
),然后从那里继续:

$notification = substr($json, 16, -27);
$verification = strtoupper( substr( hash('sha1', $notification . $secret), 0, 8) );

你为什么需要
6.0
而不是
6
?我不认为有任何内置函数可以在JSON(或JSON字符串)中直接将double转换为int。恐怕您必须对JSON进行解码,解析数组以将相关值的双精度转换为整数,然后将其重新编码为JSON以匹配稍后的哈希检查。6给出与6不同的SHA1哈希进行验证。0@clement马莱特,应该是替身因为没有更好的方法,我只需要使用正则表达式来提取信息,然后对其进行SHA1以检查完整性。由于我看不到整个JSON,我无法建议实际的表达式,但您似乎需要介于
“通知”:
\n“验证”
之间的内容。而通常情况下,序列化是在php中存储数据类型的首选方式。Serialize是特定于PHP的,不输出json(据我所知)。我特别需要输出为json格式,以生成哈希。
$notification = substr($json, 16, -27);
$verification = strtoupper( substr( hash('sha1', $notification . $secret), 0, 8) );