专栏首页木头编程 - moTzxxAPP (UniAPP) 微信支付回调的 HTTP_RAW_POST_DATA 报错情况 (wxpayv3)

APP (UniAPP) 微信支付回调的 HTTP_RAW_POST_DATA 报错情况 (wxpayv3)

Creative Commons

背景描述

  • 当前我在学习 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"}

参考文章:

  1. 关于php://input、$_POST、$HTTP_RAW_POST_DATA的理解及区别
  2. 微信支付遇到的大坑 WxpayAPI_php_v3

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Nginx 反向代理学习及实例笔记

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

    泥豆芽儿 MT
  • js setInterval 代码实现页面轮询

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

    泥豆芽儿 MT
  • wx.navigateTo 跳转页面失败?

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

    泥豆芽儿 MT
  • 用户体验要素——战略层

    用户2025931
  • 交互设计流程思考范围层结构层框架层

    霖酱
  • 种子用户概念定义,如何界定种子用户画像

    种子用户,正如这个名字,它是一颗种子,种子意味着可以成长,生命力旺盛,充满挑战精神热情。种子用户,首先要有一定的经济基础或者是一些产品和行业的经验的基础,因为只...

    阿北8
  • 三种方法为 ASP.NET Core 对外服务添加 https 支持(kestrel / frp / nginx)

    虽然使用 Visual Studio 创建 ASP.NET Core 程序的时候可以选择是否添加 https 支持,不过这种方式只添加了 localhost 的...

    walterlv
  • 如何进行用户价值细分?RFM模型! Part 1 基础知识

    重视用户留存是目前企业发展的共识之一,借助RFM模型对人群细分从而对用户进行精细化运营,是提升留存的重要方法。本文首先带你来了解到底什么是RFM模型。

    三猫
  • 什么是新增用户、活跃用户、留存用户?

    在很多产品里都对应3种用户(新增用户、活跃用户、留存用户),搞清楚他们的概念和区别,对于运营和分析都非常有帮助。

    猴子聊数据分析
  • 别让自己变为一个废掉的 iOS程序猿【励志篇】

    有人说是无所事事,终日啃老;有人说是沉溺游戏,卧床不起;可你有没有想过,或许下一个废掉的人,刚好是看似勤奋忙碌的你。

    原来是泽镜啊

扫码关注云+社区

领取腾讯云代金券