本文主要是介绍APP (UniAPP) 微信支付回调的 HTTP_RAW_POST_DATA 报错情况 (wxpayv3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
背景描述
- 当前我在学习 Uniapp 的应用开发,使用的是 Uniapp 官方提供的 服务端PHP源码
根据 微信支付文档-回调通知注意事项可知,支付成功后,回调地址所
返回的报文必须是xml格式
- 从一众路径所知的回调方法中,很多会涉及到这样一句代码
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
But: PHP7+ 中已经移除了这个全局变量,所以请用
php://input 替代
,否则得到数据为空
- 于是代码优化为:
$xml = isset($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");
源码参考
/*** 微信支付回调* @param Request $request*/public function wxNotify(Request $request){//TODO 此代码 是因为 php7之后的版本中已经弃用 HTTP_RAW_POST_DATA,所以...$xml=isset($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");//将服务器返回的XML数据转化为数组$data = self::xml2array($xml);if (($data['return_code'] == 'SUCCESS') && ($data['result_code'] == 'SUCCESS')) {//获取服务器返回的数据$out_trade_no = $data['out_trade_no']; //订单单号$data['timestamp'] = date("Y-m-d H:i:s");$json_str_notify = json_encode($data);//TODO 此时可以根据自己的业务逻辑 进行数据库更新操作if ($out_trade_no){//个人业务需求,支付订单号有所设定而已$order_sn = explode("W",$out_trade_no)[0];$orderInfoModel = new XorderInfos();$orderInfoModel->updatePayResultForNotify($order_sn, 0,$json_str_notify);}}}/*** 将xml转为array* @param string $xml xml字符串* @return array 转换得到的数组*/protected function xml2array($xml){//禁止引用外部xml实体libxml_disable_entity_loader(true);$result = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);return $result;}
- 为方便后期的退款操作,存入数据表中的格式参考:
{"appid":"wxdd8xxxxxxxxxxx30","bank_type":"CFT","cash_fee":"1","fee_type":"CNY","is_subscribe":"N","mch_id":"1538257171","nonce_str":"8m348zzmez4o52mt6rzjds6rri836840","openid":"ozBhy5j_xxxxxxxxxxxxxxxxx5w","out_trade_no":"201906122044331501W103158","result_code":"SUCCESS","return_code":"SUCCESS","sign":"CBBC7A6B82A22B72F6CDC393AB88E52F","time_end":"20190613150556","total_fee":"1","trade_type":"APP","transaction_id":"4200000327201906131737890110","timestamp":"2019-06-13 15:05:57"}
参考文章:
关于php://input、$_POST、$HTTP_RAW_POST_DATA的理解及区别
- 微信支付遇到的大坑 WxpayAPI_php_v3
这篇关于APP (UniAPP) 微信支付回调的 HTTP_RAW_POST_DATA 报错情况 (wxpayv3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!