|
@@ -15,6 +15,9 @@ import json
|
|
|
import math
|
|
|
import time
|
|
|
import urllib
|
|
|
+
|
|
|
+import boto3
|
|
|
+
|
|
|
from Object.AliPayObject import AliPayObject
|
|
|
import oss2
|
|
|
import paypalrestsdk
|
|
@@ -28,7 +31,7 @@ from django.views.generic.base import View
|
|
|
|
|
|
from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
|
|
|
SERVER_DOMAIN_SSL
|
|
|
-from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket
|
|
|
+from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel
|
|
|
from Object.ResponseObject import ResponseObject
|
|
|
from Object.TokenObject import TokenObject
|
|
|
from Object.UidTokenObject import UidTokenObject
|
|
@@ -97,12 +100,6 @@ class CloudVodView(View):
|
|
|
return self.do_pay_ok()
|
|
|
elif operation == 'payError':
|
|
|
return self.do_pay_error()
|
|
|
- elif operation == 'aliPayCallback':
|
|
|
- return self.do_ali_pay_callback(request)
|
|
|
- elif operation == 'dopaypalcallback':
|
|
|
- return self.do_pay_by_paypal_callback(request)
|
|
|
- elif operation == 'doalicallback':
|
|
|
- return self.do_pay_by_ali_callback(request)
|
|
|
else:
|
|
|
token = request_dict.get('token', None)
|
|
|
# 设备主键uid
|
|
@@ -111,9 +108,7 @@ class CloudVodView(View):
|
|
|
if tko.code != 0:
|
|
|
return response.json(tko.code)
|
|
|
userID = tko.userID
|
|
|
- if operation == 'createOrder':
|
|
|
- return self.do_create_order(request_dict, userID, response)
|
|
|
- elif operation == 'status':
|
|
|
+ if operation == 'status':
|
|
|
return self.do_change_status(request_dict, userID, response)
|
|
|
elif operation == 'details':
|
|
|
return self.do_get_details(request_dict, response)
|
|
@@ -121,142 +116,11 @@ class CloudVodView(View):
|
|
|
return self.do_filter_playlist(request_dict, userID, response)
|
|
|
elif operation == 'findVod':
|
|
|
return self.do_find_playlist(request_dict, userID, response)
|
|
|
- # 支付宝支付
|
|
|
- elif operation == 'aliPayCreateOrder':
|
|
|
- return self.do_pay_by_ali(request_dict, userID, response)
|
|
|
elif operation == 'orderStatus':
|
|
|
- return self.do_pay_status(request_dict, userID)
|
|
|
- elif operation == 'createPayOrder':
|
|
|
- return self.do_create_pay_order(request_dict, userID, response)
|
|
|
+ return self.do_pay_status(request_dict, userID, response)
|
|
|
else:
|
|
|
return response.json(414)
|
|
|
|
|
|
- def do_ali_pay_callback(self, request):
|
|
|
- response = ResponseObject()
|
|
|
- data = request.POST.dict()
|
|
|
- signature = data["sign"]
|
|
|
- data.pop('sign')
|
|
|
- orderID = data['out_trade_no']
|
|
|
-
|
|
|
- order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
|
|
|
- print(order_qs)
|
|
|
-
|
|
|
- if not order_qs.exists():
|
|
|
- return response.json(404)
|
|
|
- print(json.dumps(data))
|
|
|
- print(signature)
|
|
|
- # verify
|
|
|
- aliPayObj = AliPayObject()
|
|
|
- alipay = aliPayObj.conf()
|
|
|
- success = alipay.verify(data, signature)
|
|
|
- if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
|
|
|
- print("trade succeed")
|
|
|
- nowTime = int(time.time())
|
|
|
- order_list = order_qs.values("UID", "rank__id", "channel")
|
|
|
- rank_id = order_list[0]['rank__id']
|
|
|
- print(rank_id)
|
|
|
- UID = order_list[0]['UID']
|
|
|
- channel = order_list[0]['channel']
|
|
|
- order_qs.update(status=1, updTime=nowTime)
|
|
|
-
|
|
|
- smqs = Store_Meal.objects.filter(id=rank_id).values("day", "bucket_id", "bucket__storeDay")
|
|
|
- bucketId = smqs[0]['bucket_id']
|
|
|
- if not smqs.exists():
|
|
|
- return response.json(0, '套餐已删除')
|
|
|
- addTime = int(smqs[0]["day"]) * 24 * 3600
|
|
|
- ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel). \
|
|
|
- values("bucket_id", "endTime", "bucket__storeDay")
|
|
|
- nowTime = int(time.time())
|
|
|
- if ubqs.exists():
|
|
|
- # 判断是否过期了
|
|
|
- if nowTime > ubqs[0]['endTime']:
|
|
|
- ubqs.update(endTime=nowTime + addTime)
|
|
|
- else:
|
|
|
- # 同一个bucket续费
|
|
|
- if bucketId == ubqs[0]['bucket_id']:
|
|
|
- ubqs.update(endTime=ubqs[0]['endTime'] + addTime)
|
|
|
- else:
|
|
|
- if ubqs[0]['bucket__storeDay'] > smqs[0]['bucket__storeDay']:
|
|
|
- return response.json(10, '不可选低级别套餐')
|
|
|
- else:
|
|
|
- # 升级
|
|
|
- origin_storeDay = int(ubqs[0]['bucket__storeDay'])
|
|
|
- upgrade_storeDay = int(smqs[0]['bucket__storeDay'])
|
|
|
- ctcTime = ubqs[0]['endTime'] - nowTime
|
|
|
- multiple = math.ceil(upgrade_storeDay / origin_storeDay)
|
|
|
- ubqs.update(endTime=ctcTime / multiple + addTime + ubqs[0]['endTime'], bucket_id=bucketId)
|
|
|
- # 付款成功把oss token删除
|
|
|
- OssCrdModel.objects.filter(uid=UID, channel=channel).delete()
|
|
|
- # 新增模式
|
|
|
- else:
|
|
|
- print('create')
|
|
|
- UID_Bucket.objects.create(uid=UID, channel=channel,
|
|
|
- bucket_id=bucketId, endTime=nowTime + addTime)
|
|
|
- red_url = "{SERVER_DOMAIN}cloudVod/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
- return HttpResponseRedirect(red_url)
|
|
|
- return response.json(0, signature)
|
|
|
-
|
|
|
- #发起支付宝支付
|
|
|
- def do_pay_by_ali(self, request_dict, userID, response):
|
|
|
- uid = request_dict.get('uid', None)
|
|
|
- rank = request_dict.get('rank', None)
|
|
|
- channel = request_dict.get('channel', None)
|
|
|
- qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False)
|
|
|
- if not qs.exists():
|
|
|
- return response.json(12)
|
|
|
- if not channel or not rank:
|
|
|
- return response.json(444, 'channel,rank')
|
|
|
- smqs = Store_Meal.objects.filter(id=rank). \
|
|
|
- values("currency", "price", "content", "day", "bucket__storeDay", "bucket__region", "type")
|
|
|
- if not smqs.exists():
|
|
|
- # 套餐不存在
|
|
|
- return response.json(173)
|
|
|
- if smqs[0]['type'] != 1:
|
|
|
- return response.json(10, '不支持支付宝支付')
|
|
|
- currency = smqs[0]['currency']
|
|
|
- price = smqs[0]['price']
|
|
|
- content = smqs[0]['content']
|
|
|
- day = smqs[0]['day']
|
|
|
- nowTime = int(time.time())
|
|
|
- ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=nowTime). \
|
|
|
- values("bucket__storeDay", "bucket__region")
|
|
|
- if ubqs.exists():
|
|
|
- if ubqs[0]['bucket__region'] != smqs[0]['bucket__region']:
|
|
|
- return response.json(712) # 区域不一致
|
|
|
- elif ubqs[0]['bucket__storeDay'] != smqs[0]['bucket__storeDay']:
|
|
|
- return response.json(713) # 不可更改套餐
|
|
|
- # 续费流程
|
|
|
- nowTime = int(time.time())
|
|
|
- # 新增流程
|
|
|
- orderID = CommonService.createOrderID()
|
|
|
-
|
|
|
- try:
|
|
|
- aliPayObj = AliPayObject()
|
|
|
- alipay = aliPayObj.conf()
|
|
|
- order_string = alipay.api_alipay_trade_wap_pay(
|
|
|
- out_trade_no=orderID,
|
|
|
- total_amount=price,
|
|
|
- subject="测试哟",
|
|
|
- return_url="{SERVER_DOMAIN_SSL}cloudVod/payOK".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL),
|
|
|
- notify_url="{SERVER_DOMAIN_SSL}cloudVod/aliPayCallback".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
|
|
|
- # return_url="http://192.168.136.40/cloudVod/payOK",
|
|
|
- # notify_url="http://192.168.136.40/cloudVod/aliPayCallback"
|
|
|
- )
|
|
|
- except Exception as e:
|
|
|
- print(repr(e))
|
|
|
- return response.json(10, repr(e))
|
|
|
- if order_string:
|
|
|
- redirectUrl = aliPayObj.alipay_prefix + order_string
|
|
|
- Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID, desc=content,
|
|
|
- price=price, currency=currency, addTime=nowTime, updTime=nowTime,
|
|
|
- endTime=nowTime + int(day) * 3600 * 24, rank_id=rank, payType=1)
|
|
|
- return JsonResponse(status=200,
|
|
|
- data={'result_code': 0, 'reason': 'success',
|
|
|
- 'result': {"redirectUrl": redirectUrl, "orderID": orderID},
|
|
|
- 'error_code': 0})
|
|
|
- else:
|
|
|
- return response.json(10, '生成订单错误')
|
|
|
-
|
|
|
def do_get_details(self, request_dict, response):
|
|
|
uid = request_dict.get('uid', None)
|
|
|
dvqs = Device_Info.objects.filter(UID=uid, isShare=False)
|
|
@@ -380,7 +244,7 @@ class CloudVodView(View):
|
|
|
color : green
|
|
|
}
|
|
|
.content_img{
|
|
|
- width: 60px;
|
|
|
+ width: 60px;
|
|
|
height: 60px;
|
|
|
}
|
|
|
.bottom{
|
|
@@ -420,7 +284,7 @@ class CloudVodView(View):
|
|
|
function payOKButton() {
|
|
|
// 复杂数据
|
|
|
console.log('success')
|
|
|
- window.webkit.messageHandlers.jsCallOC.postMessage({"status": 1});
|
|
|
+ window.location.href="https://test.dvema.com/closePage";
|
|
|
}
|
|
|
</script>
|
|
|
</body>
|
|
@@ -428,344 +292,237 @@ class CloudVodView(View):
|
|
|
'''
|
|
|
return response
|
|
|
|
|
|
- def do_pay_by_ali_callback(self, request):
|
|
|
- response = ResponseObject()
|
|
|
- data = request.POST.dict()
|
|
|
- signature = data["sign"]
|
|
|
- data.pop('sign')
|
|
|
- orderID = data['out_trade_no']
|
|
|
-
|
|
|
- order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
|
|
|
- print(order_qs)
|
|
|
-
|
|
|
- if not order_qs.exists():
|
|
|
- return response.json(404)
|
|
|
- print(json.dumps(data))
|
|
|
- print(signature)
|
|
|
- # verify
|
|
|
- aliPayObj = AliPayObject()
|
|
|
- alipay = aliPayObj.conf()
|
|
|
- success = alipay.verify(data, signature)
|
|
|
- if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
|
|
|
- print("trade succeed")
|
|
|
- nowTime = int(time.time())
|
|
|
- order_list = order_qs.values("UID", "commodity_code", "channel")
|
|
|
- UID = order_list[0]['UID']
|
|
|
- channel = order_list[0]['channel']
|
|
|
- commodity_code = order_list[0]['commodity_code']
|
|
|
- order_qs.update(status=1, updTime=nowTime)
|
|
|
- smqs = Store_Meal.objects.filter(commodity_code=commodity_code).\
|
|
|
- values("day", "bucket_id", "bucket__storeDay")
|
|
|
- bucketId = smqs[0]['bucket_id']
|
|
|
- if not smqs.exists():
|
|
|
- return response.json(0, '套餐已删除')
|
|
|
- addTime = int(smqs[0]["day"]) * 24 * 3600
|
|
|
- ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel). \
|
|
|
- values("bucket_id", "endTime", "bucket__storeDay")
|
|
|
- nowTime = int(time.time())
|
|
|
- if ubqs.exists():
|
|
|
- ubqs_count = ubqs.count()
|
|
|
- ubq = ubqs[ubqs_count - 1, ubqs_count]
|
|
|
- new_starTime = ubq['endTime'] + 1
|
|
|
- UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId, endTime=new_starTime + addTime)
|
|
|
- else:
|
|
|
- UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId, endTime=nowTime + addTime)
|
|
|
- red_url = "{SERVER_DOMAIN}cloudVod/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
- return HttpResponseRedirect(red_url)
|
|
|
- return response.json(0, signature)
|
|
|
-
|
|
|
- def do_pay_by_paypal_callback(self, request_dict, response):
|
|
|
- paymentId = request_dict.get('paymentId', None)
|
|
|
- PayerID = request_dict.get('PayerID', None)
|
|
|
- orderID = request_dict.get('orderID', None)
|
|
|
- if not paymentId or not PayerID or not orderID:
|
|
|
- red_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
- return HttpResponseRedirect(red_url)
|
|
|
- paypalrestsdk.configure(PAYPAL_CRD)
|
|
|
- # ID of the payment. This ID is provided when creating payment.
|
|
|
- payment = paypalrestsdk.Payment.find(paymentId)
|
|
|
- payres = payment.execute({"payer_id": PayerID})
|
|
|
- print(payres)
|
|
|
- if not payres:
|
|
|
- red_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
- return HttpResponseRedirect(red_url)
|
|
|
- print("Payment execute successfully")
|
|
|
- order_qs = Order_Model.objects.filter(orderID=orderID)
|
|
|
- nowTime = int(time.time())
|
|
|
- order_qs.update(status=1, updTime=nowTime)
|
|
|
- order_list = order_qs.values("UID", "channel", "commodity_code")
|
|
|
- UID = order_list[0]['UID']
|
|
|
- channel = order_list[0]['channel']
|
|
|
- commodity_code = order_list[0]['commodity_code']
|
|
|
- smqs = Store_Meal.objects.filter(commodity_code=commodity_code).\
|
|
|
- values("day", "bucket_id", "bucket__storeDay")
|
|
|
- bucketId = smqs[0]['bucket_id']
|
|
|
- if not smqs.exists():
|
|
|
- return response.json(0, '套餐已删除')
|
|
|
- addTime = int(smqs[0]["day"]) * 24 * 3600
|
|
|
- # ##
|
|
|
- ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, endTime__gte=nowTime). \
|
|
|
- values("bucket__storeDay", "bucket__region", "endTime")
|
|
|
- if ubqs.exists():
|
|
|
- ubqs_count = ubqs.count()
|
|
|
- ubq = ubqs[ubqs_count - 1, ubqs_count]
|
|
|
- new_starTime = ubq['endTime'] + 1
|
|
|
- UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId, endTime=new_starTime + addTime)
|
|
|
- else:
|
|
|
- UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId, endTime=nowTime + addTime)
|
|
|
- # return response.json(0)
|
|
|
- red_url = "{SERVER_DOMAIN}cloudVod/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
- return HttpResponseRedirect(red_url)
|
|
|
-
|
|
|
- def do_create_pay_order(self, request_dict, userID, response):
|
|
|
- uid = request_dict.get('uid', None)
|
|
|
- channel = request_dict.get('channel', None)
|
|
|
- commodity_code = request_dict.get('commodity_code', None)
|
|
|
- pay_type = int(request_dict.get('pay_type', None))
|
|
|
- dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1)
|
|
|
- if not dv_qs.exists():
|
|
|
- return response.json(12)
|
|
|
- smqs = Store_Meal.objects.filter(commodity_code=commodity_code, type=pay_type). \
|
|
|
- values('currency', 'price', 'content', 'day', 'commodity_type', 'title', 'content')
|
|
|
- if not smqs.exists():
|
|
|
- return response.json(10, '套餐不存在')
|
|
|
- currency = smqs[0]['currency']
|
|
|
- price = smqs[0]['price']
|
|
|
- content = smqs[0]['content']
|
|
|
- day = smqs[0]['day']
|
|
|
- commodity_type = smqs[0]['commodity_type']
|
|
|
- # ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=nowTime). \
|
|
|
- # values("bucket__storeDay", "bucket__region", "endTime")
|
|
|
- # if ubqs.exists():
|
|
|
- # ubqs_count = ubqs.count()
|
|
|
- # ubq = ubqs[ubqs_count - 1, ubqs_count]
|
|
|
- # new_starTime = ubq['endTime'] + 1
|
|
|
- nowTime = int(time.time())
|
|
|
- orderID = CommonService.createOrderID()
|
|
|
- if pay_type == 0:
|
|
|
- call_sub_url = "{SERVER_DOMAIN}cloudVod/dopaypalcallback?orderID={orderID}". \
|
|
|
- format(SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
|
|
|
- # call_sub_url = "http://192.168.136.40:8077/cloudVod/payExecute?orderID={orderID}".format(
|
|
|
- # SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
|
|
|
- call_clc_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
- paypalrestsdk.configure(PAYPAL_CRD)
|
|
|
- payment = paypalrestsdk.Payment({
|
|
|
- "intent": "sale",
|
|
|
- "payer": {"payment_method": "paypal"},
|
|
|
- "redirect_urls": {"return_url": call_sub_url, "cancel_url": call_clc_url},
|
|
|
- "transactions": [{
|
|
|
- "item_list": {
|
|
|
- "items": [
|
|
|
- {"name": "Cloud video", "sku": "1", "price": price, "currency": "USD", "quantity": 1}]},
|
|
|
- "amount": {"total": price, "currency": currency},
|
|
|
- "description": content
|
|
|
- }]})
|
|
|
- if payment.create():
|
|
|
- print("Payment created successfully")
|
|
|
- else:
|
|
|
- print(payment.error)
|
|
|
- return response.json(10, payment.error)
|
|
|
- print(payment)
|
|
|
- for link in payment.links:
|
|
|
- if link.rel == "approval_url":
|
|
|
- approval_url = str(link.href)
|
|
|
- print("Redirect for approval: %s" % (approval_url))
|
|
|
- Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
|
|
|
- desc=content,
|
|
|
- price=price, currency=currency, addTime=nowTime, updTime=nowTime,
|
|
|
- endTime=(nowTime + int(day) * 3600 * 24), paypal=approval_url,
|
|
|
- commodity_code=commodity_code, commodity_type=commodity_type)
|
|
|
- return response.json(0, {"redirectUrl": approval_url, "orderID": orderID})
|
|
|
- return response.json(10, 'generate_order_false')
|
|
|
- else:
|
|
|
- try:
|
|
|
- aliPayObj = AliPayObject()
|
|
|
- alipay = aliPayObj.conf()
|
|
|
- subject = smqs[0]['title'] + smqs[0]['content']
|
|
|
- order_string = alipay.api_alipay_trade_wap_pay(
|
|
|
- out_trade_no=orderID,
|
|
|
- total_amount=price,
|
|
|
- subject=subject,
|
|
|
- return_url="{SERVER_DOMAIN_SSL}cloudVod/payOK".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL),
|
|
|
- notify_url="{SERVER_DOMAIN_SSL}cloudVod/doalicallback".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
|
|
|
- # return_url="http://192.168.136.40/cloudVod/payOK",
|
|
|
- # notify_url="http://192.168.136.40/cloudVod/aliPayCallback"
|
|
|
- )
|
|
|
- except Exception as e:
|
|
|
- print(repr(e))
|
|
|
- return response.json(10, repr(e))
|
|
|
- else:
|
|
|
- if order_string:
|
|
|
- redirectUrl = aliPayObj.alipay_prefix + order_string
|
|
|
- Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
|
|
|
- desc=content, price=price, currency=currency, addTime=nowTime,
|
|
|
- updTime=nowTime, endTime=nowTime + int(day) * 3600 * 24,
|
|
|
- commodity_code=commodity_code, commodity_type=commodity_type,
|
|
|
- paypal='', payType=1)
|
|
|
- return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
|
|
|
- 'result': {"redirectUrl": redirectUrl, "orderID": orderID},
|
|
|
- 'error_code': 0})
|
|
|
- else:
|
|
|
- return response.json(10, '生成订单错误')
|
|
|
-
|
|
|
- # 发起paypal支付
|
|
|
- def do_create_order(self, request_dict, userID, response):
|
|
|
- uid = request_dict.get('uid', None)
|
|
|
- rank = request_dict.get('rank', None)
|
|
|
- channel = request_dict.get('channel', None)
|
|
|
- if not uid or not channel or not rank:
|
|
|
- return response.json(444, 'channel,rank')
|
|
|
- qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False)
|
|
|
-
|
|
|
- if not qs.exists():
|
|
|
- return response.json(12)
|
|
|
- smqs = Store_Meal.objects.filter(id=rank). \
|
|
|
- values("currency", "price", "content", "day", "bucket__storeDay", "bucket__region", "type")
|
|
|
- if not smqs.exists():
|
|
|
- return response.json(10, '套餐不存在')
|
|
|
- if smqs[0]['type'] != 0:
|
|
|
- return response.json(10, '套餐不支持paypal支付')
|
|
|
- currency = smqs[0]['currency']
|
|
|
- price = smqs[0]['price']
|
|
|
- content = smqs[0]['content']
|
|
|
- day = smqs[0]['day']
|
|
|
- nowTime = int(time.time())
|
|
|
- ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=nowTime). \
|
|
|
- values("bucket__storeDay", "bucket__region")
|
|
|
- if ubqs.exists():
|
|
|
- if ubqs[0]['bucket__region'] != smqs[0]['bucket__region']:
|
|
|
- return response.json(712) # 区域不一致
|
|
|
- # elif ubqs[0]['bucket__storeDay'] > smqs[0]['bucket__storeDay']:
|
|
|
- # return response.json(711) # 不可降级
|
|
|
- elif ubqs[0]['bucket__storeDay'] != smqs[0]['bucket__storeDay']:
|
|
|
- return response.json(713) # 不可更改套餐
|
|
|
- # 续费流程
|
|
|
- nowTime = int(time.time())
|
|
|
- # 判断是否存在未完成订单
|
|
|
- # hasOrder = Order_Model.objects.filter(UID=uid, channel=channel, addTime__gte=nowTime - 3600, status=0,
|
|
|
- # rank_id=rank, userID_id=userID).values('paypal')
|
|
|
- # if hasOrder.exists():
|
|
|
- # approval_url = hasOrder[0]['paypal']
|
|
|
- # return response.json(0, {"redirectUrl": approval_url})
|
|
|
- # 新增流程
|
|
|
- orderID = CommonService.createOrderID()
|
|
|
- call_sub_url = "{SERVER_DOMAIN}cloudVod/payExecute?orderID={orderID}". \
|
|
|
- format(SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
|
|
|
- # call_sub_url = "http://192.168.136.40:8077/cloudVod/payExecute?orderID={orderID}".format(
|
|
|
- # SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
|
|
|
- call_clc_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
- paypalrestsdk.configure(PAYPAL_CRD)
|
|
|
- payment = paypalrestsdk.Payment({
|
|
|
- "intent": "sale",
|
|
|
- "payer": {"payment_method": "paypal"},
|
|
|
- "redirect_urls": {"return_url": call_sub_url, "cancel_url": call_clc_url},
|
|
|
- "transactions": [{
|
|
|
- "item_list": {
|
|
|
- "items": [{"name": "Cloud video", "sku": "1", "price": price, "currency": "USD", "quantity": 1}]},
|
|
|
- "amount": {"total": price, "currency": currency},
|
|
|
- "description": content
|
|
|
- }]})
|
|
|
- if payment.create():
|
|
|
- print("Payment created successfully")
|
|
|
- else:
|
|
|
- print(payment.error)
|
|
|
- return response.json(10, payment.error)
|
|
|
- print(payment)
|
|
|
- for link in payment.links:
|
|
|
- if link.rel == "approval_url":
|
|
|
- approval_url = str(link.href)
|
|
|
- print("Redirect for approval: %s" % (approval_url))
|
|
|
- Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID, desc=content,
|
|
|
- price=price, currency=currency, addTime=nowTime, updTime=nowTime,
|
|
|
- endTime=nowTime + int(day) * 3600 * 24,
|
|
|
- rank_id=rank,
|
|
|
- paypal=approval_url)
|
|
|
- return response.json(0, {"redirectUrl": approval_url, "orderID": orderID})
|
|
|
- return response.json(10, 'generate_order_false')
|
|
|
-
|
|
|
- # 生成设备sts上传授权
|
|
|
def do_getSts(self, request_dict, ip, response):
|
|
|
uidToken = request_dict.get('uidToken', None)
|
|
|
utko = UidTokenObject(uidToken)
|
|
|
if utko.flag is False:
|
|
|
return response.json(444, 'uidToken')
|
|
|
- UID = utko.UID
|
|
|
+ uid = utko.UID
|
|
|
channel = utko.channel
|
|
|
print(channel)
|
|
|
- print(UID)
|
|
|
- ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, status=1). \
|
|
|
- values('channel', 'bucket__bucket', 'bucket__endpoint', 'bucket__region', 'endTime')
|
|
|
+ print(uid)
|
|
|
now_time = int(time.time())
|
|
|
- if not ubqs.exists():
|
|
|
- res = {'code': 404, 'msg': '未购买'}
|
|
|
- return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
|
|
|
- elif ubqs[0]['endTime'] < now_time:
|
|
|
- res = {'code': 404, 'msg': '过期'}
|
|
|
- return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
|
|
|
- oc_qs = OssCrdModel.objects.filter(uid=UID, channel=channel).values("addTime", "data")
|
|
|
- if oc_qs.exists():
|
|
|
- endTime = int(oc_qs[0]["addTime"]) + 3500
|
|
|
- if endTime > now_time:
|
|
|
- print(endTime)
|
|
|
- print(now_time)
|
|
|
- res = json.loads(oc_qs[0]["data"])
|
|
|
+ ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time). \
|
|
|
+ values("bucket__mold", "bucket__bucket", "bucket__endpoint", "bucket__region", "endTime")
|
|
|
+ if ubqs.exists():
|
|
|
+ if ubqs[0]["bucket__mold"] == 0:
|
|
|
+ # 阿里云 oss sts
|
|
|
+ oc_qs = OssCrdModel.objects.filter(uid=uid, channel=channel). \
|
|
|
+ values("addTime", "data")
|
|
|
+ if oc_qs.exists():
|
|
|
+ endTime = int(oc_qs[0]["addTime"]) + 3500
|
|
|
+ if endTime > now_time:
|
|
|
+ print(endTime)
|
|
|
+ print(now_time)
|
|
|
+ res = json.loads(oc_qs[0]["data"])
|
|
|
+ return JsonResponse(status=200, data=res)
|
|
|
+ # 套餐id
|
|
|
+ storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
|
|
|
+ bucket_name = ubqs[0]['bucket__bucket']
|
|
|
+ endpoint = ubqs[0]['bucket__endpoint']
|
|
|
+ access_key_id = OSS_STS_ACCESS_KEY
|
|
|
+ access_key_secret = OSS_STS_ACCESS_SECRET
|
|
|
+ region_id = ubqs[0]['bucket__region']
|
|
|
+ role_arn = OSS_ROLE_ARN
|
|
|
+ clt = client.AcsClient(access_key_id, access_key_secret, region_id)
|
|
|
+ req = AssumeRoleRequest.AssumeRoleRequest()
|
|
|
+ # 设置返回值格式为JSON。
|
|
|
+ req.set_accept_format('json')
|
|
|
+ req.set_RoleArn(role_arn)
|
|
|
+ req.set_RoleSessionName(uid + '_' + channel)
|
|
|
+ req.set_DurationSeconds(3600)
|
|
|
+ Resource_access = "acs:oss:*:*:{bucket_name}/{uid_channel}*". \
|
|
|
+ format(bucket_name=bucket_name, uid_channel=storage)
|
|
|
+ print(Resource_access)
|
|
|
+ policys = {
|
|
|
+ "Version": "1",
|
|
|
+ "Statement": [
|
|
|
+ {
|
|
|
+ "Action": ["oss:PutObject", "oss:DeleteObject", ],
|
|
|
+ "Resource": [Resource_access],
|
|
|
+ "Effect": "Allow",
|
|
|
+ "Condition": {
|
|
|
+ "IpAddress": {"acs:SourceIp": ip}
|
|
|
+ # "IpAddress": {"acs:SourceIp": "120.237.157.184"}
|
|
|
+ # "IpAddress": {"acs:SourceIp": "*"}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ req.set_Policy(Policy=json.dumps(policys))
|
|
|
+ body = clt.do_action(req)
|
|
|
+ # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
|
|
|
+ token = json.loads(body.decode('utf-8'))
|
|
|
+ print(token)
|
|
|
+ res = {
|
|
|
+ 'AccessKeyId': token['Credentials']['AccessKeyId'],
|
|
|
+ 'AccessKeySecret': token['Credentials']['AccessKeySecret'],
|
|
|
+ 'SecurityToken': token['Credentials']['SecurityToken'],
|
|
|
+ 'Expiration': token['Credentials']['Expiration'],
|
|
|
+ 'expire': '3600',
|
|
|
+ 'endpoint': endpoint,
|
|
|
+ 'bucket_name': bucket_name,
|
|
|
+ 'arn': token['AssumedRoleUser']['Arn'],
|
|
|
+ 'code': 0,
|
|
|
+ 'storage': storage,
|
|
|
+ 'endTime': ubqs[0]['endTime'],
|
|
|
+ 'ip': ip}
|
|
|
+ if oc_qs.exists():
|
|
|
+ oc_qs.update(data=json.dumps(res), addTime=now_time)
|
|
|
+ else:
|
|
|
+ OssCrdModel.objects.create \
|
|
|
+ (uid=uid, channel=channel, data=json.dumps(res), addTime=now_time)
|
|
|
return JsonResponse(status=200, data=res)
|
|
|
- # 套餐id
|
|
|
- storage = '{uid}/vod{channel}/'.format(uid=UID, channel=channel)
|
|
|
- bucket_name = ubqs[0]['bucket__bucket']
|
|
|
- endpoint = ubqs[0]['bucket__endpoint']
|
|
|
- access_key_id = OSS_STS_ACCESS_KEY
|
|
|
- access_key_secret = OSS_STS_ACCESS_SECRET
|
|
|
- region_id = ubqs[0]['bucket__region']
|
|
|
- role_arn = OSS_ROLE_ARN
|
|
|
- clt = client.AcsClient(access_key_id, access_key_secret, region_id)
|
|
|
- req = AssumeRoleRequest.AssumeRoleRequest()
|
|
|
- # 设置返回值格式为JSON。
|
|
|
- req.set_accept_format('json')
|
|
|
- req.set_RoleArn(role_arn)
|
|
|
- req.set_RoleSessionName(UID)
|
|
|
- req.set_DurationSeconds(3600)
|
|
|
- Resource_access = "acs:oss:*:*:{bucket_name}/{uid_channel}*".format(bucket_name=bucket_name,
|
|
|
- uid_channel=storage)
|
|
|
- print(Resource_access)
|
|
|
- policys = {
|
|
|
- "Version": "1",
|
|
|
- "Statement": [
|
|
|
- {
|
|
|
- "Action": ["oss:PutObject", "oss:DeleteObject", ],
|
|
|
- "Resource": [Resource_access],
|
|
|
- "Effect": "Allow",
|
|
|
- "Condition": {
|
|
|
- "IpAddress": {"acs:SourceIp": ip}
|
|
|
- # "IpAddress": {"acs:SourceIp": "120.237.157.184"}
|
|
|
- # "IpAddress": {"acs:SourceIp": "*"}
|
|
|
- }
|
|
|
+ elif ubqs[0]["bucket__mold"] == 1:
|
|
|
+ # 亚马逊 s3 sts
|
|
|
+ sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
|
|
|
+ values("addTime", "data")
|
|
|
+ if sts_qs.exists():
|
|
|
+ endTime = int(sts_qs[0]["addTime"]) + 3500
|
|
|
+ if endTime > now_time:
|
|
|
+ print(endTime)
|
|
|
+ print(now_time)
|
|
|
+ res = json.loads(sts_qs[0]["data"])
|
|
|
+ return JsonResponse(status=200, data=res)
|
|
|
+ # 套餐id
|
|
|
+ storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
|
|
|
+ bucket_name = ubqs[0]['bucket__bucket']
|
|
|
+ endpoint = ubqs[0]['bucket__endpoint']
|
|
|
+ region_id = ubqs[0]['bucket__region']
|
|
|
+
|
|
|
+ ###############
|
|
|
+ REGION_NAME = region_id
|
|
|
+ boto3_sts = boto3.client(
|
|
|
+ 'sts',
|
|
|
+ aws_access_key_id='AKIA2E67UIMD45Y3HL53',
|
|
|
+ aws_secret_access_key='ckYLg4Lo9ZXJIcJEAKkzf2rWvs8Xth1FCjqiAqUw',
|
|
|
+ region_name=REGION_NAME
|
|
|
+ )
|
|
|
+ Policy = {
|
|
|
+ "Version": "2012-10-17",
|
|
|
+ "Statement": [
|
|
|
+ {
|
|
|
+ "Effect": "Allow",
|
|
|
+ "Action": "s3:*",
|
|
|
+ "Resource": ["arn:aws:s3:::azvod1/{uid_channel}/*".
|
|
|
+ format(uid_channel=storage)]
|
|
|
+ }
|
|
|
+ ]
|
|
|
}
|
|
|
- ]
|
|
|
- }
|
|
|
- req.set_Policy(Policy=json.dumps(policys))
|
|
|
- body = clt.do_action(req)
|
|
|
- # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
|
|
|
- token = json.loads(body.decode('utf-8'))
|
|
|
- print(token)
|
|
|
- res = {
|
|
|
- 'AccessKeyId': token['Credentials']['AccessKeyId'],
|
|
|
- 'AccessKeySecret': token['Credentials']['AccessKeySecret'],
|
|
|
- 'SecurityToken': token['Credentials']['SecurityToken'],
|
|
|
- 'Expiration': token['Credentials']['Expiration'],
|
|
|
- 'expire': '3600',
|
|
|
- 'endpoint': endpoint,
|
|
|
- 'bucket_name': bucket_name,
|
|
|
- 'arn': token['AssumedRoleUser']['Arn'],
|
|
|
- 'code': 0,
|
|
|
- 'storage': storage,
|
|
|
- 'endTime': ubqs[0]['endTime'],
|
|
|
- 'ip': ip}
|
|
|
- if oc_qs.exists():
|
|
|
- oc_qs.update(data=json.dumps(res), addTime=now_time)
|
|
|
- else:
|
|
|
- OssCrdModel.objects.create(uid=UID, channel=channel, data=json.dumps(res), addTime=now_time)
|
|
|
- return JsonResponse(status=200, data=res)
|
|
|
+ response = boto3_sts.get_federation_token(
|
|
|
+ Name='{role_name}'.format(role_name=uid + '_' + channel),
|
|
|
+ Policy=json.dumps(Policy),
|
|
|
+ DurationSeconds=7200
|
|
|
+ )
|
|
|
+ ###############
|
|
|
+ res = {
|
|
|
+ 'AccessKeyId': response['Credentials']['AccessKeyId'],
|
|
|
+ 'AccessKeySecret': response['Credentials']['SecretAccessKey'],
|
|
|
+ 'SessionToken': response['Credentials']['SessionToken'],
|
|
|
+ 'Expiration': response['Credentials']['Expiration'],
|
|
|
+ 'expire': '3600',
|
|
|
+ 'endpoint': endpoint,
|
|
|
+ 'bucket_name': bucket_name,
|
|
|
+ 'arn': response['FederatedUser']['Arn'],
|
|
|
+ 'code': 0,
|
|
|
+ 'storage': storage,
|
|
|
+ 'endTime': ubqs[0]['endTime'],
|
|
|
+ 'ip': ip,
|
|
|
+ }
|
|
|
+ if sts_qs.exists():
|
|
|
+ sts_qs.update(data=json.dumps(res,default=str), addTime=now_time)
|
|
|
+ else:
|
|
|
+ StsCrdModel.objects.create(uid=uid, channel=channel, data=json.dumps(res, default=str),
|
|
|
+ addTime=now_time, type=1)
|
|
|
+ return JsonResponse(status=200, data=res)
|
|
|
+ else:
|
|
|
+ res = {'code': 404, 'msg': 'data not exists!'}
|
|
|
+ return HttpResponse(json.dumps(res, ensure_ascii=False),
|
|
|
+ content_type="application/json,charset=utf-8")
|
|
|
+
|
|
|
+ # 生成设备sts上传授权
|
|
|
+ # def do_getSts(self, request_dict, ip, response):
|
|
|
+ # uidToken = request_dict.get('uidToken', None)
|
|
|
+ # utko = UidTokenObject(uidToken)
|
|
|
+ # if utko.flag is False:
|
|
|
+ # return response.json(444, 'uidToken')
|
|
|
+ # UID = utko.UID
|
|
|
+ # channel = utko.channel
|
|
|
+ # print(channel)
|
|
|
+ # print(UID)
|
|
|
+ # ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, status=1). \
|
|
|
+ # values('channel', 'bucket__bucket', 'bucket__endpoint', 'bucket__region', 'endTime')
|
|
|
+ # now_time = int(time.time())
|
|
|
+ # if not ubqs.exists():
|
|
|
+ # res = {'code': 404, 'msg': '未购买'}
|
|
|
+ # return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
|
|
|
+ # elif ubqs[0]['endTime'] < now_time:
|
|
|
+ # res = {'code': 404, 'msg': '过期'}
|
|
|
+ # return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
|
|
|
+ # oc_qs = OssCrdModel.objects.filter(uid=UID, channel=channel).values("addTime", "data")
|
|
|
+ # if oc_qs.exists():
|
|
|
+ # endTime = int(oc_qs[0]["addTime"]) + 3500
|
|
|
+ # if endTime > now_time:
|
|
|
+ # print(endTime)
|
|
|
+ # print(now_time)
|
|
|
+ # res = json.loads(oc_qs[0]["data"])
|
|
|
+ # return JsonResponse(status=200, data=res)
|
|
|
+ # # 套餐id
|
|
|
+ # storage = '{uid}/vod{channel}/'.format(uid=UID, channel=channel)
|
|
|
+ # bucket_name = ubqs[0]['bucket__bucket']
|
|
|
+ # endpoint = ubqs[0]['bucket__endpoint']
|
|
|
+ # access_key_id = OSS_STS_ACCESS_KEY
|
|
|
+ # access_key_secret = OSS_STS_ACCESS_SECRET
|
|
|
+ # region_id = ubqs[0]['bucket__region']
|
|
|
+ # role_arn = OSS_ROLE_ARN
|
|
|
+ # clt = client.AcsClient(access_key_id, access_key_secret, region_id)
|
|
|
+ # req = AssumeRoleRequest.AssumeRoleRequest()
|
|
|
+ # # 设置返回值格式为JSON。
|
|
|
+ # req.set_accept_format('json')
|
|
|
+ # req.set_RoleArn(role_arn)
|
|
|
+ # req.set_RoleSessionName(UID)
|
|
|
+ # req.set_DurationSeconds(3600)
|
|
|
+ # Resource_access = "acs:oss:*:*:{bucket_name}/{uid_channel}*".format(bucket_name=bucket_name,
|
|
|
+ # uid_channel=storage)
|
|
|
+ # print(Resource_access)
|
|
|
+ # policys = {
|
|
|
+ # "Version": "1",
|
|
|
+ # "Statement": [
|
|
|
+ # {
|
|
|
+ # "Action": ["oss:PutObject", "oss:DeleteObject", ],
|
|
|
+ # "Resource": [Resource_access],
|
|
|
+ # "Effect": "Allow",
|
|
|
+ # "Condition": {
|
|
|
+ # "IpAddress": {"acs:SourceIp": ip}
|
|
|
+ # # "IpAddress": {"acs:SourceIp": "120.237.157.184"}
|
|
|
+ # # "IpAddress": {"acs:SourceIp": "*"}
|
|
|
+ # }
|
|
|
+ # }
|
|
|
+ # ]
|
|
|
+ # }
|
|
|
+ # req.set_Policy(Policy=json.dumps(policys))
|
|
|
+ # body = clt.do_action(req)
|
|
|
+ # # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
|
|
|
+ # token = json.loads(body.decode('utf-8'))
|
|
|
+ # print(token)
|
|
|
+ # res = {
|
|
|
+ # 'AccessKeyId': token['Credentials']['AccessKeyId'],
|
|
|
+ # 'AccessKeySecret': token['Credentials']['AccessKeySecret'],
|
|
|
+ # 'SecurityToken': token['Credentials']['SecurityToken'],
|
|
|
+ # 'Expiration': token['Credentials']['Expiration'],
|
|
|
+ # 'expire': '3600',
|
|
|
+ # 'endpoint': endpoint,
|
|
|
+ # 'bucket_name': bucket_name,
|
|
|
+ # 'arn': token['AssumedRoleUser']['Arn'],
|
|
|
+ # 'code': 0,
|
|
|
+ # 'storage': storage,
|
|
|
+ # 'endTime': ubqs[0]['endTime'],
|
|
|
+ # 'ip': ip}
|
|
|
+ # if oc_qs.exists():
|
|
|
+ # oc_qs.update(data=json.dumps(res), addTime=now_time)
|
|
|
+ # else:
|
|
|
+ # OssCrdModel.objects.create(uid=UID, channel=channel, data=json.dumps(res), addTime=now_time)
|
|
|
+ # return JsonResponse(status=200, data=res)
|
|
|
|
|
|
def do_paypal_execute(self, request_dict, response):
|
|
|
paymentId = request_dict.get('paymentId', None)
|
|
@@ -777,6 +534,7 @@ class CloudVodView(View):
|
|
|
paypalrestsdk.configure(PAYPAL_CRD)
|
|
|
# ID of the payment. This ID is provided when creating payment.
|
|
|
payment = paypalrestsdk.Payment.find(paymentId)
|
|
|
+ print(payment)
|
|
|
payres = payment.execute({"payer_id": PayerID})
|
|
|
print(payres)
|
|
|
if not payres:
|
|
@@ -954,239 +712,186 @@ class CloudVodView(View):
|
|
|
{'name': vod['time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec'], 'id': vod['id']})
|
|
|
return response.json(0, vod_play_list)
|
|
|
|
|
|
- def do_pay_status(self, request_dict, userID):
|
|
|
+ def do_pay_status(self, request_dict, userID, response):
|
|
|
orderID = request_dict.get('orderID', None)
|
|
|
- om_qs = Order_Model.objects.filter(userID_id=userID, orderID=orderID).values('status')
|
|
|
- response = HttpResponse()
|
|
|
- success_pay_content = '''
|
|
|
-
|
|
|
- <!DOCTYPE html>
|
|
|
- <html>
|
|
|
- <head>
|
|
|
- <!--浏览器不缓存-->
|
|
|
- <meta http-equiv="Pragma" content="no-cache">
|
|
|
- <meta http-equiv="Cache-Control" content="no-cache">
|
|
|
- <meta http-equiv="Expires" content="0">
|
|
|
- <!--utf-8-->
|
|
|
- <meta http-equiv="content-type" content="text/html;charset=utf-8">
|
|
|
- <!-- viewport的<meta>标签,这个标签可以修改在大部分的移动设备上面的显示,为了确保适当的绘制和触屏缩放。-->
|
|
|
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
- <link rel="shortcut icon" href="https://test.dvema.com/web/images/favicon.ico" type="image/x-icon" charset="utf-8"/>
|
|
|
- <title>Trading particulars</title>
|
|
|
- <style>
|
|
|
- .title_head{
|
|
|
- height: 50px;
|
|
|
- border-radius: 5px;
|
|
|
- background-color: #c3c6c7;
|
|
|
- text-align: center;
|
|
|
- line-height: 50px;
|
|
|
- }
|
|
|
- .content{
|
|
|
- text-align: center;
|
|
|
- margin-top: 50px;
|
|
|
- font-size: 20px;
|
|
|
- color : green
|
|
|
- }
|
|
|
- .content_img{
|
|
|
- width: 60px;
|
|
|
- height: 60px;
|
|
|
- }
|
|
|
- .bottom{
|
|
|
- margin-bottom: 10px;
|
|
|
- margin-top: 250px;
|
|
|
- color : green
|
|
|
- }
|
|
|
- .bottom_div{
|
|
|
- border: 1px solid green;
|
|
|
- line-height: 38px;
|
|
|
- text-align: center;
|
|
|
- width: 100px;
|
|
|
- height: 38px;
|
|
|
- border-radius: 5px;
|
|
|
- }
|
|
|
-
|
|
|
- .bottom_div:hover{
|
|
|
- background-color: #dde4e2;
|
|
|
- }
|
|
|
- </style>
|
|
|
- </head>
|
|
|
- <body>
|
|
|
- <div class="title_head">Trading particulars</div>
|
|
|
- <div class="content">
|
|
|
- <p >
|
|
|
- <img src="https://test.dvema.com/web/images/timg.jpg" class="content_img">
|
|
|
- <br />
|
|
|
- Successful payment
|
|
|
- </p>
|
|
|
- </div>
|
|
|
- <center class="bottom">
|
|
|
- <div class="bottom_div" onclick="payOKButton()">
|
|
|
- Finish
|
|
|
- </div>
|
|
|
- </center>
|
|
|
- <script> // 点击付款成功按钮
|
|
|
- function payOKButton() {
|
|
|
- // 复杂数据
|
|
|
- console.log('success')
|
|
|
- window.webkit.messageHandlers.jsCallOC.postMessage({"status": 1});
|
|
|
- }
|
|
|
- </script>
|
|
|
- </body>
|
|
|
- </html>
|
|
|
- '''
|
|
|
- falil_pay_content = '''
|
|
|
- <!DOCTYPE html>
|
|
|
- <html>
|
|
|
- <head>
|
|
|
- <!--浏览器不缓存-->
|
|
|
- <meta http-equiv="Pragma" content="no-cache">
|
|
|
- <meta http-equiv="Cache-Control" content="no-cache">
|
|
|
- <meta http-equiv="Expires" content="0">
|
|
|
- <!--utf-8-->
|
|
|
- <meta http-equiv="content-type" content="text/html;charset=utf-8">
|
|
|
- <!-- viewport的<meta>标签,这个标签可以修改在大部分的移动设备上面的显示,为了确保适当的绘制和触屏缩放。-->
|
|
|
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
- <link rel="shortcut icon" href="https://test.dvema.com/web/images/favicon.ico" type="image/x-icon" charset="utf-8"/>
|
|
|
- <title>Trading particulars</title>
|
|
|
- <style>
|
|
|
- .title_head{
|
|
|
- height: 50px;
|
|
|
- border-radius: 5px;
|
|
|
- background-color: #c3c6c7;
|
|
|
- text-align: center;
|
|
|
- line-height: 50px;
|
|
|
- }
|
|
|
- .content{
|
|
|
- text-align: center;
|
|
|
- margin-top: 50px;
|
|
|
- font-size: 20px;
|
|
|
- color : #ec7648
|
|
|
- }
|
|
|
- .content_img{
|
|
|
- width: 60px;
|
|
|
- height: 60px;
|
|
|
- }
|
|
|
- .bottom{
|
|
|
- margin-bottom: 10px;
|
|
|
- margin-top: 250px;
|
|
|
- color : #ec7648
|
|
|
- }
|
|
|
- .bottom_div{
|
|
|
- border: 1px solid #ec7648;
|
|
|
- line-height: 38px;
|
|
|
- text-align: center;
|
|
|
- width: 100px;
|
|
|
- height: 38px;
|
|
|
- border-radius: 5px;
|
|
|
- }
|
|
|
-
|
|
|
- .bottom_div:hover{
|
|
|
- background-color: #dde4e2;
|
|
|
- }
|
|
|
- </style>
|
|
|
- </head>
|
|
|
- <body>
|
|
|
- <div class="title_head">Trading particulars</div>
|
|
|
- <div class="content">
|
|
|
- <p >
|
|
|
- <img src="https://test.dvema.com/web/images/failed.jpg" class="content_img">
|
|
|
- <br />
|
|
|
- Payment failure
|
|
|
- </p>
|
|
|
- </div>
|
|
|
- <center class="bottom">
|
|
|
- <div class="bottom_div" onclick="payOKButton()">
|
|
|
- Finish
|
|
|
- </div>
|
|
|
- </center>
|
|
|
- <script> // 点击付款成功按钮
|
|
|
- function payOKButton() {
|
|
|
- // 复杂数据
|
|
|
- console.log('success')
|
|
|
- window.webkit.messageHandlers.jsCallOC.postMessage({"status": 0});
|
|
|
- }
|
|
|
- </script>
|
|
|
- </body>
|
|
|
- </html>
|
|
|
- '''
|
|
|
+ lang = request_dict.get('lang', 'en')
|
|
|
+ om_qs = Order_Model.objects.filter(orderID=orderID).values('status')
|
|
|
+ # response = HttpResponse()
|
|
|
+ # success_pay_content = '''
|
|
|
+ # '''
|
|
|
+ # falil_pay_content = '''
|
|
|
+ #
|
|
|
+ # '''
|
|
|
+
|
|
|
+ status = 0
|
|
|
+ url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+
|
|
|
if om_qs.exists():
|
|
|
- if om_qs[0]['status'] == 1:
|
|
|
- response.content = success_pay_content
|
|
|
- return response
|
|
|
+ status = om_qs[0]['status']
|
|
|
+ if status == 1:
|
|
|
+
|
|
|
+ url = "{SERVER_DOMAIN}web/paid2/success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
else:
|
|
|
- # response.content = falil_pay_content
|
|
|
- # return response
|
|
|
- # exit()
|
|
|
- # 如果未支付则调用查询订单是否支付成功
|
|
|
- aliPayObj = AliPayObject()
|
|
|
- alipay = aliPayObj.conf()
|
|
|
- # check order status
|
|
|
- print("now sleep 3s")
|
|
|
- # time.sleep(3)
|
|
|
- result = alipay.api_alipay_trade_query(out_trade_no=orderID)
|
|
|
- if result.get("trade_status", "") == "TRADE_SUCCESS":
|
|
|
- print('paid')
|
|
|
- print("trade succeed")
|
|
|
- order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
|
|
|
- if order_qs.exists():
|
|
|
- nowTime = int(time.time())
|
|
|
- order_list = order_qs.values("UID", "rank__id", "channel")
|
|
|
- rank_id = order_list[0]['rank__id']
|
|
|
- print(rank_id)
|
|
|
- UID = order_list[0]['UID']
|
|
|
- channel = order_list[0]['channel']
|
|
|
- order_qs.update(status=1, updTime=nowTime)
|
|
|
-
|
|
|
- smqs = Store_Meal.objects.filter(id=rank_id).values("day", "bucket_id", "bucket__storeDay")
|
|
|
- bucketId = smqs[0]['bucket_id']
|
|
|
- if not smqs.exists():
|
|
|
- response.content = falil_pay_content
|
|
|
- return response
|
|
|
- addTime = int(smqs[0]["day"]) * 24 * 3600
|
|
|
- ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel). \
|
|
|
- values("bucket_id", "endTime", "bucket__storeDay")
|
|
|
- nowTime = int(time.time())
|
|
|
- if ubqs.exists():
|
|
|
- # 判断是否过期了
|
|
|
- if nowTime > ubqs[0]['endTime']:
|
|
|
- ubqs.update(endTime=nowTime + addTime)
|
|
|
- else:
|
|
|
- # 同一个bucket续费
|
|
|
- if bucketId == ubqs[0]['bucket_id']:
|
|
|
- ubqs.update(endTime=ubqs[0]['endTime'] + addTime)
|
|
|
- else:
|
|
|
- if ubqs[0]['bucket__storeDay'] > smqs[0]['bucket__storeDay']:
|
|
|
- response.content = falil_pay_content
|
|
|
- return response
|
|
|
- else:
|
|
|
- # 升级
|
|
|
- origin_storeDay = int(ubqs[0]['bucket__storeDay'])
|
|
|
- upgrade_storeDay = int(smqs[0]['bucket__storeDay'])
|
|
|
- ctcTime = ubqs[0]['endTime'] - nowTime
|
|
|
- multiple = math.ceil(upgrade_storeDay / origin_storeDay)
|
|
|
- ubqs.update(endTime=ctcTime / multiple + addTime + ubqs[0]['endTime'],
|
|
|
- bucket_id=bucketId)
|
|
|
- # 付款成功把oss token删除
|
|
|
- OssCrdModel.objects.filter(uid=UID, channel=channel).delete()
|
|
|
- # 新增模式
|
|
|
- else:
|
|
|
- print('create')
|
|
|
- UID_Bucket.objects.create(uid=UID, channel=channel,
|
|
|
- bucket_id=bucketId, endTime=nowTime + addTime)
|
|
|
-
|
|
|
- response.content = success_pay_content
|
|
|
- return response
|
|
|
- else:
|
|
|
- response.content = falil_pay_content
|
|
|
- return response
|
|
|
+
|
|
|
+ url = "{SERVER_DOMAIN}web/paid2/fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+
|
|
|
+ if lang !='cn':
|
|
|
+ status = 0
|
|
|
+ url = "{SERVER_DOMAIN}web/paid2/en_fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+
|
|
|
+ if om_qs.exists():
|
|
|
+ status = om_qs[0]['status']
|
|
|
+ if status == 1:
|
|
|
+
|
|
|
+ url = "{SERVER_DOMAIN}web/paid2/en_success.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+ else:
|
|
|
+
|
|
|
+ url = "{SERVER_DOMAIN}web/paid2/en_fail.html".format(SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
+
|
|
|
+ res = {'status': status, 'url': url}
|
|
|
+ return response.json(0, res)
|
|
|
+
|
|
|
+ def query_alipay_order(self, request_dict, userID, response):
|
|
|
+ out_trade_no = request_dict.get('out_trade_no', None)
|
|
|
+
|
|
|
+ if out_trade_no is None:
|
|
|
+ return response.json(444)
|
|
|
+
|
|
|
+ try:
|
|
|
+ aliPayObj = AliPayObject()
|
|
|
+ alipay = aliPayObj.conf()
|
|
|
+ result = alipay.api_alipay_trade_query(out_trade_no=out_trade_no)
|
|
|
+ print(result)
|
|
|
+ except Exception as e:
|
|
|
+ print(repr(e))
|
|
|
+ return response.json(10, repr(e))
|
|
|
+ return response.json(0, {'result': result})
|
|
|
+
|
|
|
+ def do_alipay_cancel(self, request_dict, userID, response):
|
|
|
+ out_trade_no = request_dict.get('out_trade_no', None)
|
|
|
+
|
|
|
+ if out_trade_no is None:
|
|
|
+ return response.json(444)
|
|
|
+
|
|
|
+ order_qs = Order_Model.objects.filter(orderID=out_trade_no)
|
|
|
+ if not order_qs.exists():
|
|
|
+ return response.json(800)
|
|
|
+
|
|
|
+ order = order_qs[0]
|
|
|
+
|
|
|
+ # 交易状态:
|
|
|
+ # WAIT_BUYER_PAY(交易创建,等待买家付款)
|
|
|
+ # TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)
|
|
|
+ # TRADE_SUCCESS(交易支付成功)
|
|
|
+ # TRADE_FINISHED(交易结束,不可退款)
|
|
|
+
|
|
|
+ try:
|
|
|
+ aliPayObj = AliPayObject()
|
|
|
+ alipay = aliPayObj.conf()
|
|
|
+ result = alipay.api_alipay_trade_query(out_trade_no=out_trade_no)
|
|
|
+ result = result['result']
|
|
|
+
|
|
|
+ if result['code'] == '100000':
|
|
|
+ trade_status = result['trade_status']
|
|
|
+ if trade_status == 'TRADE_CLOSED' or trade_status == 'WAIT_BUYER_PAY':
|
|
|
+ order.status = 2
|
|
|
+ order.updTime = int(time.time())
|
|
|
+ order.save()
|
|
|
+ return response.json(0)
|
|
|
else:
|
|
|
- print("not paid...")
|
|
|
- response.content = falil_pay_content
|
|
|
- return response
|
|
|
+ order.status = 1
|
|
|
+ order.updTime = int(time.time())
|
|
|
+ order.save()
|
|
|
+ return response.json(802)
|
|
|
+ else:
|
|
|
+ return response.json(10, result['sub_msg'])
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ print(repr(e))
|
|
|
+ return response.json(10, repr(e))
|
|
|
+
|
|
|
+ def do_alipay_refund(self, request_dict, userID, response):
|
|
|
+ out_trade_no = request_dict.get('out_trade_no', None)
|
|
|
+ refund_amount = request_dict.get('refund_amount', None)
|
|
|
+ reason = request_dict.get('reason', '正常退款')
|
|
|
+
|
|
|
+ if out_trade_no is None:
|
|
|
+ return response.json(444)
|
|
|
+
|
|
|
+ order_qs = Order_Model.objects.filter(orderID=out_trade_no)
|
|
|
+
|
|
|
+ if not order_qs.exists():
|
|
|
+ return response.json(800)
|
|
|
|
|
|
+ order = order_qs[0]
|
|
|
+ if refund_amount > order.price:
|
|
|
+ return response.json(801)
|
|
|
+
|
|
|
+ try:
|
|
|
+ # extra = {
|
|
|
+ # 'refund_currency': order[0].currency
|
|
|
+ # }
|
|
|
+ aliPayObj = AliPayObject()
|
|
|
+ alipay = aliPayObj.conf()
|
|
|
+ result = alipay.api_alipay_trade_refund(refund_amount=refund_amount, out_trade_no=out_trade_no)
|
|
|
+ result = result['result']
|
|
|
+ print(result)
|
|
|
+ if result['code'] == '10000':
|
|
|
+ order.status = 3
|
|
|
+ order.updTime = int(time.time())
|
|
|
+ order.save()
|
|
|
+ return response.json(0)
|
|
|
+ else:
|
|
|
+ return response.json(10, result['sub_msg'])
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ print(repr(e))
|
|
|
+ return response.json(10, repr(e))
|
|
|
+
|
|
|
+ def do_paypal_refund(self, request_dict, userID, response):
|
|
|
+ out_trade_no = request_dict.get('out_trade_no', None)
|
|
|
+ refund_amount = request_dict.get('refund_amount', None)
|
|
|
+
|
|
|
+ order_qs = Order_Model.objects.filter(orderID=out_trade_no, userID__userID=userID)
|
|
|
+
|
|
|
+ if not order_qs.exists():
|
|
|
+ return response.json(800)
|
|
|
+
|
|
|
+ order = order_qs[0]
|
|
|
+
|
|
|
+ refund_amount = float(refund_amount)
|
|
|
+ if order.price < refund_amount:
|
|
|
+ return response.json(801)
|
|
|
+
|
|
|
+ paypalrestsdk.configure(PAYPAL_CRD)
|
|
|
+ payment = paypalrestsdk.Payment.find(order.trade_no)
|
|
|
+ transactions = payment['transactions']
|
|
|
+ transaction = transactions[0]
|
|
|
+ related_resources = transaction['related_resources']
|
|
|
+ if len(related_resources) > 0:
|
|
|
+ related_resource = related_resources[0]
|
|
|
+ sale = related_resource['sale']
|
|
|
+ id = sale['id']
|
|
|
+
|
|
|
+ if sale['state'] == 'completed':
|
|
|
+ paypalSale = paypalrestsdk.Sale.find(id)
|
|
|
+ refund = paypalSale.refund({
|
|
|
+ 'amount': {
|
|
|
+ 'total': refund_amount,
|
|
|
+ 'currency': order.currency
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ if refund.success():
|
|
|
+ return response.json(0)
|
|
|
+ else:
|
|
|
+ return response.json(10, refund.error)
|
|
|
+ elif sale['state'] == 'refunded':
|
|
|
+ return response.json(804)
|
|
|
else:
|
|
|
- response.content = falil_pay_content
|
|
|
- return response
|
|
|
+ return response.json(804)
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
def deleteVodHls(request):
|