Php 类型的json_解码保存
我正在使用json_decode函数进行解码(并验证来自支付处理器的回发)。接收到的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
{
"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) );