post接收xml格式数据

当粉丝使用微信, 向公众号发送一条消息时, 微信服务器会主动向开发者服务器发送一个请求. 并携带粉丝发送的消息. ( 以 post 的方式发送 xml 数据 )

$_POST 并不能接受所有以 post 方式发送的请求数据, $_POST 是用来接受 application/x-www-form-urlencoded 类型的请求类型.

application/x-www-form-urlencoded 类型的请求数据的格式 : key=val&key1=val1

而微信向我们开发者服务器发送的请求是 xml 格式, 显然就不是 application/x-www-form-urlencoded 类型. 所以使用$_POST 就不能获取到数据.

使用 php://input 来获取数据.

php 中使用 php://input 来获取内容, php://input 是一个只读信息流, 当请求方式是 post 的 enctype=”multipart/form-data” 的时候 php://input 是无效的。

和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。

获取 xml 数据:

1
$data = file_get_contents('php://input');

这个$data 就是 xml 格式的数据, 要获取其中的数据(ToUserName、CreateTime、MsgType…), 就要把 xml 进行解析。php 提供了 simplexml_load_string 函数, 将 xml 解析成对象格式的数据,作用类似于 json_decode.

使用 simplexml_load_string 将 xml 转成 php 对象:

1
$xml_obj = simplexml_load_string($data);