微信回调接口比较麻烦一点就是不方便测试
微信支付回调函数都是使用以下变量获取POST数据:
php配置中,必须启用 always_populate_raw_post_data
//php.ini 配置 always_populate_raw_post_data = On
不过一般都是开启的,所以暂时不用管它。
由于之前的项目PHP版本为:php<7.0,所以使用 $GLOBALS['HTTP_RAW_POST_DATA'] 还是OK的;
项目PHP版本升级到7.0之后的版本,微信支付回调使用上面的方法 ,获取不到数据
解决的方法也很简单,只要使用php://input来代替就行。
比如
$data = $GLOBALS['HTTP_RAW_POST_DATA'];
改为
$data = file_get_contents('php://input');
特别提醒
如果你的微信支付,小程序支付,app支付中,
以前使用HTTP_RAW_POST_DATA来获取微信支付异步处理结果的,
升级到php7后,
一定要记得按照上面的方法改过来,
否则有些功能使用不了。
原因是PHP 7版本中已经移除了这个全局变量:'HTTP_RAW_POST_DATA',用 php://input 替代,使用 always_populate_raw_post_data 会导致在填充 $HTTP_RAW_POST_DATA 时产生 E_DEPRECATED 错误。
亲测
方法完整代码:
public function callback(){ // $xml = $GLOBALS['HTTP_RAW_POST_DATA']; $xml = file_get_contents("php://input"); //7.0以上 $arr = xmlToArray($xml); if($arr['return_code']=='SUCCESS'){ //到这里说明已经付款成功了 //修改订单状态 OrderModel::where('no', $arr['out_trade_no']) ->update(['status' => 2]); //告诉微信,我已经处理了,否则微信那边会重复发送数据过来的哦 $mes=array( 'return_code'=>'SUCCESS', 'return_msg'=>'OK' ); return xml($mes); } }
回调返回的数据:
[appid] => wx0debacb93cb90fe5 [bank_type] => CFT [cash_fee] => 1 [fee_type] => CNY [is_subscribe] => N [mch_id] => 1238270202 [nonce_str] => 44wugpcoqff9guhpp30e60rok50eb0td [openid] => ozUTy0PeBNzlPx2cTIjq40T6kUVA [out_trade_no] => 2017091311090393 [result_code] => SUCCESS [return_code] => SUCCESS [sign] => 9C1F65C03B475017864261ADCD2D750D [time_end] => 20170913110908 [total_fee] => 1 [trade_type] => JSAPI [transaction_id] => 4000542001201709131822508410