用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。
-
请检查引号是否因为魔术引号标志而未被转义。
如果这两项检查不能解决您的问题,那么为了找出数据是什么样的,您应该在解码之前和之后回显或打印您的数据,以了解数据如何被接收和处理。