2012-05-08 3 views
1

У меня есть json from stripe, и я пытаюсь его декодировать json_decode.декодирование stripe json с json_decode не работает

Я не получаю сообщение об ошибке. Просто ничего не возвращается. Я получаю данные обратно из полосы, я просто не могу его декодировать.

{ 
    "created":1326853478, 
    "data":{ 
     "object":{ 
     "amount":4500, 
     "card":{ 
      "country":"US", 
      "cvc_check":"pass", 
      "exp_month":7, 
      "exp_year":2014, 
      "fingerprint":"9aQtfsI8a17zjEZd", 
      "id":"cc_00000000000000", 
      "last4":"9782", 
      "object":"card", 
      "type":"Visa" 
     }, 
     "created":1322700852, 
     "currency":"usd", 
     "disputed":false, 
     "fee":0, 
     "id":"ch_00000000000000", 
     "livemode":false, 
     "object":"charge", 
     "paid":true, 
     "refunded":true 
     } 
    }, 
    "id":"evt_00000000000000", 
    "livemode":false, 
    "type":"charge.refunded" 
} 

// retrieve the request's body and parse it as JSON 
$body = @file_get_contents('php://input'); 

$event_json = json_decode($body,true); 
print_r($event_json); 

Любые идеи?

+5

Да. Удалите символ, который скрывает любые сообщения об ошибках. –

+0

Igancio ссылается на символ '@'. – Hamish

+0

Также проверьте с помощью 'json_last_error()' и/или http://jsonlint.com/, у вас может быть спецификация UTF-8 там или еще что-то. – mario

ответ

1

Вот, я побежал это:

<?php 
    $data = '{ "created": 1326853478, "data": { "object": { "amount": 4500, "card": { "country": "US", "cvc_check": "pass", "exp_month": 7, "exp_year": 2014, "fingerprint": "9aQtfsI8a17zjEZd", "id": "cc_00000000000000", "last4": "9782", "object": "card", "type": "Visa" }, "created": 1322700852, "currency": "usd", "disputed": false, "fee": 0, "id": "ch_00000000000000", "livemode": false, "object": "charge", "paid": true, "refunded": true } }, "id": "evt_00000000000000", "livemode": false, "type": "charge.refunded" }'; 

    $arr = json_decode($data, true); 

    print_r($arr); 

?> 

И это сработало. Таким образом, теоретически вы должны быть в состоянии использовать:

<?php 

    $arr = json_decode(file_get_contents('php://input'), true); 

    print_r($arr); 

?> 

Как сказал Ignacio Vazquez-Abrams, не используйте символ «@», потому что он скрывает сообщения об ошибках и делает его более трудным для отладки.

Я также хотел бы проверить, какая у вас версия PHP. json_decode() доступен только в версии 5.2.0 и более поздних версиях.

1

Поток php://input позволяет считывать необработанные данные с тела запроса. Эти данные будут представлять собой строку, и в зависимости от того, каких значений в запросе, будет выглядеть примерно так:

"name=ok&submit=submit" 

Это не JSON и, следовательно, не будет распознаваться, как JSON так, как вы expect.The json_decode() функция возвращает null если он не может быть расшифрован.

Куда вы с JSON вы разместили выше? Это значение, которое нужно передать в json_decode().

Если JSON передается в запросе, как в случае обратных вызовов, вам все равно придется разбирать эту порцию, чтобы получить только JSON. Если поток php://input дает вам name = ok & submit = submit & json = {"created": 1326853478}, тогда вам придется разбирать его. Вы можете использовать this function из PHP инструкции для того чтобы отделить значения для работы как $_POST массива:

<?php 
    // Function to fix up PHP's messing up POST input containing dots, etc. 
    function getRealPOST() { 
     $pairs = explode("&", file_get_contents("php://input")); 
     $vars = array(); 
     foreach ($pairs as $pair) { 
     $nv = explode("=", $pair); 
     $name = urldecode($nv[0]); 
     $value = urldecode($nv[1]); 
     $vars[$name] = $value; 
     } 
     return $vars; 
    } 
?> 

Чтобы использовать его:

$post = getRealPOST(); 
$stripe_json = $post['json']; 
$event_json = json_decode($stripe_json);