簡體   English   中英

json_decode保存類型

[英]json_decode Preservation of Type

我正在使用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);
  }

我嘗試了以下方法:

<?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參數一起使用,所有的float / double類型都將正確保存。

看起來ClickBank似乎總是以相同的格式發送,只有兩個頂級字段“ notification”和“ verification”。 因此,您可以使用substr從原始JSON中刪除前16個字符( {"notification": substr和后27個字符( ,"verification":"XXXXXXXX"} ),然后從那里開始:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM