php微信扫码支付异步回调时$_POST为空

框架thinkphp5
支付用插件EasyWeChat
微信异步回调时本应存放了一个xml的$_POST是空的,却能这样file_get_contents('php://input')获得xml。
图片描述

阅读 6.7k
4 个回答

因为PHP默认只识别application/x-www.form-urlencoded标准的数据类型,
对text/xml的内容无法解析为$_POST数组,
所以只能用file_get_contents('php://input')获取原始数据流

文档
图片描述


这个回答很棒了,我就基于次编辑一下做个补充,为什么不支持 $_POST

首页 PHP 获取到的数据都在 php://input ,但是里面的收是原始数据(RAW)。

$_POST 本质上是提供了一个快捷获取通道,把原始数据给转成了数组,但是不是所有原始数据都会被转成数组形式的

目前支持的是 application/x-www-form-urlencodedmultipart/form-data-encoded。这两者是是必须被 client 支持的最基本的数据交互类型。所以 PHP 对他们做了支持,但并不代表 PHP 不能做到支持其他数据类型转换,只是投入产出不太合适(如果需求强烈可以去给官方组提需求或者自己实现一波?)。

$data = trim(file_get_contents('php://input'));
$xml = simplexml_load_string($data);

$xml 是一个 SimpleXMLElement 对象

不是很清除,猜测是:微信回调,发起一个POST请求到你的服务器,POST的内容是XML格式,你接收这个内容做处理,接收不到,应该是姿势不对,呵呵。

xml格式要用php的输入流 //input获取

因为微信通知是raw模式而不是form-data模式,必须要用获取raw来获取xml字符串。。。一般现在就算自己开发的接口很多也直接传json字符串,不采用表单

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题