|
@@ -43,6 +43,7 @@ from Object.m3u8generate import PlaylistGenerator
|
|
from Service.CommonService import CommonService
|
|
from Service.CommonService import CommonService
|
|
from Service.PayService import PaymentService
|
|
from Service.PayService import PaymentService
|
|
from Service.VodHlsService import SplitVodHlsObject
|
|
from Service.VodHlsService import SplitVodHlsObject
|
|
|
|
+from Object.ApplePayObject import ApplePayObject
|
|
|
|
|
|
ssl._create_default_https_context = ssl._create_unverified_context
|
|
ssl._create_default_https_context = ssl._create_unverified_context
|
|
LOGGER = logging.getLogger('info')
|
|
LOGGER = logging.getLogger('info')
|
|
@@ -72,6 +73,8 @@ class CloudStorageView(View):
|
|
return self.do_pay_by_ali_callback(request_dict, response)
|
|
return self.do_pay_by_ali_callback(request_dict, response)
|
|
elif operation == 'dowechatnotify': # 微信支付回调
|
|
elif operation == 'dowechatnotify': # 微信支付回调
|
|
return self.do_pay_by_wechat_callback(request, response)
|
|
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令牌
|
|
elif operation == 'getsignsts': # 设备调用,获取sts令牌
|
|
ip = CommonService.get_ip_address(request)
|
|
ip = CommonService.get_ip_address(request)
|
|
return self.do_get_sign_sts(request_dict, ip, response)
|
|
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')
|
|
redis_obj.del_data(key=order_id + 'do_notify')
|
|
return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': repr(e)}))
|
|
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
|
|
@staticmethod
|
|
def do_create_pay_order(request_dict, user_id, ip, response): # 创建支付订单
|
|
def do_create_pay_order(request_dict, user_id, ip, response): # 创建支付订单
|
|
"""
|
|
"""
|
|
@@ -1559,6 +1731,21 @@ class CloudStorageView(View):
|
|
'result': response,
|
|
'result': response,
|
|
'orderId': order_id,
|
|
'orderId': order_id,
|
|
'error_code': 0})
|
|
'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): # 生成体验订单
|
|
def do_experience_order(self, request_dict, user_id, response): # 生成体验订单
|
|
"""
|
|
"""
|