zoukankan      html  css  js  c++  java
  • PHP7放弃大礼包(微信支付回调签名错误)

    php7不再支持HTTP_RAW_POST_DATA,微信支付$GLOBALS[‘HTTP_RAW_POST_DATA’]获取不到数据

      php7不再支持HTTP_RAW_POST_DATA
      原来系统一些地方,
      使用$GLOBALS[‘HTTP_RAW_POST_DATA’]来获取数据,
      在php7里无法获取了。
      解决的方法也很简单,
      只要使用php://input来代替就行。
      比如
      $data = $GLOBALS['HTTP_RAW_POST_DATA'];
      改为
      $data = file_get_contents('php://input');

    最直接的后果就是微信支付回调时的签名验证失败,在WxPay.php中的:

     	/**
     	 * 
     	 * 支付结果通用通知
     	 * @param function $callback
     	 * 直接回调函数使用方法: notify(you_function);
     	 * 回调类成员函数方法:notify(array($this, you_function));
     	 * $callback  原型为:function function_name($data){}
     	 */
    	public static function notify($config, $callback, &$msg)
    	{
    
    		if (!isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
    			# 如果没有数据,直接返回失败
    			return false;
    		}
    		//如果返回成功则验证签名
    		try {
    			//获取通知的数据
    			$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
    			$result = WxPayNotifyResults::Init($config, $xml);
    		} catch (WxPayException $e){
    			$msg = $e->errorMessage();
    			return false;
    		}
    		
    		return call_user_func($callback, $result);
    	}
    

      

    $GLOBALS['HTTP_RAW_POST_DATA']将获取不到值,因此会直接返回,用file_get_contents('php://input');代替即可,修改后的内容如下:
     	/**
     	 * 
     	 * 支付结果通用通知
     	 * @param function $callback
     	 * 直接回调函数使用方法: notify(you_function);
     	 * 回调类成员函数方法:notify(array($this, you_function));
     	 * $callback  原型为:function function_name($data){}
     	 */
    	public static function notify($config, $callback, &$msg)
    	{
    		if (!isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
    			$GLOBALS['HTTP_RAW_POST_DATA'] = file_get_contents("php://input");//这里在php7下不能获取数据,使用 php://input 代替
    		}
    		if (!isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
    			# 如果没有数据,直接返回失败
    			return false;
    		}
    		//如果返回成功则验证签名
    		try {
    			//获取通知的数据
    			$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
    			$result = WxPayNotifyResults::Init($config, $xml);
    		} catch (WxPayException $e){
    			$msg = $e->errorMessage();
    			return false;
    		}
    		
    		return call_user_func($callback, $result);
    	}
    

      

  • 相关阅读:
    LINUX下mysql的大小写是否区分设置 转
    在CentOS搭建Git服务器 转
    Idea实现WebService实例 转
    Intellij 中的git操作 转!
    Maven配置 settings.xml 转
    Maven使用第三方jar文件的两种方法 转
    Maven : 将Jar安装到本地仓库和Jar上传到私服 转
    maven 私服 配置 转
    Maven 私服配置 转
    Linux 下挂载硬盘的 方法
  • 原文地址:https://www.cnblogs.com/ouruola863/p/10185619.html
Copyright © 2011-2022 走看看