使用PHP接收JSON POST

Pab*_*rez 268 php post json

我正在尝试在支付界面网站上收到JSON POST,但我无法对其进行解码.

当我打印:

echo $_POST;
Run Code Online (Sandbox Code Playgroud)

我明白了:

Array
Run Code Online (Sandbox Code Playgroud)

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

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

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

$string = $_POST['operation'];
$var = json_decode($string);
echo $var;
Run Code Online (Sandbox Code Playgroud)

我尝试这个时得到NULL:

$data = json_decode( file_get_contents('php://input') );
var_dump( $data->operation );
Run Code Online (Sandbox Code Playgroud)

当我做:

$data = json_decode(file_get_contents('php://input'), true);
var_dump($data);
Run Code Online (Sandbox Code Playgroud)

我明白了:

NULL
Run Code Online (Sandbox Code Playgroud)

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"
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

付款站点日志说一切正常.有什么问题?

小智 449

尝试;

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

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

编辑

也许还值得尝试回应来自php:// input的json字符串.

echo file_get_contents('php://input');
Run Code Online (Sandbox Code Playgroud)

  • 他的观点是他在两个地方都没有正确拼写,无论是操作还是两个地方的操作. (9认同)
  • 对于它的价值,operacion是西班牙语的拼写(给予或重音). (6认同)
  • 嗨在这两种情况下我都没有在屏幕上得到任 (2认同)
  • 在PHP 5.6之前,获取php://输入的内容只能进行一次.你的代码或框架可以在之前的某个地方打开它吗? (2认同)

Ste*_*han 77

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

$_POST = json_decode(file_get_contents('php://input'), true);
Run Code Online (Sandbox Code Playgroud)

这将节省您将所有$ _POST更改为其他内容的麻烦,并允许您仍然发出正常的帖子请求,如果您想要删除此行.


Xtr*_*ity 39

值得指出的是,如果你使用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);
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,除strlen($json_params)上述可能导致细微的错误,因为json_last_error()它不是在改变null或空字符串传递,如下所示: http://ideone.com/va3u8U

  • 如果有人期望输入中有相当多的数据和/或大量请求,他们可能希望扩展该函数以选择性地使用 json_decode 的结果填充提供的变量引用,以便解析不需要对格式良好的输入执行两次。 (3认同)
  • 这样,您实际上将json解码了两次。这太贵了。第一次解码时,您可以立即保存解码后的值,然后进行检查(json_last_error()== JSON_ERROR_NONE),然后在一切正常的情况下继续进行处理[否则失败] (2认同)

小智 37

用$HTTP_RAW_POST_DATA而不是$_POST.

它将按原样为您提供POST数据.

您可以json_decode()稍后使用它进行解码.

  • 由于现在折旧$ HTTP_RAW_POST_DATA,你可以用这种方式读取JSON POST` $ json = file_get_contents('php:// input'); $ obj = json_decode($ json);` (43认同)
  • 对我来说这个常见答案[使用$ json = file_get_contents('php:// input'); ]当JSON被发送到最外面的"容器字符"作为[]时,我看到没有工作.这里用RAW_POST_DATA的答案为我做了诀窍.我目前的PHP堆栈很好用.我被困了一段时间..非常感谢这个解决方案! (2认同)

Ena*_*que 16

你可以像下面这样使用..像下面这样发布 JSON

在此输入图像描述

从 php 项目用户获取数据如下

// takes raw data from the request 
$json = file_get_contents('php://input');
// Converts it into a PHP object 
$data = json_decode($json, true);

 echo $data['requestCode'];
 echo $data['mobileNo'];
 echo $data['password'];
Run Code Online (Sandbox Code Playgroud)


giu*_*ppe 11

阅读文档:

通常,应使用php://输入而不是$ HTTP_RAW_POST_DATA.

在php手册中

  • 警告此功能在PHP 5.6.0中已弃用,并且自PHP 7.0.0起已删除.=> http://php.net/manual/en/reserved.variables.httprawpostdata.php (3认同)
  • 现在链接已损坏 (2认同)

小智 9

$data = file_get_contents('php://input');
echo $data;
Run Code Online (Sandbox Code Playgroud)

这对我有用.


sif*_*_in 5

很晚了。
看来,(OP)已经尝试了所有给他的答案。
尽管如此,如果您 (OP) 没有收到传递给“.PHP”文件的内容,则错误可能是 URL 不正确。
检查您是否正在调用正确的“.PHP”文件。
(URL 中的拼写错误或大写字母)
和最重要的
检查您的 URL 在“http”之后是否有“s”(安全)。
例子:

"http://yourdomain.com/read_result.php"
Run Code Online (Sandbox Code Playgroud)

应该

"https://yourdomain.com/read_result.php"
Run Code Online (Sandbox Code Playgroud)

或者任何一种方式。
添加或删除“s”以匹配您的 URL。