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);
    	}
    

      

  • 相关阅读:
    屏蔽docker镜像暴露的端口
    runtime/cgo: pthread_create failed: Resource temporarily unavailable
    用户状态bash-4.2$
    Datasnap 和mORMOT 性能对比!
    Delphi XE 时间和时间戳互转换
    Delphi XE 10.4.2 IDE 设置----【代码格式化】
    DELPHI XE 数据集合并(TFDLocalSQL)
    CXGRID 常用功能设置
    MSSQL行转列
    delphi xe 获取字符串长度(不足补位)
  • 原文地址:https://www.cnblogs.com/ouruola863/p/10185619.html
Copyright © 2011-2022 走看看