美文网首页工作生活
微信DEMO关于 $GLOBALS["HTTP_RAW_POST

微信DEMO关于 $GLOBALS["HTTP_RAW_POST

作者: 饿肚子吃瓜子 | 来源:发表于2019-07-03 11:08 被阅读0次

    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 配置。

    1. php = 5.6 放开 always_populate_raw_post_data = -1 配置(不建议这样做)
      我当前PHP版本还是5.6,初始的配置文件 always_populate_raw_post_data = -1 是被注释的,去掉前面的 ; 分号就行了。
      但是再次运行你会发现报一个 warning 的错误,但程序还是会执行的。
      自己写的程序怎么能允许出现 warning 级别的错误呢,notice 的级别错误都不应该出现的。

    2. 使用 get_file_contents(“php://input”) 方式。

    $xml = get_file_contents("php://input");
    var_dump($xml);
    

    POST提交后端接收介绍

    1. HTTP中的POST方式传递的数据类型是多种多样的,比如说 text/xml,soap等等

    2. PHP默认情况下只能识别 application/x-www.form-urlencoded 数据类型(标准数据类型),对于这种数据类型的数据,直接通过 $_POST 系统函数就可以获取的到。但是对于不满足上述数据类型的数据,使用 $_POST 是获取不到的。

    3. PHP获取非 application/x-www.form-urlencoded 数据类型的数据的时候,需要通过php提供的 $GLOBALS['HTTP_RAW_POST_DATA'] 或者 file_get_contents("php://input") 的方式进行获取(这两种获取数据的方式只能获取非标准数据类型的数据,并不能获取标准数据类型的数据)

    4. file_get_contents("php://input")$GLOBALS['HTTP_RAW_POST_DATA'] 获取到的数据其实是一样的,两者之间的区别在与 $GLOBALS['HTTP_RAW_POST_DATA'] 依赖 php.ini 中额外的设置,并且系统资源占用高,推荐使用 php://input 的方式进行数据的获取

    参考

    相关文章

      网友评论

        本文标题:微信DEMO关于 $GLOBALS["HTTP_RAW_POST

        本文链接:https://www.haomeiwen.com/subject/mttthctx.html