| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 | <?phpnamespace app\common\model;use think\Db;use app\common\model\Wallet;/* *处理支付结果 接受服务器和服务器之间的通知 */class Paymentdo{    //接受服务器的通知    public function receive($orderId,$payamount)    {        filePut('[payment][receive]异步回调开始');        //$orderId = Pay::getOrderId();        if (!$orderId)        {            filePut('[payment][receive]支付号未匹配');            return false;        }        $where = array();        $where['pay_no'] = $orderId;        $info = Db::name('pay_order')->where($where)->find();        if ($info)        {            if($info['status'])            {                filePut('[payment][receive]本支付号已处理过 '.$orderId);                return true;            }            else            {                filePut('[payment][receive]开始支付 '.$orderId);            }            //获取到它使用的支付接口            //$pay = new Pay($info['payment_class']);            //Db::startTrans(); 修改为:充值+扣款,防止扣款失败时充值也回滚            //if ($rs = $pay->receive())            if (1 === 1)            {                $this->touchEvent('success', $orderId);                filePut('[payment][receive]支付完成,结果 success, '.$orderId);                return true;            }            else            {                $this->touchEvent('failed', $orderId);                filePut('[payment][receive]支付完成,结果 failed, '.$orderId);            }            //filePut('[payment][receive]支付完成,结果  '.json_encode($rs).', '.$orderId);        }        else        {            filePut('[payment][receive]无效支付号 '.$orderId);            return false;        }        return false;        //1.服务器发回处理结果        //2.这里交给核心类处理        //3.核心类交给支付接口判断支付成功还是失败        //4.根据支付接口的返回结果,核心类调用之前绑定好的事件.    }    /**     * 执行绑定事件     * @param  string     $event   事件名称     * @param  string     $order_id 订单号     */    public function touchEvent($event, $orderId)    {        //检查该订单是否已绑定事件        $pay_event = Db::name('pay_event');        $pay_order = Db::name('pay_order');        $where = [];        $where['pay_no'] = $orderId;        $where['event'] = $event;        $info = $pay_event->where($where)->find();        if(!$info||!isset($info['class']))        {return;}        $class = new $info['class'];        db()->startTrans();        $orderInfo = $pay_order->where(['pay_no' => $orderId])->lock(true)->find();        filePut("[PAY][touchEvent] STRAT" . $orderId);        //如果找到了绑定的事件        if ($info) {            $args = json_decode($info['args'], true); //强制转换为数组格式            //$args['moneynumber'] = $orderInfo['money'];//兼容以前的设计,追加money            if ($event === 'success') {                if($orderInfo['status'] === 0)//成功事件只触发1次                {                    $pay_order->where(['pay_no' => $orderId])->update(['status'=>2]);                    db()->commit();                    filePut('[PAY][touchEvent] success start'.$orderId);//.$info['args']                    call_user_func_array([$class, $info['method']], [$orderId, $args]);                    //得到事件模型类                    filePut('[PAY][touchEvent] success end '.$orderId);                }            }            else            {                call_user_func_array([$class, $info['method']], [$orderId, $args]);                filePut('[PAY][touchEvent] '.$event.' fail'.$orderId);            }        }    }    //接受浏览器的同步通知    public function callback()    {        filePut('[payment][callback]同步回调开始');        $orderId = Pay::getOrderId();        if (!$orderId)        {            filePut('[payment][callback]无法分析到支付号未匹配');            $this->error('无效支付!');        }        $where = array();        $where['pay_no'] = $orderId;        $info = Db::name('pay_order')->where($where)->find();        if ($info)        {            //获取到它使用的支付接口            $pay = new Pay($info['payment_class']);            $rs = $pay->callback();            if (!$info['status'])            {                filePut('[payment][callback]开始支付 '.$orderId);                //Db::startTrans(); 修改为:充值+扣款,防止扣款失败时充值也回滚                if ($rs)                {                    $pay->touchEvent('success', $orderId);                    $pay->printMessage('success', 'callback结果 success, '.$orderId);                    filePut('[payment][callback]支付完成,结果 success, '.$orderId);                    filePut('[payment][callback]支付完成,结果  '.json_encode($rs).', '.$orderId);                }                else                {                    $pay->touchEvent('failed', $orderId);                    $pay->printMessage('failed', 'callback结果 failed, '.$orderId);                    filePut('[payment][callback]支付完成,结果 failed, '.$orderId);                    filePut('[payment][callback]支付完成,结果  '.json_encode($rs).', '.$orderId);                    /*if (IS_MOBILE)                    {                        $url = session('redirect_fail_uri', '','user')?:'/wap/';                        session('redirect_fail_uri', null,'user');                        $this->redirect($url);                    }                    else                    {*/                        $this->error('支付失败!');                    /*}*/                }            }        }        else        {            filePut('[payment][callback]无效支付号 '.$orderId);            /*if (IS_MOBILE)            {                $url = session('redirect_fail_uri', '','user')?:'/wap/';                session('redirect_fail_uri', null,'user');                $this->redirect($url);            }            else            {*/                $this->error('无效支付订单号!');           /* }*/        }        //以下代码用于同步支付成功后回跳,请定制        /*$pays = Pay::getInstalled();        $pinfo = $pays[Pay::$payname];*/        $pinfo = ['type'=>'pc'];        filePut('[payment][callback]回调地址 '.json_encode(session('redirect_uri','','user')));        //同步通知处理完进行回跳转        if ('app'==$pinfo['type']||request()->isAjax())        {            //app同步请求            if($rs)                $pay->printMessage('success', 'app callback结果 success, '.$orderId);            else                $pay->printMessage('failed', 'app callback结果 failed, '.$orderId);        }        else        {            if (session('redirect_uri','','user'))            {                $url = str_replace('.html', '', session('redirect_uri','','user'));                session('redirect_uri', null, 'user');                $this->redirect($url);            }            elseif('wap'==$pinfo['type'])                $this->redirect('/wap/');            else                $this->redirect('/index/user/walletcenter');        }        exit();        //1.服务器发回处理结果        //2.这里交给核心类处理        //3.核心类交给支付接口判断支付成功还是失败        //4.根据支付接口的返回结果,核心类调用之前绑定好的事件.    }}?>
 |