我正在使用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_decode时,双值6.0,0.00等被截断为整数(6,0等)。这会弄乱字符串(就没有生成正确的SHA1-hash而言)。请注意,我不能使用深度限制来阻止解密通知分支,因为我需要支持PHP 5.0。我该如何解决这个问题。我写的(缺陷)验证码是:
public function IPN_Check(){
$o = (json_decode($this->test_ipn));
$validation_string = json_encode($o->notification);
}
答案 0 :(得分:1)
我尝试了以下内容:
<?php
var_dump(json_decode('
{
"notification":{
"version":6.0,
"attemptCount":0
}
}
'));
得到了这个输出:
object(stdClass)#1 (1) {
["notification"]=>
object(stdClass)#2 (2) {
["version"]=>
float(6)
["attemptCount"]=>
int(0)
}
}
PHP确实在float和int之间有所区别,也许你可以做gettype($o->notification[$i]) == 'float'
之类的事情来检查你需要使用字符串添加零。
答案 1 :(得分:0)
它看起来像ClickBank,它们总是以相同的格式发送它,只有两个顶级字段&#34; notification&#34;和&#34;验证&#34;。因此,您只需使用substr
从原始JSON中删除前16个字符({"notification":
)和最后27个字符(,"verification":"XXXXXXXX"}
),然后从那里继续:
$notification = substr($json, 16, -27);
$verification = strtoupper( substr( hash('sha1', $notification . $secret), 0, 8) );