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); |