欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

php对微信支付回调处理的方法(合集)

程序员文章站 2022-11-08 12:45:22
微信无论是微信内置JSAPI支付、H5外部浏览器支付、扫码支付,都需要通过异步回调接收支付结果。 本文简介如何获取微信支付通知。 仅需要一个在之前设置好的回调地址的方法里写上如下: 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能 ......

微信无论是微信内置jsapi支付、h5外部浏览器支付、扫码支付,都需要通过异步回调接收支付结果。

本文简介如何获取微信支付通知。

仅需要一个在之前设置好的回调地址的方法里写上如下:

//处理微信支付回调
    public function notify(){
        $testxml  = file_get_contents("php://input");
        $jsonxml = json_encode(simplexml_load_string($testxml, 'simplexmlelement', libxml_nocdata));
        $result = json_decode($jsonxml, true);//转成数组,
        if($result){
            //如果成功返回了
            $out_trade_no = $result['out_trade_no'];
            if($result['return_code'] == 'success' && $result['result_code'] == 'success'){
            //执行业务逻辑
          //查询创建订单表 where("out_trade_no='".$out_trade_no."' and status=1") status为1表示待支付状态 1 待支付
          //查询出来有该订单 就改变支付状态 status=2 2表示支付成功
 
            }
        }
    }

对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 
(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)    
    
结束微信重新通知用代码:echo 'success';

附上:
微信支付返回的xml转化为json格式如下: 

{
  "appid": "12345",
  "attach": "pay", 
  "bank_type": "cft",
  "cash_fee": "1",
  "fee_type": "cny",
  "is_subscribe": "y",
  "mch_id": "12345",
  "nonce_str": "dzyfpadyrpf5rwhv",
  "openid": "onhwf1hiutuyskcsrv21a6mctt5q",
  "out_trade_no": "sh201808222055598628",
  "result_code": "success",
  "return_code": "success",
  "sign": "5a019f52bef1c3a98ae0f1ff29d01574",
  "time_end": "20180822205606",
  "total_fee": "1",
  "trade_type": "mweb",
  "transaction_id": "4200000171201808221550954201" 
}

 

//详细流程如下

public function wycz(){//我要充值
        if(session('uid') ==null || session('uid') == "" || session('uid') == false){
            //没有登录 跳转到登录页
            $this->redirect('/login/login');exit;
       }else {
            //接受参数
            if($_post){
                $total_fee = trim(i("post.fotal_fee"));
                if(!empty($total_fee)){
                    if($total_fee<=0){
                        //提示输入正整数金额
                        $arr['code'] = "301";
                        $arr['msg']  = "输入正整数";
                        echo json_encode($arr);exit();
                    }else{

                        session("total_fee",$total_fee);
                        $arr['code'] = "200";
                        $arr['msg'] = "确认充值吗?";
                        echo json_encode($arr);exit();
                    }
                }else{
                    //提示输入正整数金额
                    $arr['code'] = "302";
                    $arr['msg']  = "输入充值金额";
                    echo json_encode($arr);exit();
                }
            }
            $this->display();
       }
    }

    //充值确认页面
    public function confirmpay(){
        if(session('uid') ==null || session('uid') == "" || session('uid') == false){
            //没有登录 跳转到登录页
            $this->redirect('/login/login');exit;
        }else {
            $result = $this->wappay();
            $this->assign('jsapiparameters',$result['jsapiparameters']);
            $this->assign('editaddress', $result['editaddress']);
            $this->display();
        }
    }
    //操作充值
    public function wappay($total_fee)
    {
        /**
         *
         * example目录下为简单的支付样例,仅能用于搭建快速体验微信支付使用
         * 样例的作用仅限于指导如何使用sdk,在安全上面仅做了简单处理, 复制使用样例代码时请慎重
         * 请勿直接直接使用样例对外提供服务
         *
         **/
        vendor('wxpaysdk.lib.wxpay#api');
        vendor('wxpaysdk.example.wxpay#jsapipay');
        // vendor('wxpaysdk.example.wxpay#config');
        //①、获取用户openid
        $tools = new \jsapipay();
        $openid = $tools->getopenid();
        $total_fee = session("total_fee")*100;
        //$total_fee = session("total_fee");
        //②、统一下单
        $input = new \wxpayunifiedorder();
        $input->setbody("vip充值");
        $input->setattach("vip充值");
        $input->setout_trade_no("klkq".date("ymdhis"));
        $input->settotal_fee($total_fee);
        $input->settime_start(date("ymdhis"));
        $input->settime_expire(date("ymdhis", time() + 600));
        $input->setgoods_tag("vip充值");
        //$input->setnotify_url("http://paysdk.weixin.qq.com/notify.php");
        $input->setnotify_url("http://wap.yuming.com/member/notify");
        $input->settrade_type("jsapi");
        $input->setopenid($openid);
        $config = new \wxpayconfig();
        $order = \wxpayapi::unifiedorder($config, $input);
        //echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
        //printf_info($order);
        $jsapiparameters = $tools->getjsapiparameters($order);
        //获取共享收货地址js函数参数
        $editaddress = $tools->geteditaddressparameters();
        $data['jsapiparameters'] = $jsapiparameters;
        $data['editaddress'] = $editaddress;

        //写入订单表对应数据
        $arr = array(
            'w_mid'=>session('uid'),
            'w_openid'=>$openid,
            'w_title'=>'vip充值',
            'w_time_create'=>date("ymdhis"),
            'w_times_create'=>date("y-m-d h:i:s"),
            'w_out_trade_no'=>"klkq".date("ymdhis"),
        );
        m('wxpay_order')->add($arr);
        
        return $data;
    }

    //处理微信支付回调
    public function notify(){
    $testxml = file_get_contents("php://input");
    $jsonxml = json_encode(simplexml_load_string($testxml,'simplexmlelement',libxml_nocdata));
        $result = json_decode($jsonxml,true);
    if($result){
        $out_trade_no = $result['out_trade_no'];
        if($result['return_code'] == 'success' && $result['result_code'] =='success'){
                //先判断订单状态是否已经改变
                $orderdata = m("wxpay_order")->where("w_out_trade_no='".$result['out_trade_no']."' and w_status=1")->find();
                if(!empty($orderdata)){
                    //支付成功改变支付状态
                    $arr = array(
                        'w_id'=>$orderdata['w_id'],
                        'w_openid'=>$result['openid'],
                        'w_transaction_id'=>$result['transaction_id'],
                        'w_time_end'=>$result['time_end'],
                        'w_times_end'=>$result['time_end'],
                        'w_total_fee'=>$result['total_fee']/100,
                        'w_status'=>2,//支付成功 1 待支付 2支付成功 3 支付失败

                    );
                    m('wxpay_order')->save($arr);

                    //操作积分
                    $uid = $orderdata['w_mid'];
                    //对该人增加$result['total_fee']积分
                    $zz_grade = m('grade');
                    $g_integral = $zz_grade->where("g_mid=".$uid)->getfield('g_integral');
                    $zz_grade->g_integral = $g_integral + intval($result['total_fee']/100);
                    //更新积分
                    $giddd = $zz_grade->where("g_mid=".$uid)->save();

                    //操作积分日志表
                    $zz_grade_log = m('grade_log');
                    $zz_grade_log->g_gcontent = '充值'.intval($result['total_fee']/100).'积分';
                    $zz_grade_log->g_mid = $uid;//邀请者会员id
                    $zz_grade_log->g_gnum = intval($result['total_fee']/100);//充值积分
                    $zz_grade_log->g_gdate = date('y-m-d');//注册日期
                    $zz_grade_log->g_gtime = date('y-m-d h:i:s');//注册时间
                    //写入数据库
                    $liddd = $zz_grade_log->add();

                }
            }

        }

    }