浏览 1999 次 / [ 天下网闻 ] 关于微信支付接口WxpayAPI_php_v3 SDK在PHP7不能成功回调的问题
  • 发布时间 2017-08-10 17:59
  • 从PHP5.5升级到PHP7之后,发现插件里微信支付已经付款成功,但是用户组不会自动改变,搜索到以下方法解决:

    -------------------------------------------------------------------------------------------------

    最近在做一个项目,PHP本从5.4升级到PHP7。结果原来好好的微信支付,只能付钱,但是不能成功从微信支付服务端接收回调数据,一直提示xml数据错误。
    测试了一下午发现问题出在WxPay.Api.php文件的414行。
    /**
    *
    * 支付结果通用通知
    * @param function $callback
    * 直接回调函数使用方法: notify(you_function);
    * 回调类成员函数方法:notify(array($this, you_function));
    * $callback 原型为:function function_name($data){}
    */
    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);
    }

    问题就在这个$GLOBALS['HTTP_RAW_POST_DATA']上面。PHP7里已经抛弃了这个数据接收方式,所以无法从微信端接收到反馈的数据
    /**
    *
    * 支付结果通用通知
    * @param function $callback
    * 直接回调函数使用方法: notify(you_function);
    * 回调类成员函数方法:notify(array($this, you_function));
    * $callback 原型为:function function_name($data){}
    */
    public static function notify($callback, &$msg)
    {
    //获取通知的数据
    //$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
    $xml = file_get_contents('php://input', 'r');
    //如果返回成功则验证签名
    try {
    $result = WxPayResults::Init($xml);
    } catch (WxPayException $e){
    $msg = $e->errorMessage();
    return false;
    }

    return call_user_func($callback, $result);
    }
    这个我修改过的,改用php://input方式接收数据,亲测可用

    -------------------------------------------------------------------------------------------------

    就是在插件目录下WxPay.Api.php里

    $xml = $GLOBALS['HTTP_RAW_POST_DATA'];

    下方添加一行:

    $xml = file_get_contents('php://input', 'r');

    -------------------------------------------------------------------------------------------------

    本文选自:http://www.thinkphp.cn/topic/46958.html ,感谢原作者