Pārlūkot izejas kodu

ios内购支付,订阅续费的特殊处理

lizhen_gitee 1 gadu atpakaļ
vecāks
revīzija
44c9379554
1 mainītis faili ar 97 papildinājumiem un 2 dzēšanām
  1. 97 2
      application/api/controller/Payios.php

+ 97 - 2
application/api/controller/Payios.php

@@ -226,12 +226,105 @@ class Payios extends Api
         $prefix = 'iosVIP订阅'.',传入original_transaction_id:'.$original_transaction_id.',传入transaction_id:'.$transaction_id.'。';
         filePut($prefix.'参数apple_receipt:'.$receipt_data);
 
+        //检查重复订单
+        $check_map = [
+            'original_transaction_id' => $original_transaction_id,
+            'transaction_id'          => $transaction_id,
+        ];
+        $check_order = Db::name('user_vipxufei_task')->where($check_map)->find();
+        if($check_order){
+            filePut($prefix.'续费早已完成');
+            $this->success('充值已完成');
+        }
+
+        Db::startTrans();
         //查找订单
         $order_map = [
             'original_transaction_id' => $original_transaction_id,
         ];
+        $order_info = Db::name('user_vipxufei_task')->where($order_map)->order('expires_date_ms desc')->lock(true)->find();
+        if (!$order_info) {
+            Db::rollback();
+            filePut($prefix.'不存在的订单');
+            $this->error('不存在的订单');
+        }
+
+        // 验证支付状态
+        $result = $this->validate_apple_pay($receipt_data);
+        if (!$result['status']) {// 验证不通过
+            Db::rollback();
+            filePut($prefix.'验证'.$result['message']);
+            $this->error($result['message']);
+        }
+
+        $in_app = $result['data']['receipt']['in_app'];
+
+        $only_trans = [];
+        foreach($in_app as $key => $trans){
+            //非订阅信息,原始信息
+            if($trans['transaction_id'] == $transaction_id && $original_transaction_id == $trans['original_transaction_id'] && $trans['product_id'] == $order_info['bundle_id']){
+                $only_trans = $trans;
+                break;
+            }
+        }
+        if(empty($only_trans)){
+            Db::rollback();
+            filePut($prefix.'未找到匹配的交易,产品id'.$order_info['bundle_id']);
+            $this->error('未找到匹配的交易,产品id'.$order_info['bundle_id']);
+        }
+
+        //验证时间
+        if($only_trans['purchase_date_ms'] <= $order_info['purchase_date_ms'] || $only_trans['expires_date_ms'] <= $order_info['expires_date_ms']){
+            Db::rollback();
+            filePut($prefix.'时间对不上,返回成功,finish掉');
+            $this->success(1);
+        }
+
+        //逻辑开始
+        //先充值
+        $user_info = Db::name('user_wallet')->where('user_id',$order_info['user_id'])->lock(true)->find();
+        if($user_info['vip_endtime'] < time()){
+            //过期了
+            $vip_endtime = time() + (intval($order_info['days']) * 86400);
+        }else{
+            //追加vip
+            $vip_endtime = $user_info['vip_endtime'] + (intval($order_info['days']) * 86400);
+        }
+        $update_data = [
+            'vip_endtime'=>$vip_endtime,
+        ];
+        $result = Db::name('user_wallet')->where('user_id',$order_info['user_id'])->update($update_data);
+        if($result === false)
+        {
+            filePut($prefix.'逻辑续费vip时间失败');
+            Db::rollback();
+            $this->error('充值失败');
+        }
+
+        //添加新的一个task
+        $task_data = $order_info;
+        $task_data['createtime'] = time();
+        $task_data['apple_receipt'] = $receipt_data;
+        $task_data['in_app_one'] = json_encode($only_trans);
+        $task_data['transaction_id'] = $transaction_id;
+        $task_data['times'] = $order_info['times'] + 1;
+        $task_data['purchase_date_ms'] = $only_trans['purchase_date_ms'];
+        $task_data['expires_date_ms']  = $only_trans['expires_date_ms'];
+
+
+        $task_id = Db::name('user_vipxufei_task')->insertGetId($task_data);
+        if(!$task_id)
+        {
+            filePut($prefix.'用户添加vipxufei_task失败');
+            Db::rollback();
+            $this->error('充值失败');
+        }
 
+        Db::commit();
+        filePut($prefix.'充值成功');
+        $this->success('充值成功');
 
+        //逻辑结束
     }
 
     //金币+vip,苹果内购支付回调,app请求的接口
@@ -365,11 +458,13 @@ class Payios extends Api
                     'transaction_id' => $only_trans['transaction_id'],
                     'status' => 1,
                     'times' => 1,
-                    'original_purchase_date_ms' => $only_trans['original_purchase_date_ms'],
                     //'notification_type' => 'INITIAL_BUY'.',首次订阅',
+                    'original_purchase_date_ms' => $only_trans['original_purchase_date_ms'],
+                    'purchase_date_ms'          => $only_trans['purchase_date_ms'],
+                    'expires_date_ms'           => $only_trans['purchase_date_ms'], //第一次借用购买时间戳
                 ];
                 $task_id = Db::name('user_vipxufei_task')->insertGetId($task_data);
-                if($task_id)
+                if(!$task_id)
                 {
                     filePut($prefix.'用户添加vipxufei_task失败');
                     Db::rollback();