用PHP接收JSON POST

我试图在支付界面网站上收到JSON POST,但我无法解码。

当我打印时:

echo $_POST; 

我得到:

 Array 

当我尝试这个时,我什么也得不到:

 if ( $_POST ) { foreach ( $_POST as $key => $value ) { echo "llave: ".$key."- Valor:".$value."<br />"; } } 

当我尝试这个时,我什么也得不到:

 $string = $_POST['operation']; $var = json_decode($string); echo $var; 

当我尝试这个时,我得到NULL:

 $data = json_decode( file_get_contents('php://input') ); var_dump( $data->operation ); 

当我这样做时:

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

我得到:

 NULL 

JSON格式是(根据付款网站文件):

 { "operacion": { "tok": "[generated token]", "shop_id": "12313", "respuesta": "S", "respuesta_details": "respuesta S", "extended_respuesta_description": "respuesta extendida", "moneda": "PYG", "monto": "10100.00", "authorization_number": "123456", "ticket_number": "123456789123456", "response_code": "00", "response_description": "Transacción aprobada.", "security_information": { "customer_ip": "123.123.123.123", "card_source": "I", "card_country": "Croacia", "version": "0.3", "risk_index": "0" } } } 

付款网站日志说,一切正常。 有什么问题?

尝试;

 $data = json_decode(file_get_contents('php://input'), true); print_r($data); echo $data["operacion"]; 

从你的json和你的代码,看起来你已经在你的末端拼写正确的单词操作 ,但它不是在json中。

编辑

也许还值得尝试从php://输入中回显json字符串。

 echo file_get_contents('php://input'); 

使用$HTTP_RAW_POST_DATA而不是$_POST

它会给你的POST数据。

稍后您将能够使用json_decode()对其进行解码。

如果您已经将参数设置为$ _POST ['eg'],并且您不希望更改它,则可以这样做:

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

这样可以节省您将所有$ _POST更改为其他内容的麻烦,并且如果您希望取消此线路,则仍然可以发出正常的发帖请求。

值得指出的是,如果你使用json_decode(file_get_contents("php://input")) (正如其他人所说的那样),如果字符串不是有效的JSON,将会失败。

这可以通过首先检查JSON是否有效来解决。 即

 function isValidJSON($str) { json_decode($str); return json_last_error() == JSON_ERROR_NONE; } $json_params = file_get_contents("php://input"); if (strlen($json_params) > 0 && isValidJSON($json_params)) $decoded_params = json_decode($json_params); 

编辑:请注意,删除上面的strlen($json_params)可能会导致微妙的错误,因为json_last_error()null或空白字符串传递时不会更改,如下所示: http : //ideone.com/va3u8U

阅读文档:

一般来说,应该使用php://输入来代替$ HTTP_RAW_POST_DATA。

如在PHP手册

使用php://输入可能会有所帮助,但是对我来说并不奏效,下面是做了什么:

  • 检查数据的编码。 如果是URLEncoded,确保它被发送URLEncoded。

  • 请检查引号是否因为魔术引号标志而未被转义。

如果这两项检查不能解决您的问题,那么为了找出数据是什么样的,您应该在解码之前和之后回显或打印您的数据,以了解数据如何被接收和处理。