Browse Source

充值金币与回调

lizhen_gitee 1 year ago
parent
commit
c81ff49456

+ 75 - 102
application/api/controller/Notify.php

@@ -1,129 +1,102 @@
 <?php
 namespace app\api\controller;
-use \think\Db;
+
+use app\common\controller\Api;
+use think\Db;
+use addons\epay\library\Service;
 /**
  * 订单支付回调
  */
 class Notify extends Api
 {
+    protected $noNeedLogin = ['*'];
+    protected $noNeedRight = ['*'];
+
+    //充值金币 异步回调对外方法
+    public function recharge_notify_base(){
+
+        //验签
+        $paytype = input('paytype','wechat');
+        $notify_file = $this->notify_log_start($paytype);
+        $pay = Service::checkNotify($paytype);
+        if (!$pay) {
+            echo '签名错误';
+            exit;
+        }
 
-    //pc端充值金币
-    public function rechargepaysucc($orderId,$args){
-        $order = Db::name('pay_order')->where(array('pay_no'=>$orderId,'status'=>2))->find();
-
-        if( $order )
-        {
+        //验证,拿订单号等信息
+        $data = $pay->verify();
+        $out_trade_no = $data['out_trade_no'];
+        //订单查询
+        $info = Db::name('pay_order')->where('out_trade_no',$out_trade_no)->find();
 
-            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,'订单更新失败');
-            }
+        if(empty($info)){
+            echo $pay->success();
+            exit;
+        }
 
-            //先充值
-            $result = model('Wallet')->lockChangeAccountRemain($args['user_id'],'gold',$args['gold'],10, '金币充值:'.$orderId,'pay_order',$order['id']);
-            if($result['status']===false)
-            {
-                Db::rollback();
-                filePut('[wallet][paySucc]网银充值入账更新余额失败 recharge money fail'.$orderId.$result['msg']);
-                abort(500,'网银充值入账 model wallet recharge money fail');
-            }
+        if($info['order_status'] != 0)
+        {
+            echo $pay->success();
+            exit;
+        }
+        //你可以在此编写订单逻辑
+        $rs = $this->recharge_notify_do($out_trade_no);
+        if($rs === false){
+            //不论结果都应返回success
+            echo $pay->success();
+            exit;
+        }else{
+            //不论结果都应返回success
+            echo $pay->success();
+            exit;
+        }
 
-            Db::commit();
+        //默认
+        echo $pay->success();
+        exit;
+    }
 
+    //异步逻辑
+    private function recharge_notify_do($out_trade_no){
 
-            return true;
-        }else{
-            filePut('[wallet][paySucc]在线支付订单有误 '.$orderId);
-            abort(500,'model wallet fail');
+        Db::startTrans();
+        $orderInfo = Db::name('pay_order')->where(['out_trade_no' => $out_trade_no])->lock(true)->find();
+        if (empty($orderInfo)) {
+            Db::rollback();
             return false;
         }
-    }
 
-    //app充值金币
-    public function goldpaysucc($orderId,$args){
-        $order = Db::name('pay_order')->where(array('pay_no'=>$orderId,'status'=>2))->find();
+        if($orderInfo['order_status'] != 0){
+            Db::rollback();
+            return false;
+        }
 
-        if( $order )
+        //逻辑开始
+        $args = json_decode($orderInfo['args'],true);
+        $result = model('Wallet')->lockChangeAccountRemain($orderInfo['user_id'],'gold',$args['gold'],10, '金币充值','pay_order',$orderInfo['id']);
+        if($result['status']===false)
         {
+            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,'订单更新失败');
-            }
-
-            //先充值
-            $result = model('Wallet')->lockChangeAccountRemain($args['user_id'],'gold',$args['gold'],10, '金币充值:'.$orderId,'pay_order',$order['id']);
-            if($result['status']===false)
-            {
-                Db::rollback();
-                filePut('[wallet][paySucc]网银充值入账更新余额失败 recharge money fail'.$orderId.$result['msg']);
-                abort(500,'网银充值入账 model wallet recharge money fail');
-            }
+        //状态
+        $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;
+        }
 
-            //首充
-            $first_map = [
-                'uid' => $args['user_id'],
-                'pg_id' => $args['pg_id'],
-            ];
-            $first_check = Db::name('user_paygold_log')->where($first_map)->find();
-            if(empty($first_check)){
-
-                //首充日志
-                $first_map['createtime'] = time();
-                $first_log_id = Db::name('user_paygold_log')->insertGetId($first_map);
-                if(!$first_log_id){
-                    Db::rollback();
-                    abort(500,'首充赠送失败');
-                }
-                //送金币
-                if(isset($args['first_gold']) && $args['first_gold'] > 0){
-                    $result = model('Wallet')->lockChangeAccountRemain($args['user_id'],'gold',$args['first_gold'],14, '金币充值:'.$orderId,'pay_order',$order['id']);
-                    if($result['status']===false)
-                    {
-                        Db::rollback();
-                        filePut('[wallet][paySucc]网银充值入账更新余额失败 recharge money fail'.$orderId.$result['msg']);
-                        abort(500,'网银充值入账 model wallet recharge money fail');
-                    }
-                }
-                //送vip
-                if(isset($args['first_vipdays']) && $args['first_vipdays'] > 0){
-                    $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['first_vipdays']) * 86400);
-                    }else{
-                        //追加vip
-                        $vip_endtime = $user_info['vip_endtime'] + (intval($args['first_vipdays']) * 86400);
-                    }
-                    $result = Db::name('user_wallet')->where('user_id',$args['user_id'])->update(['vip_endtime'=>$vip_endtime]);
-                    if($result === false)
-                    {
-                        Db::rollback();
-                        filePut('[wallet][paySucc]网银充值入账更新vip时间失败 recharge money fail'.$orderId);
-                        abort(500,'网银充值入账 model wallet recharge money fail');
-                    }
-                }
+        //默认提交
+        Db::commit();
+        return true;
 
-            }
 
-            Db::commit();
+    }
 
 
-            return true;
-        }else{
-            filePut('[wallet][paySucc]在线支付订单有误 '.$orderId);
-            abort(500,'model wallet fail');
-            return false;
-        }
-    }
     //app充值vip
     public function vippaysucc($orderId,$args){
         $order = Db::name('pay_order')->where(array('pay_no'=>$orderId,'status'=>2))->find();

+ 21 - 43
application/api/controller/Pay.php

@@ -5,7 +5,6 @@ namespace app\api\controller;
 use app\common\controller\Api;
 use think\Db;
 use addons\epay\library\Service;
-use app\common\model\Wallet;
 /**
  * 充值配置与充值订单
  */
@@ -117,7 +116,7 @@ class Pay extends Api
 
     //金币充值
     public function gold_config(){
-        $list = Db::name('paygold_config')->where('is_show',1)->order('weight asc,id asc')->select();
+        $list = Db::name('paygold_webcon')->order('weigh asc,id asc')->select();
         $data['goldconfig'] = $list;
         $data['gold'] = model('wallet')->getWallet($this->auth->id,'gold');
         $data['money_to_gold'] = config('site.money_to_gold');
@@ -129,6 +128,7 @@ class Pay extends Api
 
         $rc_id     = input_post('rc_id',0);
         $pay_type  = input_post('pay_type','wechat');
+        $platform  = 'app';
         $freemoney = input_post('freemoney',0);
         $uid = $this->auth->id;
 
@@ -138,11 +138,9 @@ class Pay extends Api
 
         //赋值money
         if($rc_id){
-            $recharge_config = Db::name('paygold_config')->where('id',$rc_id)->find();
+            $recharge_config = Db::name('paygold_webcon')->where('id',$rc_id)->find();
             $money = $recharge_config['money'] ?: 0;
             $gold  = $recharge_config['gold'] ?: 0;
-            $first_gold     = $recharge_config['first_gold'] ?: 0;
-            $first_vipdays  = $recharge_config['first_vipdays'] ?: 0;
         }
 
         //自由输入覆盖
@@ -151,8 +149,6 @@ class Pay extends Api
             $money = floatval($freemoney);
             $bili = config('site.money_to_gold') ?: 10;
             $gold  = bcmul($money,$bili,0);
-            $first_gold = 0;
-            $first_vipdays = 0;
         }
 
         //
@@ -165,52 +161,33 @@ class Pay extends Api
         }
 
         //创建订单
-        $data = [];
-        $data['status'] = 0;
-        $pay_no = createUniqueNo('P',$uid);
-        $data['pay_no'] = $pay_no;
-        $data['money'] = $money;
-        $data['payment_class'] = $pay_type;
         $data['user_id'] = $uid;
-        $data['ext_info'] =  json_encode(['subject'=>'充值金币支付']);
-        $data['memo'] =  '充值金币支付';
+        $data['out_trade_no'] = createUniqueNo('P',$uid); // 数据库订单号加密
+        $data['order_amount'] = $money;
         $data['createtime'] = time();
-        $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'] = 'goldpaysucc';
-        $even_data['args'] = json_encode(['user_id'=>$uid,'gold'=>$gold,'money'=>$money,'pg_id'=>$rc_id,'first_gold'=>$first_gold,'first_vipdays'=>$first_vipdays]);
-        $even_data['pay_no'] = $pay_no;
-        Db::name('pay_event')->insertGetId($even_data);
-
-        $return = [
-            'pay_no'=>$pay_no,
-            'title' => '充值金币支付',
-        ];
 
-        /*  $this->success('success',$return);
-      }
+        $data['pay_type'] = $pay_type;
+        $data['platform'] = $platform;
+        $data['order_status'] = 0;
+        $data['table_name'] = 'gold_recharge';
+        $data['table_id'] = 0;
+        $data['args'] = json_encode(['gold'=>$gold]);
 
-      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'       => 'app',
-            '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/pay/order_notify_base/paytype/'.$pay_type,
             'returnurl' => '',
         ];
+
         $res = Service::submitOrder($params);
 
         if($pay_type == 'wechat'){
@@ -220,4 +197,5 @@ class Pay extends Api
         }
     }
 
+
 }

+ 1 - 0
application/config.php

@@ -366,6 +366,7 @@ return [
         'secret' => 'sAsx6iK7CsrqJm55xfKlOd4jqDwSHJ9jKKFjoXc59be1GzG3oxKVWSJ03eAIWuWU',
     ],
 
+    'pay_notify_url' => 'https://tken.huxiukeji.cn',
     'domain_cdnurl' => 'https://mita-1253256600.cos.ap-nanjing.myqcloud.com',
 
     //开放平台的,不是小程序的

+ 1 - 1
application/extra/wallet.php

@@ -7,7 +7,7 @@ return [
         1 => '系统调节',
 
 
-        10 => '金币充值',
+        10 => '金币充值',//gold +
 //        11 => '视频通话消费',
 //        12 => '语音通话消费',
 //        13 => '文字聊天消费',