javascript - 微信支付结果通知接受不到传回来的xml

查看:184
本文介绍了javascript - 微信支付结果通知接受不到传回来的xml的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

微信支付成功后用js跳转到之前设置的notify_url地址,我用file_get_contents('php://input')无法获取微信传回来的通知xml;

我也查了很多资料了,以下几点说明:
1.我用的是yii2的php框架
2.我用file_get_contents($_SERVER['DOCUMENT_ROOT'].'/test.xml')可以正常获取解析测试的xml文件
3.设置的notify_url地址:‘http://*.com/wxpay/payres/’,没有带任何参数而且访问没有问题
4.支付成功后我有查过nginx的log,微信服务器有post过来
5.下边结果通知action里边验证签名什么的代码我都暂时给去掉了,现在xml都获取不到

wxpay/index - 发起支付的ajax
(我之前以为支付成功后微信那边会自动跳转到notify_url地址,后来不行,在网上搜了下改成了window.location.href跳转,我不知道这种方式是否会有问题)

success: function (res) {
    $("#recharge_btn").button('reset');
    if (res.status == 200) {
        WeixinJSBridge.invoke(
            'getBrandWCPayRequest',res.jsApiParameters,
            function(res){
                if(res.err_msg == "get_brand_wcpay_request:ok" ) {
                    // 支付成功后的回调函数
                   window.location.href="http://***.com/wxpay/payres/";
                }
                
            }
        );
    }else{
        $("#my-alert").modal("open").find(".am-modal-bd").html(res.msg);
    }
},

下单的配置

 //②、统一下单
        //$input = new WxPayUnifiedOrder();
        $input = new WxPayUnifiedOrder();
        $input->SetBody($body);    //商品描述
        $input->SetAttach($myattach); //自定义参数(邀请码)
        $input->SetDevice_info("WEB"); //微信支付分配的终端设备号,商户自定义
        $input->SetOut_trade_no(WxPayConfig::MCHID . date("YmdHis"));  //商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
        $input->SetTotal_fee($paymoney); //订单总金额,单位为分
        $input->SetTime_start(date("YmdHis")); //交易起始时间
        $input->SetTime_expire(date("YmdHis", time() + 600));  //交易结束时间
        $input->SetGoods_tag("mytag");  //订单优惠标记,使用代金券或立减优惠功能时需要的参数
        $input->SetNotify_url("http://***.com/wxpay/payres/");
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openId);
        $order = WxPayApi::unifiedOrder($input);

结果通知的action:

    /**
     * 充值结果通知
     * @return string
     */
    public function actionPayres()
    {
        $xml = file_get_contents('php://input');
        libxml_disable_entity_loader(true);
        $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
//        echo "<pre>";
//        print_r($data);
//        echo "</pre>";
        return $this->render('payres',[
            'resmsg' => $data['transaction_id'],
        ]);
    }

解决方案

楼主对notify_url的理解出现了偏差,支付回调是第三方根据你调用支付传递的notify_url地址进行请求调用,并且附带参数过来了,你需要做的就是提供接口,在接口这边写好你的业务逻辑,而不是你js跳到notify_url。获取第三方发起的请求参数,微信可以用file_get_contents('php://input'),当然是在你接口那边设置,不建议使用HTTP_RAW_POST_DATA,这个在php7中已经被放弃了。

这篇关于javascript - 微信支付结果通知接受不到传回来的xml的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆