|
@@ -1,19 +1,16 @@
|
|
-import time
|
|
|
|
-import boto3
|
|
|
|
import logging
|
|
import logging
|
|
-import botocore
|
|
|
|
-import paypalrestsdk
|
|
|
|
|
|
+import time
|
|
|
|
+from urllib.parse import quote, parse_qs, unquote
|
|
|
|
|
|
-from botocore import client
|
|
|
|
-from boto3.session import Session
|
|
|
|
|
|
+import paypalrestsdk
|
|
from django.db import transaction
|
|
from django.db import transaction
|
|
from django.db.models import Q, F, Sum
|
|
from django.db.models import Q, F, Sum
|
|
-from django.views.generic.base import View
|
|
|
|
from django.http import HttpResponseRedirect, HttpResponse
|
|
from django.http import HttpResponseRedirect, HttpResponse
|
|
|
|
+from django.views.generic.base import View
|
|
|
|
|
|
-from Ansjer.config import PAYPAL_CRD, SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, DETECT_PUSH_DOMAINS
|
|
|
|
|
|
+from Ansjer.config import PAYPAL_CRD, SERVER_DOMAIN_SSL, DETECT_PUSH_DOMAINS
|
|
from Model.models import Device_Info, Order_Model, ExperienceAiModel, Pay_Type, CDKcontextModel, UidPushModel, \
|
|
from Model.models import Device_Info, Order_Model, ExperienceAiModel, Pay_Type, CDKcontextModel, UidPushModel, \
|
|
- AiStoreMeal, AiService, UidSetModel, Ai_Push_Info
|
|
|
|
|
|
+ AiStoreMeal, AiService, UidSetModel
|
|
from Object.AliPayObject import AliPayObject
|
|
from Object.AliPayObject import AliPayObject
|
|
from Object.ETkObject import ETkObject
|
|
from Object.ETkObject import ETkObject
|
|
from Object.RedisObject import RedisObject
|
|
from Object.RedisObject import RedisObject
|
|
@@ -21,8 +18,6 @@ from Object.ResponseObject import ResponseObject
|
|
from Object.TokenObject import TokenObject
|
|
from Object.TokenObject import TokenObject
|
|
from Object.WechatPayObject import WechatPayObject
|
|
from Object.WechatPayObject import WechatPayObject
|
|
from Service.CommonService import CommonService
|
|
from Service.CommonService import CommonService
|
|
-from Service.ModelService import ModelService
|
|
|
|
-from urllib.parse import quote, parse_qs, unquote
|
|
|
|
|
|
|
|
|
|
|
|
class AiView(View):
|
|
class AiView(View):
|
|
@@ -45,6 +40,7 @@ class AiView(View):
|
|
response = ResponseObject()
|
|
response = ResponseObject()
|
|
if operation is None:
|
|
if operation is None:
|
|
return response.json(444, 'error path')
|
|
return response.json(444, 'error path')
|
|
|
|
+ # 支付回调接口
|
|
elif operation == 'doPayPalCallBack': # paypal支付回调
|
|
elif operation == 'doPayPalCallBack': # paypal支付回调
|
|
return self.do_pay_by_paypal_callback(request_dict, response)
|
|
return self.do_pay_by_paypal_callback(request_dict, response)
|
|
elif operation == 'doAlipayCallBack': # 支付宝支付回调
|
|
elif operation == 'doAlipayCallBack': # 支付宝支付回调
|
|
@@ -58,29 +54,265 @@ class AiView(View):
|
|
if tko.code != 0:
|
|
if tko.code != 0:
|
|
return response.json(tko.code)
|
|
return response.json(tko.code)
|
|
userID = tko.userID
|
|
userID = tko.userID
|
|
- if operation == 'createpayorder': # 创建支付订单
|
|
|
|
- return self.do_create_pay_order(request_dict, request, userID, response)
|
|
|
|
- elif operation == 'getAiStatus': # 获取AI开关状态
|
|
|
|
- return self.get_ai_status(request_dict, response)
|
|
|
|
- elif operation == 'changeaistatus': # 修改AI开关状态
|
|
|
|
- return self.do_change_ai_status(userID, request_dict, response)
|
|
|
|
- elif operation == 'commoditylist': # 获取AI套餐列表
|
|
|
|
|
|
+
|
|
|
|
+ # 套餐相关接口
|
|
|
|
+ if operation == 'commoditylist': # 查询套餐列表
|
|
return self.do_commodity_list(request_dict, response)
|
|
return self.do_commodity_list(request_dict, response)
|
|
- elif operation == 'queryInfo': # 查询消息列表
|
|
|
|
- return self.queryInfo(userID, request_dict, response)
|
|
|
|
- elif operation == 'readInfo': # 消息已读
|
|
|
|
- return self.readInfo(userID, request_dict, response)
|
|
|
|
- elif operation == 'deleteInfo': # 删除消息
|
|
|
|
- return self.deleteInfo(userID, request_dict, response)
|
|
|
|
- elif operation == 'queryorderlist': # 查询订单
|
|
|
|
|
|
+ elif operation == 'experienceOrder': # 体验套餐
|
|
|
|
+ return self.experience_order(request_dict, userID, response)
|
|
|
|
+ elif operation == 'createpayorder': # 创建支付订单
|
|
|
|
+ return self.do_create_pay_order(request_dict, request, userID, response)
|
|
|
|
+ elif operation == 'queryorderlist': # 查询订单列表
|
|
return self.do_querylist(userID, request_dict, response)
|
|
return self.do_querylist(userID, request_dict, response)
|
|
- elif operation == 'getUsingPackage': # 获取当前使用的ai套餐
|
|
|
|
|
|
+ elif operation == 'getUsingPackage': # 获取当前使用套餐
|
|
return self.getUsingPackage(request_dict, userID, response)
|
|
return self.getUsingPackage(request_dict, userID, response)
|
|
- elif operation == 'experienceOrder': # 体验AI套餐
|
|
|
|
- return self.experience_order(request_dict, userID, response)
|
|
|
|
|
|
+ # 开关相关接口
|
|
|
|
+ elif operation == 'getAiStatus': # 获取开关状态
|
|
|
|
+ return self.get_ai_status(request_dict, response)
|
|
|
|
+ elif operation == 'changeaistatus': # 修改开关状态
|
|
|
|
+ return self.do_change_ai_status(userID, request_dict, response)
|
|
else:
|
|
else:
|
|
return response.json(414)
|
|
return response.json(414)
|
|
|
|
|
|
|
|
+ @staticmethod
|
|
|
|
+ def do_commodity_list(request_dict, response):
|
|
|
|
+ """
|
|
|
|
+ 查询套餐列表
|
|
|
|
+ @param request_dict: 请求数据
|
|
|
|
+ @request_dict uid: uid
|
|
|
|
+ @request_dict lang: 语言
|
|
|
|
+ @param response: 响应
|
|
|
|
+ @return: response
|
|
|
|
+ """
|
|
|
|
+ uid = request_dict.get('uid', None)
|
|
|
|
+ lang = request_dict.get('lang', 'en')
|
|
|
|
+
|
|
|
|
+ try:
|
|
|
|
+ # DVR/NVR设备暂不返回套餐列表
|
|
|
|
+ device_info_qs = Device_Info.objects.filter(Q(UID=uid), Q(Type__lte=4) | Q(Type=10001))
|
|
|
|
+ if device_info_qs.exists():
|
|
|
|
+ return response.json(0)
|
|
|
|
+
|
|
|
|
+ # 没体验过的设备只返回体验套餐,体验过的不返回体验套餐
|
|
|
|
+ exc_ai_qs = ExperienceAiModel.objects.filter(uid=uid, experience_type=0)
|
|
|
|
+ if exc_ai_qs.exists():
|
|
|
|
+ ai_meal_qs = AiStoreMeal.objects.filter(~Q(pay_type=10))
|
|
|
|
+ else:
|
|
|
|
+ ai_meal_qs = AiStoreMeal.objects.filter(pay_type=10)
|
|
|
|
+
|
|
|
|
+ # 查询套餐数据
|
|
|
|
+ ai_meal_qs = ai_meal_qs.filter(is_show=1, lang__lang=lang). \
|
|
|
|
+ annotate(ai_meal_id=F('id'), title=F('lang__title'), content=F('lang__content')). \
|
|
|
|
+ values('ai_meal_id', 'title', 'content', 'price', 'effective_day', 'currency', 'virtual_price',
|
|
|
|
+ 'symbol', 'is_beta')
|
|
|
|
+ if not ai_meal_qs.exists():
|
|
|
|
+ return response.json(0)
|
|
|
|
+
|
|
|
|
+ # 查询每种套餐的所有支付方式
|
|
|
|
+ ai_meal_list = list(ai_meal_qs)
|
|
|
|
+ for ai_meal in ai_meal_list:
|
|
|
|
+ pay_type_qs = Pay_Type.objects.filter(aistoremeal=ai_meal['ai_meal_id']).values('id', 'payment')
|
|
|
|
+ ai_meal['pay_type'] = list(pay_type_qs)
|
|
|
|
+ result = {
|
|
|
|
+ 'meals': ai_meal_list,
|
|
|
|
+ }
|
|
|
|
+ return response.json(0, result)
|
|
|
|
+ except Exception as e:
|
|
|
|
+ return response.json(500, repr(e))
|
|
|
|
+
|
|
|
|
+ @staticmethod
|
|
|
|
+ def experience_order(request_dict, userID, response):
|
|
|
|
+ """
|
|
|
|
+ 体验套餐
|
|
|
|
+ @param request_dict: 请求数据
|
|
|
|
+ @request_dict uid: uid
|
|
|
|
+ @request_dict channel: 通道
|
|
|
|
+ @request_dict pay_type: 支付类型
|
|
|
|
+ @request_dict rank: 套餐id
|
|
|
|
+ @request_dict cdk: 兑换码
|
|
|
|
+ @request_dict lang: 语言
|
|
|
|
+ @param userID: 用户id
|
|
|
|
+ @param response: 响应
|
|
|
|
+ @return: response
|
|
|
|
+ """
|
|
|
|
+ logger = logging.getLogger('info')
|
|
|
|
+ uid = request_dict.get('uid', None)
|
|
|
|
+ channel = request_dict.get('channel', None)
|
|
|
|
+ pay_type = int(request_dict.get('pay_type', 10))
|
|
|
|
+ rank = request_dict.get('rank', None)
|
|
|
|
+ cdk = request_dict.get('cdk', None)
|
|
|
|
+ lang = request_dict.get('lang', 'en')
|
|
|
|
+
|
|
|
|
+ # 使用redis设置唯一key加锁
|
|
|
|
+ redisObj = RedisObject()
|
|
|
|
+ redis_key = uid + 'do_experience_ai_order'
|
|
|
|
+ isLock = redisObj.CONN.setnx(redis_key, 1)
|
|
|
|
+ redisObj.CONN.expire(redis_key, 60)
|
|
|
|
+ if not isLock:
|
|
|
|
+ return response.json(5)
|
|
|
|
+
|
|
|
|
+ try:
|
|
|
|
+ if pay_type == 10: # 判断是否已体验过套餐
|
|
|
|
+ exc_ai_qs = ExperienceAiModel.objects.filter(uid=uid, experience_type=0)
|
|
|
|
+ if exc_ai_qs.exists():
|
|
|
|
+ return response.json(5)
|
|
|
|
+
|
|
|
|
+ if cdk is not None and pay_type == 11: # 兑换码体验
|
|
|
|
+ cdk_qs = CDKcontextModel.objects.filter(cdk=cdk).values('is_activate', 'rank__id',
|
|
|
|
+ 'rank__commodity_code')
|
|
|
|
+ if not cdk_qs.exists():
|
|
|
|
+ return response.json(10040)
|
|
|
|
+ if cdk_qs[0]['is_activate'] == 1:
|
|
|
|
+ return response.json(10039)
|
|
|
|
+ rank = cdk_qs[0]['rank__id']
|
|
|
|
+
|
|
|
|
+ if not all([uid, channel, rank]):
|
|
|
|
+ redisObj.del_data(key=redis_key)
|
|
|
|
+ return response.json(444)
|
|
|
|
+
|
|
|
|
+ # 判断是否为主用户操作
|
|
|
|
+ device_info_qs = Device_Info.objects.filter(Q(UID=uid) & ~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
|
|
|
|
+ if device_info_qs.exists():
|
|
|
|
+ if device_info_qs[0]['vodPrimaryUserID'] != userID:
|
|
|
|
+ if pay_type == 10:
|
|
|
|
+ return response.json(10035)
|
|
|
|
+ if pay_type == 11:
|
|
|
|
+ return response.json(10036)
|
|
|
|
+
|
|
|
|
+ dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1)
|
|
|
|
+ if not dv_qs.exists():
|
|
|
|
+ return response.json(12)
|
|
|
|
+
|
|
|
|
+ orderID = CommonService.createOrderID()
|
|
|
|
+ nowTime = int(time.time())
|
|
|
|
+ ai_store_meal_qs = AiStoreMeal.objects.filter(id=rank, lang__lang=lang, is_show=1). \
|
|
|
|
+ values('lang__content', 'price', 'currency', 'effective_day')
|
|
|
|
+ if not ai_store_meal_qs.exists():
|
|
|
|
+ return response.json(173)
|
|
|
|
+
|
|
|
|
+ effective_day = ai_store_meal_qs[0]['effective_day']
|
|
|
|
+ endTime = int(time.time()) + effective_day * 24 * 60 * 60 # 套餐结束时间
|
|
|
|
+
|
|
|
|
+ # 查询中文套餐名
|
|
|
|
+ ai_cn_store_meal_qs = AiStoreMeal.objects.filter(id=rank, lang__lang='cn', is_show=1). \
|
|
|
|
+ values('lang__content', 'lang__title')
|
|
|
|
+ if ai_cn_store_meal_qs.exists():
|
|
|
|
+ store_meal_name = ai_cn_store_meal_qs[0]['lang__title'] + '-' + ai_cn_store_meal_qs[0]['lang__content']
|
|
|
|
+ else:
|
|
|
|
+ store_meal_name = '未知套餐'
|
|
|
|
+
|
|
|
|
+ with transaction.atomic():
|
|
|
|
+ # 订单表创建数据
|
|
|
|
+ Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
|
|
|
|
+ desc=ai_store_meal_qs[0]['lang__content'], payType=pay_type, payTime=nowTime,
|
|
|
|
+ price=ai_store_meal_qs[0]['price'], currency=ai_store_meal_qs[0]['currency'],
|
|
|
|
+ addTime=nowTime, updTime=nowTime, pay_url='AI体验',
|
|
|
|
+ store_meal_name=store_meal_name, order_type=1,
|
|
|
|
+ rank_id=1, ai_rank_id=rank, status=1)
|
|
|
|
+ # ai服务表创建数据
|
|
|
|
+ AiService.objects.create(uid=uid, channel=channel, orders_id=orderID, detect_status=1, endTime=endTime,
|
|
|
|
+ addTime=nowTime, updTime=nowTime, use_status=1)
|
|
|
|
+ logger.info('{}成功开通AI体验,结束时间{}'.format(uid, endTime))
|
|
|
|
+ if pay_type == 10:
|
|
|
|
+ ExperienceAiModel.objects.create(
|
|
|
|
+ experience_type=0,
|
|
|
|
+ uid=uid,
|
|
|
|
+ do_time=nowTime
|
|
|
|
+ )
|
|
|
|
+ elif pay_type == 11:
|
|
|
|
+ CDKcontextModel.objects.filter(cdk=cdk).update(is_activate=1, order=orderID)
|
|
|
|
+
|
|
|
|
+ redisObj.del_data(key=redis_key)
|
|
|
|
+ pay_ok_url = "{}cloudstorage/payOK?paytype={}&lang={}".format(SERVER_DOMAIN_SSL, pay_type, lang)
|
|
|
|
+ return response.json(0, pay_ok_url)
|
|
|
|
+ except Exception as e:
|
|
|
|
+ print(e)
|
|
|
|
+ redisObj.del_data(key=redis_key)
|
|
|
|
+ return response.json(474)
|
|
|
|
+
|
|
|
|
+ def do_create_pay_order(self, request_dict, request, userID, response):
|
|
|
|
+ """
|
|
|
|
+ 创建支付订单
|
|
|
|
+ @param request_dict: 请求数据
|
|
|
|
+ @param request: 请求体
|
|
|
|
+ @request_dict uid: uid
|
|
|
|
+ @request_dict channel: 通道
|
|
|
|
+ @request_dict pay_type: 支付类型
|
|
|
|
+ @request_dict rank: 套餐id
|
|
|
|
+ @request_dict lang: 语言
|
|
|
|
+ @param userID: 用户id
|
|
|
|
+ @param response: 响应
|
|
|
|
+ @return: response
|
|
|
|
+ """
|
|
|
|
+ uid = request_dict.get('uid', None)
|
|
|
|
+ channel = request_dict.get('channel', None)
|
|
|
|
+ pay_type = int(request_dict.get('pay_type', 1))
|
|
|
|
+ rank = request_dict.get('rank', None)
|
|
|
|
+ lang = request_dict.get('lang', 'en')
|
|
|
|
+ if not all([uid, channel, rank]):
|
|
|
|
+ return response.json(444)
|
|
|
|
+
|
|
|
|
+ try:
|
|
|
|
+ # 获取ai套餐数据
|
|
|
|
+ ai_sm_qs = AiStoreMeal.objects.filter(id=rank, pay_type=pay_type, is_show=1, lang__lang=lang). \
|
|
|
|
+ values('lang__title', 'lang__content', 'currency', 'price')
|
|
|
|
+ if not ai_sm_qs.exists():
|
|
|
|
+ return response.json(173)
|
|
|
|
+ title = ai_sm_qs[0]['lang__title']
|
|
|
|
+ content = ai_sm_qs[0]['lang__content']
|
|
|
|
+ currency = ai_sm_qs[0]['currency']
|
|
|
|
+ price = ai_sm_qs[0]['price']
|
|
|
|
+
|
|
|
|
+ # 查询中文套餐名
|
|
|
|
+ ai_store_meal_qs = AiStoreMeal.objects.filter(id=rank, is_show=1, lang__lang='cn'). \
|
|
|
|
+ values('lang__title', 'lang__content')
|
|
|
|
+ if ai_store_meal_qs.exists():
|
|
|
|
+ store_meal_name = ai_store_meal_qs[0]['lang__title'] + '-' + ai_store_meal_qs[0]['lang__content']
|
|
|
|
+ else:
|
|
|
|
+ store_meal_name = '未知套餐'
|
|
|
|
+
|
|
|
|
+ nowTime = int(time.time())
|
|
|
|
+ orderID = CommonService.createOrderID()
|
|
|
|
+ price = round(float(price), 2)
|
|
|
|
+
|
|
|
|
+ order_dict = {
|
|
|
|
+ 'orderID': orderID,
|
|
|
|
+ 'UID': uid,
|
|
|
|
+ 'channel': channel,
|
|
|
|
+ 'userID_id': userID,
|
|
|
|
+ 'desc': content,
|
|
|
|
+ 'payType': pay_type,
|
|
|
|
+ 'payTime': nowTime,
|
|
|
|
+ 'price': price,
|
|
|
|
+ 'currency': currency,
|
|
|
|
+ 'addTime': nowTime,
|
|
|
|
+ 'updTime': nowTime,
|
|
|
|
+ 'ai_rank_id': rank,
|
|
|
|
+ 'rank_id': 1,
|
|
|
|
+ 'order_type': 1,
|
|
|
|
+ 'store_meal_name': store_meal_name
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ # 创建订单数据和返回支付回调链接
|
|
|
|
+ if pay_type == 1: # PayPal支付
|
|
|
|
+ order_dict['paymentID'], order_dict['pay_url'] = self.create_paypal_payment(lang, orderID, price,
|
|
|
|
+ currency, content, response)
|
|
|
|
+ res_data = {'redirectUrl': order_dict['pay_url'], 'orderID': orderID}
|
|
|
|
+ elif pay_type == 2: # 支付宝
|
|
|
|
+ order_dict['pay_url'] = self.create_alipay_payment(lang, orderID, price, title, content, response)
|
|
|
|
+ res_data = {'redirectUrl': order_dict['pay_url'], 'orderID': orderID}
|
|
|
|
+ elif pay_type == 3: # 微信支付
|
|
|
|
+ ip = CommonService.get_ip_address(request)
|
|
|
|
+ order_dict['pay_url'], sign_params = self.create_wechat_payment(lang, orderID, price, ip, content,
|
|
|
|
+ response)
|
|
|
|
+ res_data = {'redirectUrl': order_dict['pay_url'], 'orderID': orderID, 'result': sign_params}
|
|
|
|
+ else:
|
|
|
|
+ return response.json(444, {'param': 'pay_type'})
|
|
|
|
+ Order_Model.objects.create(**order_dict)
|
|
|
|
+ return response.json(0, res_data)
|
|
|
|
+ except Exception as e:
|
|
|
|
+ return response.json(500, repr(e))
|
|
|
|
+
|
|
@staticmethod
|
|
@staticmethod
|
|
def get_ai_status(request_dict, response):
|
|
def get_ai_status(request_dict, response):
|
|
"""
|
|
"""
|
|
@@ -238,46 +470,6 @@ class AiView(View):
|
|
except Exception as e:
|
|
except Exception as e:
|
|
return response.json(500, repr(e))
|
|
return response.json(500, repr(e))
|
|
|
|
|
|
- # 获取AI套餐列表
|
|
|
|
- @staticmethod
|
|
|
|
- def do_commodity_list(request_dict, response):
|
|
|
|
- uid = request_dict.get('uid', None)
|
|
|
|
- lang = request_dict.get('lang', 'en')
|
|
|
|
-
|
|
|
|
- try:
|
|
|
|
- # DVR/NVR设备暂不返回套餐列表
|
|
|
|
- device_info_qs = Device_Info.objects.filter(Q(UID=uid), Q(Type__lte=4) | Q(Type=10001))
|
|
|
|
- if device_info_qs.exists():
|
|
|
|
- return response.json(0)
|
|
|
|
-
|
|
|
|
- # 没免费体验过的设备只返回体验套餐数据,体验过的不再返回
|
|
|
|
- exc_ai_qs = ExperienceAiModel.objects.filter(uid=uid, experience_type=0)
|
|
|
|
- if exc_ai_qs.exists():
|
|
|
|
- ai_meal_qs = AiStoreMeal.objects.filter(~Q(pay_type=10))
|
|
|
|
- else:
|
|
|
|
- ai_meal_qs = AiStoreMeal.objects.filter(pay_type=10)
|
|
|
|
-
|
|
|
|
- # 查询套餐数据
|
|
|
|
- ai_meal_qs = ai_meal_qs.filter(is_show=1, lang__lang=lang). \
|
|
|
|
- annotate(ai_meal_id=F('id'), title=F('lang__title'), content=F('lang__content')). \
|
|
|
|
- values("ai_meal_id", "title", "content", "price", "effective_day", "currency", "virtual_price",
|
|
|
|
- "symbol", "is_beta")
|
|
|
|
- if not ai_meal_qs.exists():
|
|
|
|
- return response.json(0)
|
|
|
|
-
|
|
|
|
- # 查询每种套餐的所有支付方式
|
|
|
|
- ai_meal_list = list(ai_meal_qs)
|
|
|
|
- for ai_meal in ai_meal_list:
|
|
|
|
- pay_type_qs = Pay_Type.objects.filter(aistoremeal=ai_meal['ai_meal_id']).values('id', 'payment')
|
|
|
|
- ai_meal['pay_type'] = list(pay_type_qs)
|
|
|
|
- result = {
|
|
|
|
- 'meals': ai_meal_list,
|
|
|
|
- }
|
|
|
|
- return response.json(0, result)
|
|
|
|
- except Exception as e:
|
|
|
|
- print(e)
|
|
|
|
- return response.json(500, repr(e))
|
|
|
|
-
|
|
|
|
def do_querylist(self, userID, request_dict, response):
|
|
def do_querylist(self, userID, request_dict, response):
|
|
page = request_dict.get('page', None)
|
|
page = request_dict.get('page', None)
|
|
line = request_dict.get('line', None)
|
|
line = request_dict.get('line', None)
|
|
@@ -363,181 +555,6 @@ class AiView(View):
|
|
print(e)
|
|
print(e)
|
|
return response.json(500, repr(e))
|
|
return response.json(500, repr(e))
|
|
|
|
|
|
- # 体验AI套餐
|
|
|
|
- @staticmethod
|
|
|
|
- def experience_order(request_dict, userID, response):
|
|
|
|
- logger = logging.getLogger('info')
|
|
|
|
- uid = request_dict.get('uid', None)
|
|
|
|
- channel = request_dict.get('channel', None)
|
|
|
|
- pay_type = int(request_dict.get('pay_type', None))
|
|
|
|
- rank = request_dict.get('rank', None)
|
|
|
|
- cdk = request_dict.get('cdk', None)
|
|
|
|
- lang = request_dict.get('lang', 'en')
|
|
|
|
-
|
|
|
|
- # 使用redis设置唯一key加锁
|
|
|
|
- redisObj = RedisObject()
|
|
|
|
- redis_key = uid + 'do_experience_ai_order'
|
|
|
|
- isLock = redisObj.CONN.setnx(redis_key, 1)
|
|
|
|
- redisObj.CONN.expire(redis_key, 60)
|
|
|
|
- if not isLock:
|
|
|
|
- return response.json(5)
|
|
|
|
- try:
|
|
|
|
- if pay_type == 10: # 判断是否已体验过套餐
|
|
|
|
- exc_ai_qs = ExperienceAiModel.objects.filter(uid=uid, experience_type=0)
|
|
|
|
- if exc_ai_qs.exists():
|
|
|
|
- return response.json(5)
|
|
|
|
-
|
|
|
|
- if cdk is not None and pay_type == 11:
|
|
|
|
- cdk_qs = CDKcontextModel.objects.filter(cdk=cdk).values('is_activate', 'rank__id',
|
|
|
|
- 'rank__commodity_code')
|
|
|
|
- if not cdk_qs.exists():
|
|
|
|
- return response.json(10040)
|
|
|
|
- if cdk_qs[0]['is_activate'] == 1:
|
|
|
|
- return response.json(10039)
|
|
|
|
- rank = cdk_qs[0]['rank__id']
|
|
|
|
-
|
|
|
|
- if uid is None or channel is None or pay_type is None or rank is None:
|
|
|
|
- redisObj.del_data(key=redis_key)
|
|
|
|
- return response.json(444)
|
|
|
|
-
|
|
|
|
- # 判断是否为主用户操作
|
|
|
|
- device_info_qs = Device_Info.objects.filter(Q(UID=uid) & ~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
|
|
|
|
- if device_info_qs.exists():
|
|
|
|
- if device_info_qs[0]['vodPrimaryUserID'] != userID:
|
|
|
|
- if pay_type == 10:
|
|
|
|
- return response.json(10035)
|
|
|
|
- if pay_type == 11:
|
|
|
|
- return response.json(10036)
|
|
|
|
-
|
|
|
|
- dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1)
|
|
|
|
- if not dv_qs.exists():
|
|
|
|
- return response.json(12)
|
|
|
|
-
|
|
|
|
- orderID = CommonService.createOrderID()
|
|
|
|
- nowTime = int(time.time())
|
|
|
|
- ai_store_meal_qs = AiStoreMeal.objects.filter(id=rank, lang__lang=lang, is_show=1). \
|
|
|
|
- values('lang__content', 'price', 'currency', 'effective_day')
|
|
|
|
- if not ai_store_meal_qs.exists():
|
|
|
|
- return response.json(173)
|
|
|
|
-
|
|
|
|
- effective_day = ai_store_meal_qs[0]['effective_day']
|
|
|
|
- endTime = int(time.time()) + effective_day * 24 * 60 * 60 # 套餐结束时间
|
|
|
|
- ai_cn_store_meal_qs = AiStoreMeal.objects.filter(id=rank, lang__lang='cn', is_show=1). \
|
|
|
|
- values('lang__content', 'lang__title')
|
|
|
|
- if ai_cn_store_meal_qs.exists():
|
|
|
|
- store_meal_name = ai_cn_store_meal_qs[0]['lang__title'] + '-' + ai_cn_store_meal_qs[0]['lang__content']
|
|
|
|
- else:
|
|
|
|
- store_meal_name = '未知套餐'
|
|
|
|
- with transaction.atomic():
|
|
|
|
- # 订单表创建数据
|
|
|
|
- Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
|
|
|
|
- desc=ai_store_meal_qs[0]['lang__content'], payType=pay_type, payTime=nowTime,
|
|
|
|
- price=ai_store_meal_qs[0]['price'], currency=ai_store_meal_qs[0]['currency'],
|
|
|
|
- addTime=nowTime, updTime=nowTime, pay_url='AI体验',
|
|
|
|
- store_meal_name=store_meal_name, order_type=1,
|
|
|
|
- rank_id=1, ai_rank_id=rank, status=1)
|
|
|
|
- # ai服务表创建数据
|
|
|
|
- AiService.objects.create(uid=uid, channel=channel, orders_id=orderID, detect_status=1, endTime=endTime,
|
|
|
|
- addTime=nowTime, updTime=nowTime, use_status=1)
|
|
|
|
- logger.info('{}成功开通AI体验,结束时间{}'.format(uid, endTime))
|
|
|
|
- if pay_type == 10:
|
|
|
|
- ExperienceAiModel.objects.create(
|
|
|
|
- experience_type=0,
|
|
|
|
- uid=uid,
|
|
|
|
- do_time=nowTime
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- elif pay_type == 11:
|
|
|
|
- CDKcontextModel.objects.filter(cdk=cdk).update(is_activate=1, order=orderID)
|
|
|
|
-
|
|
|
|
- redisObj.del_data(key=redis_key)
|
|
|
|
- pay_ok_url = "{}cloudstorage/payOK?paytype={}&lang={}".format(SERVER_DOMAIN_SSL, pay_type, lang)
|
|
|
|
- return response.json(0, pay_ok_url)
|
|
|
|
- except Exception as e:
|
|
|
|
- print(e)
|
|
|
|
- redisObj.del_data(key=redis_key)
|
|
|
|
- return response.json(474)
|
|
|
|
-
|
|
|
|
- def do_create_pay_order(self, request_dict, request, userID, response):
|
|
|
|
- uid = request_dict.get('uid', None)
|
|
|
|
- channel = request_dict.get('channel', None)
|
|
|
|
- pay_type = int(request_dict.get('pay_type', 1))
|
|
|
|
- rank = request_dict.get('rank', None)
|
|
|
|
- lang = request_dict.get('lang', 'en')
|
|
|
|
- if not uid or not channel or not pay_type or not rank:
|
|
|
|
- return response.json(444)
|
|
|
|
-
|
|
|
|
- try:
|
|
|
|
- # 判断是否为主用户
|
|
|
|
- # dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1).values(
|
|
|
|
- # 'vodPrimaryUserID',
|
|
|
|
- # 'vodPrimaryMaster')
|
|
|
|
- # if not dv_qs.exists():
|
|
|
|
- # return response.json(12)
|
|
|
|
-
|
|
|
|
- # dvq = Device_Info.objects.filter(UID=uid)
|
|
|
|
- # dvq = dvq.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
|
|
|
|
- # if dvq.exists():
|
|
|
|
- # if dvq[0]['vodPrimaryUserID'] != userID:
|
|
|
|
- # return response.json(10033)
|
|
|
|
-
|
|
|
|
- # 获取ai套餐数据
|
|
|
|
- ai_sm_qs = AiStoreMeal.objects.filter(id=rank, pay_type=pay_type, is_show=1, lang__lang=lang). \
|
|
|
|
- values('lang__title', 'lang__content', 'currency', 'price')
|
|
|
|
- if not ai_sm_qs.exists():
|
|
|
|
- return response.json(173)
|
|
|
|
- title = ai_sm_qs[0]['lang__title']
|
|
|
|
- content = ai_sm_qs[0]['lang__content']
|
|
|
|
- currency = ai_sm_qs[0]['currency']
|
|
|
|
- price = ai_sm_qs[0]['price']
|
|
|
|
- ai_store_meal_qs = AiStoreMeal.objects.filter(id=rank, is_show=1, lang__lang='cn'). \
|
|
|
|
- values('lang__title', 'lang__content')
|
|
|
|
- if ai_store_meal_qs.exists():
|
|
|
|
- store_meal_name = ai_store_meal_qs[0]['lang__title'] + '-' + ai_store_meal_qs[0]['lang__content']
|
|
|
|
- else:
|
|
|
|
- store_meal_name = '未知套餐'
|
|
|
|
- nowTime = int(time.time())
|
|
|
|
- orderID = CommonService.createOrderID()
|
|
|
|
- price = round(float(price), 2)
|
|
|
|
-
|
|
|
|
- order_dict = {
|
|
|
|
- 'orderID': orderID,
|
|
|
|
- 'UID': uid,
|
|
|
|
- 'channel': channel,
|
|
|
|
- 'userID_id': userID,
|
|
|
|
- 'desc': content,
|
|
|
|
- 'payType': pay_type,
|
|
|
|
- 'payTime': nowTime,
|
|
|
|
- 'price': price,
|
|
|
|
- 'currency': currency,
|
|
|
|
- 'addTime': nowTime,
|
|
|
|
- 'updTime': nowTime,
|
|
|
|
- 'ai_rank_id': rank,
|
|
|
|
- 'rank_id': 1,
|
|
|
|
- 'order_type': 1,
|
|
|
|
- 'store_meal_name': store_meal_name
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if pay_type == 1: # PayPal支付
|
|
|
|
- order_dict['paymentID'], order_dict['pay_url'] = self.create_paypal_payment(lang, orderID, price,
|
|
|
|
- currency, content, response)
|
|
|
|
- res_data = {'redirectUrl': order_dict['pay_url'], 'orderID': orderID}
|
|
|
|
- elif pay_type == 2: # 支付宝
|
|
|
|
- order_dict['pay_url'] = self.create_alipay_payment(lang, orderID, price, title, content, response)
|
|
|
|
- res_data = {'redirectUrl': order_dict['pay_url'], 'orderID': orderID}
|
|
|
|
- elif pay_type == 3: # 微信支付
|
|
|
|
- ip = CommonService.get_ip_address(request)
|
|
|
|
- order_dict['pay_url'], sign_params = self.create_wechat_payment(lang, orderID, price, ip, content,
|
|
|
|
- response)
|
|
|
|
- res_data = {'redirectUrl': order_dict['pay_url'], 'orderID': orderID, 'result': sign_params}
|
|
|
|
- else:
|
|
|
|
- return response.json(444, {'param': 'pay_type'})
|
|
|
|
- Order_Model.objects.create(**order_dict)
|
|
|
|
- return response.json(0, res_data)
|
|
|
|
- except Exception as e:
|
|
|
|
- print(e)
|
|
|
|
- return response.json(500, repr(e))
|
|
|
|
-
|
|
|
|
@staticmethod
|
|
@staticmethod
|
|
def create_paypal_payment(lang, orderID, price, currency, content, response):
|
|
def create_paypal_payment(lang, orderID, price, currency, content, response):
|
|
cancel_url = CommonService.get_payment_status_url(lang, 'fail')
|
|
cancel_url = CommonService.get_payment_status_url(lang, 'fail')
|
|
@@ -748,174 +765,3 @@ class AiView(View):
|
|
</xml>")
|
|
</xml>")
|
|
else:
|
|
else:
|
|
return HttpResponseRedirect(pay_success_url)
|
|
return HttpResponseRedirect(pay_success_url)
|
|
-
|
|
|
|
- def upload_s3(self, file_path, upload_path):
|
|
|
|
- try:
|
|
|
|
- aws_key = "AKIA2E67UIMD45Y3HL53" # 【你的 aws_access_key】
|
|
|
|
- aws_secret = "ckYLg4Lo9ZXJIcJEAKkzf2rWvs8Xth1FCjqiAqUw" # 【你的 aws_secret_key】
|
|
|
|
- session = Session(aws_access_key_id=aws_key,
|
|
|
|
- aws_secret_access_key=aws_secret,
|
|
|
|
- region_name="us-east-1")
|
|
|
|
- s3 = session.resource("s3")
|
|
|
|
- # client = session.client("s3")
|
|
|
|
- bucket = "foreignpush" # 【你 bucket 的名字】 # 首先需要保.证 s3 上已经存在该存储桶,否则报错
|
|
|
|
- upload_data = open(file_path, "rb")
|
|
|
|
- # upload_key = "test"
|
|
|
|
- s3.Bucket(bucket).put_object(Key=upload_path, Body=upload_data)
|
|
|
|
- return True
|
|
|
|
- except Exception as e:
|
|
|
|
- print(repr(e))
|
|
|
|
- return False
|
|
|
|
-
|
|
|
|
- def queryInfo(self, userID, request_dict, response):
|
|
|
|
- page = int(request_dict.get('page', None))
|
|
|
|
- line = int(request_dict.get('line', None))
|
|
|
|
- if not page or not line:
|
|
|
|
- return response.json(444, 'page,line')
|
|
|
|
- startTime = request_dict.get('startTime', None)
|
|
|
|
- endTime = request_dict.get('endTime', None)
|
|
|
|
- eventType = request_dict.get('eventType', None)
|
|
|
|
-
|
|
|
|
- now_time = int(time.time())
|
|
|
|
- seven_days_ago = now_time - 7 * 24 * 3600 # 查询7天内的数据
|
|
|
|
- qs = Ai_Push_Info.objects.filter(userID_id=userID, eventTime__gt=seven_days_ago).order_by('-eventTime')
|
|
|
|
-
|
|
|
|
- if startTime and endTime:
|
|
|
|
- qs = qs.filter(eventTime__range=(startTime, endTime))
|
|
|
|
- # if eventType:
|
|
|
|
- # qs = qs.filter(eventType__contains=eventType)
|
|
|
|
- uids = request_dict.get('uids', None)
|
|
|
|
- if uids:
|
|
|
|
- uid_list = uids.split(',')
|
|
|
|
- qs = qs.filter(devUid__in=uid_list)
|
|
|
|
- dvqs = Device_Info.objects.filter(UID__in=uid_list, userID_id=userID).values('UID', 'Type', 'NickName')
|
|
|
|
- uid_type_dict = {}
|
|
|
|
- for dv in dvqs:
|
|
|
|
- uid_type_dict[dv['UID']] = {'type': dv['Type'], 'NickName': dv['NickName']}
|
|
|
|
- else:
|
|
|
|
- dvqs = Device_Info.objects.filter(userID_id=userID).values('UID', 'Type', 'NickName')
|
|
|
|
- uid_type_dict = {}
|
|
|
|
- for dv in dvqs:
|
|
|
|
- uid_type_dict[dv['UID']] = {'type': dv['Type'], 'NickName': dv['NickName']}
|
|
|
|
-
|
|
|
|
- if not qs.exists():
|
|
|
|
- return response.json(0, {'datas': [], 'count': 0})
|
|
|
|
-
|
|
|
|
- count = qs.count()
|
|
|
|
- qs = qs.values('id', 'devUid', 'devNickName', 'Channel', 'eventType', 'status', 'alarm', 'eventTime',
|
|
|
|
- 'receiveTime', 'is_st', 'addTime', 'storage_location')
|
|
|
|
-
|
|
|
|
- qs = qs[(page - 1) * line:page * line]
|
|
|
|
- res = []
|
|
|
|
-
|
|
|
|
- aws_s3_client = boto3.client(
|
|
|
|
- 's3',
|
|
|
|
- aws_access_key_id=AWS_ACCESS_KEY_ID[0],
|
|
|
|
- aws_secret_access_key=AWS_SECRET_ACCESS_KEY[0],
|
|
|
|
- config=botocore.client.Config(signature_version='s3v4'),
|
|
|
|
- region_name='cn-northwest-1'
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- for p in qs:
|
|
|
|
- p['eventType'] = int(p['eventType'][0])
|
|
|
|
- devUid = p['devUid']
|
|
|
|
- eventTime = p['eventTime']
|
|
|
|
- channel = p['Channel']
|
|
|
|
- storage_location = p['storage_location']
|
|
|
|
- if p['is_st'] == 1:
|
|
|
|
- s3_img_cover = '{uid}/{channel}/cover{time}.jpg'.format(uid=devUid, channel=channel, time=eventTime)
|
|
|
|
- s3_img_desc = '{uid}/{channel}/desc{time}.jpg'.format(uid=devUid, channel=channel, time=eventTime)
|
|
|
|
- response_url_cover = aws_s3_client.generate_presigned_url('get_object',
|
|
|
|
- ExpiresIn=300,
|
|
|
|
- Params={
|
|
|
|
- 'Bucket': 'aipush', 'Key': s3_img_cover
|
|
|
|
- },
|
|
|
|
- )
|
|
|
|
- response_url_desc = aws_s3_client.generate_presigned_url('get_object',
|
|
|
|
- ExpiresIn=300,
|
|
|
|
- Params={
|
|
|
|
- 'Bucket': 'aipush', 'Key': s3_img_desc
|
|
|
|
- },
|
|
|
|
- )
|
|
|
|
- p['img'] = response_url_cover
|
|
|
|
- p['img_list'] = [response_url_desc]
|
|
|
|
-
|
|
|
|
- elif p['is_st'] == 2:
|
|
|
|
- pass
|
|
|
|
- elif p['is_st'] == 3:
|
|
|
|
- # 列表装载回放时间戳标记
|
|
|
|
- p['img_list'] = []
|
|
|
|
- for i in range(4):
|
|
|
|
- thumbspng = '{uid}/{channel}/{time}_{st}.jpg'.format(uid=devUid, channel=p['Channel'],
|
|
|
|
- time=eventTime, st=i)
|
|
|
|
- response_url = aws_s3_client.generate_presigned_url('get_object',
|
|
|
|
- ExpiresIn=300,
|
|
|
|
- Params={
|
|
|
|
- 'Bucket': 'aipush', 'Key': thumbspng
|
|
|
|
- },
|
|
|
|
- )
|
|
|
|
- p['img_list'].append(response_url)
|
|
|
|
-
|
|
|
|
- if devUid in uid_type_dict.keys():
|
|
|
|
- p['uid_type'] = uid_type_dict[devUid]['type']
|
|
|
|
- p['devNickName'] = uid_type_dict[devUid]['NickName']
|
|
|
|
- else:
|
|
|
|
- p['uid_type'] = ''
|
|
|
|
- res.append(p)
|
|
|
|
- return response.json(0, {'datas': res, 'count': count})
|
|
|
|
-
|
|
|
|
- def readInfo(self, userID, request_dict, response):
|
|
|
|
- is_update_all = request_dict.get('is_update_all', 0)
|
|
|
|
-
|
|
|
|
- try:
|
|
|
|
- if int(is_update_all) == 1: # 全部已读
|
|
|
|
- is_update = Ai_Push_Info.objects.filter(userID_id=userID).update(status=1)
|
|
|
|
- return response.json(0, {'update_count': is_update})
|
|
|
|
- else:
|
|
|
|
- id_list = request_dict.get('id_list', None)
|
|
|
|
- if not id_list:
|
|
|
|
- request_dict.getlist('id_list[]', None) # 获取IOS数组传参
|
|
|
|
- logger = logging.getLogger('info')
|
|
|
|
- logger.info('已读ai消息id_list:{}'.format(id_list))
|
|
|
|
- if not id_list:
|
|
|
|
- return response.json(444)
|
|
|
|
- id_list = eval(id_list) # 字符串转列表
|
|
|
|
- param_flag = CommonService.get_param_flag(data=id_list)
|
|
|
|
- if not param_flag:
|
|
|
|
- return response.json(444)
|
|
|
|
- count = 0
|
|
|
|
- for id in id_list:
|
|
|
|
- ai_push_qs = Ai_Push_Info.objects.filter(id=int(id))
|
|
|
|
- if ai_push_qs.exists():
|
|
|
|
- own_dev = ModelService.check_own_device(userID, ai_push_qs[0].devUid)
|
|
|
|
- if own_dev:
|
|
|
|
- count += 1
|
|
|
|
- ai_push_qs.update(status=1)
|
|
|
|
- return response.json(0, {'update_success': count})
|
|
|
|
- except Exception as e:
|
|
|
|
- print(e)
|
|
|
|
- return response.json(500, repr(e))
|
|
|
|
-
|
|
|
|
- def deleteInfo(self, userID, request_dict, response):
|
|
|
|
- id_list = request_dict.get('id_list', None)
|
|
|
|
- if not id_list:
|
|
|
|
- request_dict.getlist('id_list[]', None) # 获取IOS数组传参
|
|
|
|
- logger = logging.getLogger('info')
|
|
|
|
- logger.info('删除ai消息id_list:{}'.format(id_list))
|
|
|
|
- if not id_list:
|
|
|
|
- return response.json(444)
|
|
|
|
- try:
|
|
|
|
- id_list = eval(id_list) # 字符串转列表
|
|
|
|
- param_flag = CommonService.get_param_flag(data=id_list)
|
|
|
|
- if not param_flag:
|
|
|
|
- return response.json(444)
|
|
|
|
- for id in id_list:
|
|
|
|
- ai_push_qs = Ai_Push_Info.objects.filter(id=id)
|
|
|
|
- if ai_push_qs.exists():
|
|
|
|
- own_dev = ModelService.check_own_device(userID, ai_push_qs[0].devUid)
|
|
|
|
- if own_dev:
|
|
|
|
- ai_push_qs.delete()
|
|
|
|
- return response.json(0)
|
|
|
|
- except Exception as e:
|
|
|
|
- print(e)
|
|
|
|
- return response.json(500, repr(e))
|
|
|