1

我正在使用 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 哈希而言)。请注意,我不能使用深度限制来阻止通知分支的解码,因为我需要支持 PHP 5.0。我该如何解决这个问题。我写的(缺陷)验证代码是:

  public function IPN_Check(){
    $o = (json_decode($this->test_ipn));
    $validation_string = json_encode($o->notification);
  }
4

2 回答 2

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'来检查你是否需要使用字符串添加一个零。

UPD。 PHP 确实会在 float 和 int 之间产生差异,但json_encode()- 可能不会。可以肯定的是,您按原样对所有值进行编码 -json_encode()JSON_PRESERVE_ZERO_FRACTION参数一起使用,并且您的所有浮点/双精度类型都将正确保存。

于 2014-08-29T13:08:46.820 回答
0

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

$notification = substr($json, 16, -27);
$verification = strtoupper( substr( hash('sha1', $notification . $secret), 0, 8) );
于 2014-08-29T14:16:33.203 回答