Browse Source

充值VIP与回调

lizhen_gitee 1 year ago
parent
commit
389db209d0
2 changed files with 118 additions and 99 deletions
  1. 95 50
      application/api/controller/Notify.php
  2. 23 49
      application/api/controller/Pay.php

+ 95 - 50
application/api/controller/Notify.php

@@ -57,7 +57,7 @@ class Notify extends Api
         exit;
     }
 
-    //异步逻辑
+    //充值金币 逻辑
     private function recharge_notify_do($out_trade_no){
 
         Db::startTrans();
@@ -92,67 +92,112 @@ class Notify extends Api
         //默认提交
         Db::commit();
         return true;
+    }
 
 
-    }
+    //充值VIP 异步回调对外方法
+    public function vip_notify_base(){
+
+        //验签
+        $paytype = input('paytype','wechat');
+        $notify_file = $this->notify_log_start($paytype);
+        $pay = Service::checkNotify($paytype);
+        if (!$pay) {
+            echo '签名错误';
+            exit;
+        }
 
+        //验证,拿订单号等信息
+        $data = $pay->verify();
+        $out_trade_no = $data['out_trade_no'];
+        //订单查询
+        $info = Db::name('pay_order')->where('out_trade_no',$out_trade_no)->find();
 
-    //app充值vip
-    public function vippaysucc($orderId,$args){
-        $order = Db::name('pay_order')->where(array('pay_no'=>$orderId,'status'=>2))->find();
+        if(empty($info)){
+            echo $pay->success();
+            exit;
+        }
 
-        if( $order )
+        if($info['order_status'] != 0)
         {
+            echo $pay->success();
+            exit;
+        }
+        //你可以在此编写订单逻辑
+        $rs = $this->vip_notify_do($out_trade_no);
+        if($rs === false){
+            //不论结果都应返回success
+            echo $pay->success();
+            exit;
+        }else{
+            //不论结果都应返回success
+            echo $pay->success();
+            exit;
+        }
+
+        //默认
+        echo $pay->success();
+        exit;
+    }
+
+    //充值金币 逻辑
+    private function vip_notify_do($out_trade_no){
+
+        Db::startTrans();
+        $orderInfo = Db::name('pay_order')->where(['out_trade_no' => $out_trade_no])->lock(true)->find();
+        if (empty($orderInfo)) {
+            Db::rollback();
+            return false;
+        }
 
-            Db::startTrans();
-            //更新订单状态
-            $rs = Db::name('pay_order')->where(['id'=>$order['id']])->update(['status'=>1]);
-            if(!$rs){
-                Db::rollback();
-                filePut('[wallet][paySucc] pay_order update fail'.$orderId);
-                abort(500,'订单更新失败');
-            }
-
-            //先充值
-            $user_info = Db::name('user_wallet')->where('user_id',$args['user_id'])->lock(true)->find();
-            if($user_info['vip_endtime'] < time()){
-                //过期了
-                $vip_endtime = time() + (intval($args['days']) * 86400);
-            }else{
-                //追加vip
-                $vip_endtime = $user_info['vip_endtime'] + (intval($args['days']) * 86400);
-            }
-            $update_data = [
-                'vip_endtime'=>$vip_endtime,
-                'vip_level'  =>$args['vip_level'], //修改等级,同级不影响,向上立刻改,向下不允许
-            ];
-            $result = Db::name('user_wallet')->where('user_id',$args['user_id'])->update($update_data);
-            if($result === false)
-            {
-                Db::rollback();
-                filePut('[wallet][paySucc]网银充值入账更新vip时间失败 recharge money fail'.$orderId);
-                abort(500,'网银充值入账 model wallet recharge money fail');
-            }
-
-            //tag任务赠送金币
-            //开通VIP 50金币
-            $task_rs = \app\common\model\TaskLog::tofinish($args['user_id'],9);
-            if($task_rs === false){
-                Db::rollback();
-                $this->error('完成任务赠送奖励失败');
-            }
-
-
-            Db::commit();
-
-            return true;
+        if($orderInfo['order_status'] != 0){
+            Db::rollback();
+            return false;
+        }
+
+        //逻辑开始
+        //先充值
+        $args = json_decode($orderInfo['args'],true);
+        $user_info = Db::name('user_wallet')->where('user_id',$orderInfo['user_id'])->lock(true)->find();
+        if($user_info['vip_endtime'] < time()){
+            //过期了
+            $vip_endtime = time() + (intval($args['days']) * 86400);
         }else{
-            filePut('[wallet][paySucc]在线支付订单有误 '.$orderId);
-            abort(500,'model wallet fail');
+            //追加vip
+            $vip_endtime = $user_info['vip_endtime'] + (intval($args['days']) * 86400);
+        }
+        $update_data = [
+            'vip_endtime'=>$vip_endtime,
+        ];
+        $result = Db::name('user_wallet')->where('user_id',$orderInfo['user_id'])->update($update_data);
+        if($result === false)
+        {
+            Db::rollback();
+            return false;
+        }
+
+        //tag任务赠送金币
+        //开通VIP 50金币
+        /*$task_rs = \app\common\model\TaskLog::tofinish($args['user_id'],9);
+        if($task_rs === false){
+            Db::rollback();
+            $this->error('完成任务赠送奖励失败');
+        }*/
+        //逻辑结束
+
+        //状态
+        $ros = Db::name('pay_order')->where(['out_trade_no' => $out_trade_no])->update(['order_status'=>1,'notifytime'=>time()]);
+        if($ros === false) {
+            Db::rollback();
             return false;
         }
+
+        //默认提交
+        Db::commit();
+        return true;
     }
 
+
     //异步日志
     private function notify_log_start($paytype = 'wechat'){
         //记录支付回调数据

+ 23 - 49
application/api/controller/Pay.php

@@ -15,9 +15,11 @@ class Pay extends Api
 
     //vip用的
     public function vip_config(){
-        $list = Db::name('payvip_config')->where('is_show',1)->order('weight asc,id asc')->select();
+        $list = Db::name('payvip_config')->order('weigh asc,id asc')->select();
         $data['vipconfig'] = $list;
         $data['vip_endtime'] = model('wallet')->getWallet($this->auth->id,'vip_endtime');
+        $data['is_vip'] = $data['vip_endtime'] > time() ? 1 : 0;
+        $data['avatar'] = localpath_to_netpath($this->auth->avatar);
         $this->success('success',$data);
     }
 
@@ -26,6 +28,7 @@ class Pay extends Api
 
         $rc_id = input('rc_id',0);
         $pay_type = input('pay_type','wechat');
+        $platform = 'app';
         $uid = $this->auth->id;
 
         if(!$rc_id){
@@ -46,64 +49,34 @@ class Pay extends Api
         }
 
 
-        //会员等级冲突
-        //当前是会员,但是却要向下级续费,直接提示报错
-        //修改等级,向上立刻改,向下不允许
-        $wallet_info = model('wallet')->getWallet($this->auth->id);
-        if($wallet_info['vip_endtime'] > time() && $recharge_config['vip_level'] < $wallet_info['vip_level']){
-            $this->error('当前会员没有过期,不能续费');
-        }
-
         //创建订单
-        $data = [];
-        $data['status'] = 0;
-        $pay_no = createUniqueNo('V',$uid);
-        $data['pay_no'] = $pay_no;
-        $data['money'] = $money;
-        $data['payment_class'] = $pay_type;
         $data['user_id'] = $uid;
-        $data['ext_info'] =  json_encode(['subject'=>'充值vip支付']);
-        $data['memo'] =  '充值会员支付';
+        $data['out_trade_no'] = createUniqueNo('P',$uid); // 数据库订单号加密
+        $data['order_amount'] = $money;
         $data['createtime'] = time();
-        //$data['payment'] = 'miniapp';
-        $data['payment'] = 'app';
-        $orderid = Db::name('pay_order')->insertGetId($data);
 
-        //创建回调
-        $even_data = [];
-        $even_data['event'] = 'success';
-        $even_data['class'] = 'app\common\model\Recharge';
-        $even_data['method'] = 'vippaysucc';
-        $even_data['args'] = json_encode(['user_id'=>$uid,'days'=>$recharge_config['days'],'vip_level'=>$recharge_config['vip_level']]);
-        $even_data['pay_no'] = $pay_no;
-        Db::name('pay_event')->insertGetId($even_data);
-
-        $return = [
-            'pay_no'=>$pay_no,
-            'title' => '充值vip支付',
-        ];
-
-      /*  $this->success('success',$return);
-    }
+        $data['pay_type'] = $pay_type;
+        $data['platform'] = $platform;
+        $data['order_status'] = 0;
+        $data['table_name'] = 'vip_recharge';
+        $data['table_id'] = 0;
+        $data['args'] = json_encode(['days'=>$recharge_config['days']]);
 
-    public function topay(){*/
+        $orderid = Db::name('pay_order')->insertGetId($data);
 
-        //$openid = $this->auth->openid;
-        /*$pay_no = input('pay_no');
-        $orderInfo = Db::name('pay_order')->where('pay_no',$pay_no)->find();*/
+//        $openid = $this->auth->mini_openid;
         //下单
         $params = [
             'type'         => $pay_type,
-            'orderid'      => $pay_no,
-            'title'        => $data['memo'],
-            'amount'       => $data['money'],
-            //'amount'       => 0.01,
-            //'method'       => 'miniapp',
-            'method'       => 'app',
-            //'openid'       => $openid,
-            'notifyurl' => $this->request->root(true) . '/notify.php/paytype/'.$pay_type,
+            'orderid'      => $data['out_trade_no'],
+            'title'        => '支付订单',
+            'amount'       => $data['order_amount'],
+            'method'       => $platform,
+//            'openid'       => $openid,
+            'notifyurl' => config('pay_notify_url').'/api/notify/vip_notify_base/paytype/'.$pay_type,
             'returnurl' => '',
         ];
+
         $res = Service::submitOrder($params);
 
         if($pay_type == 'wechat'){
@@ -114,6 +87,7 @@ class Pay extends Api
     }
 
 
+
     //金币充值
     public function gold_config(){
         $list = Db::name('paygold_webcon')->order('weigh asc,id asc')->select();
@@ -184,7 +158,7 @@ class Pay extends Api
             'amount'       => $data['order_amount'],
             'method'       => $platform,
 //            'openid'       => $openid,
-            'notifyurl' => config('pay_notify_url').'/api/pay/order_notify_base/paytype/'.$pay_type,
+            'notifyurl' => config('pay_notify_url').'/api/notify/recharge_notify_base/paytype/'.$pay_type,
             'returnurl' => '',
         ];