1. 前言
前两天在做微信支付这块,发现一直报 xml数据错误
最后经过打印发现没有获取到微信回调的xml数据。那么今天就在这里就做一下记录吧。
2. 问题及解决方案
微信demo代码如下:
public static function notify($callback, &$msg)
{
//获取通知的数据
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
//如果返回成功则验证签名
try {
$result = WxPayResults::Init($xml);
} catch (WxPayException $e){
$msg = $e->errorMessage();
return false;
}
return call_user_func($callback, $result);
}
经过在网上查询发现 php >= 5.6
的时候 HTTP_RAW_POST_DATA
被移除了。
但是 php = 5.6
可以在配置文件 php.ini
还能找到 always_populate_raw_post_data
选项。
当 php >= 7.0
就已经彻底移除了 always_populate_raw_post_data
配置。
-
php = 5.6
放开always_populate_raw_post_data = -1
配置(不建议这样做)
我当前PHP版本还是5.6,初始的配置文件always_populate_raw_post_data = -1
是被注释的,去掉前面的;
分号就行了。
但是再次运行你会发现报一个 warning 的错误,但程序还是会执行的。
自己写的程序怎么能允许出现 warning 级别的错误呢,notice 的级别错误都不应该出现的。 -
使用
get_file_contents(“php://input”)
方式。
$xml = get_file_contents("php://input");
var_dump($xml);
POST提交后端接收介绍
HTTP中的POST方式传递的数据类型是多种多样的,比如说 text/xml,soap等等
PHP默认情况下只能识别
application/x-www.form-urlencoded
数据类型(标准数据类型),对于这种数据类型的数据,直接通过$_POST
系统函数就可以获取的到。但是对于不满足上述数据类型的数据,使用$_POST
是获取不到的。PHP获取非
application/x-www.form-urlencoded
数据类型的数据的时候,需要通过php提供的$GLOBALS['HTTP_RAW_POST_DATA']
或者file_get_contents("php://input")
的方式进行获取(这两种获取数据的方式只能获取非标准数据类型的数据,并不能获取标准数据类型的数据)
file_get_contents("php://input")
与$GLOBALS['HTTP_RAW_POST_DATA']
获取到的数据其实是一样的,两者之间的区别在与$GLOBALS['HTTP_RAW_POST_DATA']
依赖 php.ini 中额外的设置,并且系统资源占用高,推荐使用php://input
的方式进行数据的获取
网友评论