浏览代码

解决首次订阅回调失败

peng 1 年之前
父节点
当前提交
35fa6976bb
共有 3 个文件被更改,包括 82 次插入21 次删除
  1. 5 5
      Controller/CloudStorage.py
  2. 73 14
      Controller/PaymentCycle.py
  3. 4 2
      Model/models.py

+ 5 - 5
Controller/CloudStorage.py

@@ -986,7 +986,7 @@ class CloudStorageView(View):
                                                                                          update_time=now_time)
                                                                                          update_time=now_time)
 
 
                     order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id,
                     order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id,
-                                    promotion_rule_id=promotion_rule_id)
+                                    promotion_rule_id=promotion_rule_id, create_vod=1)
                     date_time = time.strftime("%Y-%m-%d", time.localtime())
                     date_time = time.strftime("%Y-%m-%d", time.localtime())
                     # 开通云盘服务
                     # 开通云盘服务
                     # icloud_use_qs = IcloudUseDetails.objects.filter(user_id=userid).values('id')
                     # icloud_use_qs = IcloudUseDetails.objects.filter(user_id=userid).values('id')
@@ -1160,7 +1160,7 @@ class CloudStorageView(View):
                     'uid:{},uid_bucket_id:{},update_status:{},order_id:{}'.format(uid, uid_bucket_id, update_status,
                     'uid:{},uid_bucket_id:{},update_status:{},order_id:{}'.format(uid, uid_bucket_id, update_status,
                                                                                   order_id))
                                                                                   order_id))
                 order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id,
                 order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id,
-                                promotion_rule_id=promotion_rule_id)
+                                promotion_rule_id=promotion_rule_id, create_vod=1)
                 date_time = time.strftime("%Y-%m-%d", time.localtime())
                 date_time = time.strftime("%Y-%m-%d", time.localtime())
                 # 开通AI服务
                 # 开通AI服务
                 if is_ai and use_flag:
                 if is_ai and use_flag:
@@ -1316,7 +1316,7 @@ class CloudStorageView(View):
                                                                                          update_time=now_time)
                                                                                          update_time=now_time)
 
 
                     order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id,
                     order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id,
-                                    promotion_rule_id=promotion_rule_id)
+                                    promotion_rule_id=promotion_rule_id, create_vod=1)
                     date_time = time.strftime("%Y-%m-%d", time.localtime())
                     date_time = time.strftime("%Y-%m-%d", time.localtime())
                     # 开通云盘服务
                     # 开通云盘服务
                     # icloud_use_qs = IcloudUseDetails.objects.filter(user_id=userid).values('id')
                     # icloud_use_qs = IcloudUseDetails.objects.filter(user_id=userid).values('id')
@@ -1472,7 +1472,7 @@ class CloudStorageView(View):
                     'uid:{},uid_bucket_id:{},update_status:{},order_id:{}'.format(uid, uid_bucket_id, update_status,
                     'uid:{},uid_bucket_id:{},update_status:{},order_id:{}'.format(uid, uid_bucket_id, update_status,
                                                                                   order_id))
                                                                                   order_id))
                 order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id,
                 order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id,
-                                promotion_rule_id=promotion_rule_id)
+                                promotion_rule_id=promotion_rule_id, create_vod=1)
                 date_time = time.strftime("%Y-%m-%d", time.localtime())
                 date_time = time.strftime("%Y-%m-%d", time.localtime())
                 # 开通AI服务
                 # 开通AI服务
                 if is_ai and use_flag:
                 if is_ai and use_flag:
@@ -1885,7 +1885,7 @@ class CloudStorageView(View):
                                            desc=store_qs[0]['lang__content'], payType=pay_type, payTime=now_time,
                                            desc=store_qs[0]['lang__content'], payType=pay_type, payTime=now_time,
                                            price=store_qs[0]['price'], currency=store_qs[0]['currency'],
                                            price=store_qs[0]['price'], currency=store_qs[0]['currency'],
                                            addTime=now_time, order_type=order_type,
                                            addTime=now_time, order_type=order_type,
-                                           updTime=now_time,
+                                           updTime=now_time, create_vod=1,
                                            pay_url="体验版", store_meal_name=store_meal_name,
                                            pay_url="体验版", store_meal_name=store_meal_name,
                                            commodity_code=commodity_code, commodity_type=store_qs[0]['commodity_type'],
                                            commodity_code=commodity_code, commodity_type=store_qs[0]['commodity_type'],
                                            rank_id=rank, status=1, uid_bucket_id=uid_bucket_id, ai_rank_id=1)
                                            rank_id=rank, status=1, uid_bucket_id=uid_bucket_id, ai_rank_id=1)

+ 73 - 14
Controller/PaymentCycle.py

@@ -153,6 +153,49 @@ class PaypalCycleNotify(View):
         elif operation == 'subscriptionBreakNotify':  # paypal 订阅相关回调
         elif operation == 'subscriptionBreakNotify':  # paypal 订阅相关回调
             return self.do_subscription_break_notify(request_dict, request, response)
             return self.do_subscription_break_notify(request_dict, request, response)
 
 
+    def create_vod(self, uid, expire, is_ai, now_time, channel, bucket_id, order_id, userid, username):
+        ubqs = UID_Bucket.objects.filter(uid=uid).values("id", "endTime", "use_status")
+        end_time = CommonService.calcMonthLater(expire)
+        use_flag = True
+        with transaction.atomic():
+            if ubqs.exists():
+                ubq = ubqs[0]
+                uid_bucket_id = ubq['id']
+                if ubq['use_status'] == 1 and ubq['endTime'] > now_time:  # 套餐使用中并且未过期,加入未使用的关联套餐表
+                    Unused_Uid_Meal.objects.create(uid=uid, channel=channel, addTime=now_time, is_ai=is_ai,
+                                                   order_id=order_id, expire=expire, bucket_id=bucket_id)
+                    UID_Bucket.objects.filter(id=uid_bucket_id).update(has_unused=1)
+                    use_flag = False
+                else:  # 云存服务已过期则重新开通云存服务
+                    UID_Bucket.objects.filter(id=uid_bucket_id).update(uid=uid, channel=channel,
+                                                                       bucket_id=bucket_id,
+                                                                       endTime=end_time,
+                                                                       updateTime=now_time,
+                                                                       use_status=1,
+                                                                       orderId=order_id)
+
+            else:
+                ub_cqs = UID_Bucket.objects.create \
+                    (uid=uid, channel=channel, bucket_id=bucket_id, endTime=end_time, addTime=now_time,
+                     updateTime=now_time, use_status=1, orderId=order_id)
+                uid_bucket_id = ub_cqs.id
+            dvq = Device_Info.objects.filter(UID=uid, vodPrimaryUserID='', vodPrimaryMaster='')
+            if dvq.exists():
+                dvq_set_update_dict = {
+                    'vodPrimaryUserID': userid,
+                    'vodPrimaryMaster': username
+                }
+                dvq.update(**dvq_set_update_dict)
+            # 开通AI服务
+            if is_ai and use_flag:
+                ai_service = AiService.objects.filter(uid=uid, channel=channel)
+                if ai_service.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
+                    ai_service.update(updTime=now_time, use_status=1, orders_id=order_id, endTime=end_time)
+                else:
+                    AiService.objects.create(uid=uid, channel=channel, detect_status=1, addTime=now_time,
+                                             updTime=now_time, endTime=end_time, use_status=1, orders_id=order_id)
+            return uid_bucket_id
+
     def do_paypal_cycle_return(self, request_dict, response):
     def do_paypal_cycle_return(self, request_dict, response):
         lang = request_dict.get('lang', 'en')
         lang = request_dict.get('lang', 'en')
         token = request_dict.get('token', None)
         token = request_dict.get('token', None)
@@ -283,7 +326,7 @@ class PaypalCycleNotify(View):
                 logger.info(
                 logger.info(
                     'uid:{},uid_bucket_id:{},update_status:{},order_id:{}'.format(UID, uid_bucket_id, update_status,
                     'uid:{},uid_bucket_id:{},update_status:{},order_id:{}'.format(UID, uid_bucket_id, update_status,
                                                                                   orderID))
                                                                                   orderID))
-                order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id,
+                order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id, create_vod=1,
                                 promotion_rule_id=promotion_rule_id, agreement_id=agreement_id)
                                 promotion_rule_id=promotion_rule_id, agreement_id=agreement_id)
                 # 如果存在序列号,消息提示用序列号
                 # 如果存在序列号,消息提示用序列号
                 device_name = CommonService.query_serial_with_uid(uid=UID)
                 device_name = CommonService.query_serial_with_uid(uid=UID)
@@ -412,8 +455,8 @@ class PaypalCycleNotify(View):
                                                                            'payType', 'currency', 'addTime',
                                                                            'payType', 'currency', 'addTime',
                                                                            'commodity_type', 'updTime', 'order_type',
                                                                            'commodity_type', 'updTime', 'order_type',
                                                                            'userID__userID', 'uid_bucket_id',
                                                                            'userID__userID', 'uid_bucket_id',
-                                                                           'userID__username', 'userID__region_country'
-                                                                           )
+                                                                           'userID__username', 'userID__region_country',
+                                                                           'create_vod', 'coupon_id')
             if not order_qs.exists():
             if not order_qs.exists():
                 PAY_LOGGER.info('PayPal周期扣款失败---根据order_id查询订单数据不存在')
                 PAY_LOGGER.info('PayPal周期扣款失败---根据order_id查询订单数据不存在')
                 return HttpResponse('fail', status=500)
                 return HttpResponse('fail', status=500)
@@ -425,19 +468,13 @@ class PaypalCycleNotify(View):
                 return HttpResponse('Fail', status=500)
                 return HttpResponse('Fail', status=500)
 
 
             UID = order_qs[0]['UID']
             UID = order_qs[0]['UID']
-            # PayPal周期扣款首次扣款
-            if billing_agreement.agreement_details.cycles_completed == '0':
-                order_qs.update(status=1, trade_no=paypal_transaction_id, updTime=nowTime)
-                PAY_LOGGER.info('{} PayPal周期扣款首次扣款成功'.format(UID))
-                return HttpResponse('success')
-
             if order_qs[0]['addTime'] + 9200 > nowTime:  # 避免续费订单重复支付
             if order_qs[0]['addTime'] + 9200 > nowTime:  # 避免续费订单重复支付
                 PAY_LOGGER.info('{} PayPal周期扣款失败---续费订单已创建'.format(UID))
                 PAY_LOGGER.info('{} PayPal周期扣款失败---续费订单已创建'.format(UID))
                 return HttpResponse('success')
                 return HttpResponse('success')
 
 
             desc = order_qs[0]['desc']
             desc = order_qs[0]['desc']
             pay_type = order_qs[0]['payType']
             pay_type = order_qs[0]['payType']
-            currency = order_qs[0]['currency']
+            isSelectDiscounts = order_qs[0]['isSelectDiscounts']
             commodity_code = order_qs[0]['commodity_code']
             commodity_code = order_qs[0]['commodity_code']
             commodity_type = order_qs[0]['commodity_type']
             commodity_type = order_qs[0]['commodity_type']
             plan_id = order_qs[0]['plan_id']
             plan_id = order_qs[0]['plan_id']
@@ -446,8 +483,8 @@ class PaypalCycleNotify(View):
             channel = order_qs[0]['channel']
             channel = order_qs[0]['channel']
             rank = order_qs[0]['rank']
             rank = order_qs[0]['rank']
             order_type = order_qs[0]['order_type']
             order_type = order_qs[0]['order_type']
-            store_meal_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "bucket__storeDay", "expire",
-                                                                      "is_ai")
+            coupon_id = order_qs[0]['coupon_id']
+            store_meal_qs = Store_Meal.objects.filter(id=rank).values("bucket_id", "expire", "is_ai")
             if not store_meal_qs.exists():
             if not store_meal_qs.exists():
                 PAY_LOGGER.info('{} PayPal周期扣款失败---套餐数据不存在'.format(UID))
                 PAY_LOGGER.info('{} PayPal周期扣款失败---套餐数据不存在'.format(UID))
                 return HttpResponse('fail', status=500)
                 return HttpResponse('fail', status=500)
@@ -458,10 +495,32 @@ class PaypalCycleNotify(View):
             endTime = CommonService.calcMonthLater(expire)
             endTime = CommonService.calcMonthLater(expire)
             use_flag = True
             use_flag = True
             orderID = CommonService.createOrderID()
             orderID = CommonService.createOrderID()
-            ubqs = UID_Bucket.objects.filter(uid=UID).values("id", "bucket_id", "bucket__storeDay", "bucket__region",
-                                                             "endTime", "use_status")
+            ubqs = UID_Bucket.objects.filter(uid=UID).values("id", "endTime", "use_status")
 
 
             with transaction.atomic():
             with transaction.atomic():
+                # PayPal周期扣款首次扣款
+                if billing_agreement.agreement_details.cycles_completed == '0':
+                    if order_qs[0]['create_vod']:
+                        order_qs.update(status=1, trade_no=paypal_transaction_id, updTime=nowTime)
+                    else:
+                        # 是否有促销
+                        promotion = PromotionRuleModel.objects.filter(status=1, startTime__lte=nowTime,
+                                                                      endTime__gte=nowTime).values('id', 'ruleConfig')
+                        if promotion.exists():
+                            promotion_rule_id = promotion[0]['id']
+                            expire = expire * 2
+                        if isSelectDiscounts:
+                            expire = expire * 2
+                        uid_bucket_id = self.create_vod(UID, expire, is_ai, nowTime, channel, bucketId, orderID,
+                                                        userid, username)
+                        order_qs.update(status=1, trade_no=paypal_transaction_id, updTime=nowTime,
+                                        uid_bucket_id=uid_bucket_id, create_vod=1,
+                                        promotion_rule_id=promotion_rule_id, agreement_id=agreement_id)
+                        # 核销coupon
+                        if coupon_id:
+                            CouponModel.objects.filter(id=coupon_id).update(use_status=2, update_time=nowTime)
+                    PAY_LOGGER.info('{} PayPal周期扣款首次扣款成功'.format(UID))
+                    return HttpResponse('success')
                 if ubqs.exists():
                 if ubqs.exists():
                     ubq = ubqs[0]
                     ubq = ubqs[0]
                     uid_bucket_id = ubq['id']
                     uid_bucket_id = ubq['id']

+ 4 - 2
Model/models.py

@@ -1292,6 +1292,7 @@ class Order_Model(models.Model):
     agreement_id = models.CharField(default='', blank=True, max_length=64, verbose_name=u'paypal协议id')
     agreement_id = models.CharField(default='', blank=True, max_length=64, verbose_name=u'paypal协议id')
     coupon_id = models.CharField(default='', blank=True, max_length=10, verbose_name=u'优惠券id')
     coupon_id = models.CharField(default='', blank=True, max_length=10, verbose_name=u'优惠券id')
     store_meal_name = models.CharField(default='', blank=True, max_length=64, verbose_name=u'关联套餐名')
     store_meal_name = models.CharField(default='', blank=True, max_length=64, verbose_name=u'关联套餐名')
+    create_vod = models.SmallIntegerField(default=0, verbose_name='是否生成云存服务')  # 0:未生成,1:已生成
 
 
     def __str__(self):
     def __str__(self):
         return self.orderID
         return self.orderID
@@ -4245,10 +4246,11 @@ class AppAdvertiseCampaign(models.Model):
         db_table = 'app_advertise_campaign'
         db_table = 'app_advertise_campaign'
         verbose_name = 'App广告活动表'
         verbose_name = 'App广告活动表'
 
 
+
 class OpenScreenCampaign(models.Model):
 class OpenScreenCampaign(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键')
     id = models.AutoField(primary_key=True, verbose_name='主键')
     campaign_id = models.ForeignKey(AppAdvertiseCampaign, blank=True, to_field='id', null=True,
     campaign_id = models.ForeignKey(AppAdvertiseCampaign, blank=True, to_field='id', null=True,
-                                        on_delete=models.SET_NULL, db_constraint=False)
+                                    on_delete=models.SET_NULL, db_constraint=False)
     user_id = models.CharField(default='', max_length=32, verbose_name='userID')
     user_id = models.CharField(default='', max_length=32, verbose_name='userID')
     status = models.SmallIntegerField(default=0, verbose_name='广告状态')
     status = models.SmallIntegerField(default=0, verbose_name='广告状态')
     # 0未展示 1未跳过 2已跳过 3点击广告
     # 0未展示 1未跳过 2已跳过 3点击广告
@@ -4257,4 +4259,4 @@ class OpenScreenCampaign(models.Model):
 
 
     class Meta:
     class Meta:
         db_table = 'open_screen_campaign'
         db_table = 'open_screen_campaign'
-        verbose_name = '开屏广告表'
+        verbose_name = '开屏广告表'