peng 1 год назад
Родитель
Сommit
fd09ceb0c0
2 измененных файлов с 188 добавлено и 1 удалено
  1. 187 0
      Controller/CloudStorage.py
  2. 1 1
      Model/models.py

+ 187 - 0
Controller/CloudStorage.py

@@ -43,6 +43,7 @@ from Object.m3u8generate import PlaylistGenerator
 from Service.CommonService import CommonService
 from Service.PayService import PaymentService
 from Service.VodHlsService import SplitVodHlsObject
+from Object.ApplePayObject import ApplePayObject
 
 ssl._create_default_https_context = ssl._create_unverified_context
 LOGGER = logging.getLogger('info')
@@ -72,6 +73,8 @@ class CloudStorageView(View):
             return self.do_pay_by_ali_callback(request_dict, response)
         elif operation == 'dowechatnotify':  # 微信支付回调
             return self.do_pay_by_wechat_callback(request, response)
+        elif operation == 'doapplenotify':  # 苹果支付回调
+            return self.do_pay_by_apple_callback(request_dict, response)
         elif operation == 'getsignsts':  # 设备调用,获取sts令牌
             ip = CommonService.get_ip_address(request)
             return self.do_get_sign_sts(request_dict, ip, response)
@@ -1357,6 +1360,175 @@ class CloudStorageView(View):
             redis_obj.del_data(key=order_id + 'do_notify')
             return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': repr(e)}))
 
+    def do_pay_by_apple_callback(self, request_dict, response):
+        """
+        apple支付回调
+        @param request_dict: 请求数据
+        @request_dict paymentId: 支付id
+        @request_dict PayerID: 支付人id
+        @request_dict orderID: 订单id
+        @request_dict lang: 语言
+        @param response: 响应
+        @return: response
+        """
+        logger = logging.getLogger('info')
+        logger.info('---------进入apple异步回调')
+        receipt_data = request_dict.get('receipt_data', None)
+        order_id = request_dict.get('order_id', None)
+        lang = request_dict.get('lang', 'en')
+        if not all([receipt_data, order_id]):
+            return response.json(444)
+        logger.info("receipt_data={},order_id={}".format(receipt_data, order_id))
+
+        # redis加锁,防止订单重复
+        redis_obj = RedisObject()
+        is_lock = redis_obj.CONN.setnx(order_id + 'do_notify', 1)
+        redis_obj.CONN.expire(order_id + 'do_notify', 60)
+        if not is_lock:
+            return response.json(5)
+        order_qs = Order_Model.objects.filter(orderID=order_id, status=0)
+        if not order_qs.exists():
+            return response.json(173)
+        promotion_rule_id = ''
+        try:
+            apple_obj = ApplePayObject()
+            verify_result = apple_obj.verify(receipt_data)
+            logger.info("verify_result:{}".format(verify_result))
+
+            if not verify_result:
+                red_url = "{}web/paid2/fail.html".format(SERVER_DOMAIN_SSL)
+                if lang != 'cn':
+                    red_url = red_url.replace('fail.html', 'en_fail.html')
+                redis_obj.del_data(key=order_id + 'do_notify')
+                return HttpResponseRedirect(red_url)
+
+            trade_no = verify_result['transactionId']
+            order_list = order_qs.values("UID", "channel", "commodity_code", "rank", "isSelectDiscounts",
+                                         "userID__userID", "userID__username", "coupon_id")
+            userid = order_list[0]['userID__userID']
+            username = order_list[0]['userID__username']
+            uid = order_list[0]['UID']
+            channel = order_list[0]['channel']
+            rank = order_list[0]['rank']
+            store_qs = Store_Meal.objects.filter(id=rank).values("day", "bucket_id", "expire", "is_ai",
+                                                                 'icloud_store_meal_id')
+            if not store_qs.exists():
+                return response.json(173)
+            bucket_id = store_qs[0]['bucket_id']
+            is_ai = store_qs[0]['is_ai']
+            expire = store_qs[0]['expire']
+            uid_bucket_qs = UID_Bucket.objects.filter(uid=uid).values("id", "bucket_id",
+                                                                      "bucket__region", "endTime", "use_status")
+            # icloud_store_meal_id = store_qs[0]['icloud_store_meal_id']
+            # icloud_meal_qs = ICloudStoreMeal.objects.filter(id=icloud_store_meal_id).values('size')
+            # if not icloud_meal_qs.exists():
+            #     return response.json(173)
+            # size = icloud_meal_qs[0]['size']
+            if order_list[0]['isSelectDiscounts'] == 1:
+                expire = store_qs[0]['expire'] * 2
+            # 是否有促销
+            now_time = int(time.time())
+            promotion_rule_qs = PromotionRuleModel.objects.filter(status=1, startTime__lte=now_time,
+                                                                  endTime__gte=now_time).values('id', 'ruleConfig')
+            if promotion_rule_qs.exists():
+                promotion_rule_id = promotion_rule_qs[0]['id']
+                expire = expire * 2
+            end_time = CommonService.calcMonthLater(expire)
+            use_flag = True
+            with transaction.atomic():
+                if uid_bucket_qs.exists():
+                    uid_bucket = uid_bucket_qs.first()
+                    uid_bucket_id = uid_bucket['id']
+                    if uid_bucket['use_status'] == 1 and uid_bucket['endTime'] > now_time:  # 套餐使用中并且相同套餐叠加过期时间
+                        Unused_Uid_Meal.objects.create(uid=uid, channel=channel, addTime=now_time, order_id=order_id,
+                                                       expire=expire, is_ai=is_ai, bucket_id=bucket_id)
+                        update_status = UID_Bucket.objects.filter(id=uid_bucket_id).update(has_unused=1)
+                        use_flag = False
+                    else:
+                        update_status = UID_Bucket.objects.filter(id=uid_bucket_id).update(channel=channel,
+                                                                                           bucket_id=bucket_id,
+                                                                                           endTime=end_time,
+                                                                                           updateTime=now_time,
+                                                                                           use_status=1)
+                else:
+                    uid_bucket = UID_Bucket.objects.create(uid=uid, channel=channel, bucket_id=bucket_id,
+                                                           endTime=end_time, addTime=now_time, updateTime=now_time,
+                                                           use_status=1)
+                    update_status = True
+                    uid_bucket_id = uid_bucket.id
+
+                device_info_qs = Device_Info.objects.filter(UID=uid, vodPrimaryUserID='', vodPrimaryMaster='')
+                if device_info_qs.exists():
+                    dvq_set_update_dict = {
+                        'vodPrimaryUserID': userid,
+                        'vodPrimaryMaster': username
+                    }
+                    device_info_qs.update(**dvq_set_update_dict)
+
+                # 核销coupon
+                if order_list[0]['coupon_id']:
+                    CouponModel.objects.filter(id=order_list[0]['coupon_id']).update(use_status=2, update_time=now_time)
+                logger.info(
+                    'uid:{},uid_bucket_id:{},update_status:{},order_id:{}'.format(uid, uid_bucket_id, update_status,
+                                                                                  order_id))
+                order_qs.update(status=1, updTime=now_time, uid_bucket_id=uid_bucket_id, trade_no=trade_no,
+                                promotion_rule_id=promotion_rule_id)
+                date_time = time.strftime("%Y-%m-%d", time.localtime())
+                # 开通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)
+                # 开通云盘服务
+                # icloud_use_qs = IcloudUseDetails.objects.filter(user_id=userid).values('id')
+                # if not icloud_use_qs.exists():
+                #     bucket_qs = VodBucketModel.objects.filter(bucket='icloud').values('id')
+                #     icloud_use_qs = IcloudUseDetails.objects.create(add_time=now_time, upd_time=now_time,
+                #                                                     detect_status=1, user_id=userid,
+                #                                                     bucket_id=bucket_qs[0]['id'])
+                #     use_details_id = icloud_use_qs.id
+                #     IcloudService.objects.create(add_time=now_time, upd_time=now_time, type=0,
+                #                                  size=1, use_details_id=use_details_id)
+                # else:
+                #     use_details_id = icloud_use_qs[0]['id']
+                # IcloudService.objects.create(order_id=order_id, add_time=now_time, upd_time=now_time, type=1,
+                #                              size=size, end_time=end_time, use_details_id=use_details_id)
+                # 如果存在序列号,消息提示用序列号
+                device_info_qs = Device_Info.objects.filter(UID=uid).values('serial_number', 'Type')
+                serial_number = device_info_qs[0]['serial_number']
+                device_type = device_info_qs[0]['Type']
+                if serial_number:
+                    device_name = CommonService.get_full_serial_number(uid, serial_number, device_type)
+                else:
+                    device_name = uid
+                sys_msg_text_list = [
+                    '温馨提示:尊敬的客户,您的' + device_name + '设备在' + date_time + '已成功购买云存套餐',
+                    'Dear customer,you already subscribed the cloud storage package successfully for device ' + device_name + ' on ' + time.strftime(
+                        "%b %dth,%Y", time.localtime())]
+
+                self.do_vod_msg_notice(uid, channel, userid, lang, sys_msg_text_list, 'SMS_219738485')
+
+                red_url = "{}web/paid2/success.html".format(SERVER_DOMAIN_SSL)
+                if lang != 'cn':
+                    red_url = red_url.replace('success.html', 'en_success.html')
+                redis_obj.del_data(key=order_id + 'do_notify')
+                return HttpResponseRedirect(red_url)
+        except Exception as e:
+            logger.info('apple支付失败:----')
+            logger.info("错误行数:{errLine}".format(errLine=e.__traceback__.tb_lineno))
+            logger.info(repr(e))
+            if order_qs:
+                order_qs.update(status=10, promotion_rule_id=promotion_rule_id)
+            red_url = "{}web/paid2/fail.html".format(SERVER_DOMAIN_SSL)
+            if lang != 'cn':
+                red_url = red_url.replace('fail.html', 'en_fail.html')
+            redis_obj.del_data(key=order_id + 'do_notify')
+            return HttpResponseRedirect(red_url)
+
+
     @staticmethod
     def do_create_pay_order(request_dict, user_id, ip, response):  # 创建支付订单
         """
@@ -1559,6 +1731,21 @@ class CloudStorageView(View):
                                                   'result': response,
                                                   'orderId': order_id,
                                                   'error_code': 0})
+        elif pay_type == 4:
+            notify_url = "{}cloudstorage/doapplenotify".format(SERVER_DOMAIN_SSL)
+            content = CommonService.Package_Type(0, content)  # 云存套餐
+
+            # 回调函数
+            Order_Model.objects.create(orderID=order_id, UID=uid, channel=channel, userID_id=user_id,
+                                       desc=content, payType=pay_type, payTime=now_time,
+                                       price=price, currency=currency, addTime=now_time, updTime=now_time,
+                                       isSelectDiscounts=is_select_discount,
+                                       commodity_code=commodity_code, commodity_type=commodity_type,
+                                       rank_id=rank,
+                                       ai_rank_id=1, store_meal_name=store_meal_name)
+            return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
+                                                  'result': {"redirectUrl": notify_url, "orderID": order_id},
+                                                  'error_code': 0})
 
     def do_experience_order(self, request_dict, user_id, response):  # 生成体验订单
         """

+ 1 - 1
Model/models.py

@@ -1497,7 +1497,7 @@ class App_Colophon(models.Model):
 class Order_Model(models.Model):
     orderID = models.CharField(blank=True, max_length=20, primary_key=True, verbose_name=u'订单id')
     paymentID = models.CharField(blank=True, max_length=64, default='', verbose_name='付款id')
-    trade_no = models.CharField(blank=True, max_length=32, default='', verbose_name='第三方订单号')
+    trade_no = models.CharField(blank=True, max_length=64, default='', verbose_name='第三方订单号')
     userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE)  # 订单关联用户
     UID = models.CharField(max_length=20, verbose_name='设备UID')
     channel = models.SmallIntegerField(default=0, verbose_name=u'通道数')