1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
- @AUTHOR: ASJRD018
- @NAME: AnsjerFormal
- @software: PyCharm
- @DATE: 2018/12/5 9:30
- @Version: python3.6
- @MODIFY DECORD:ansjer dev
- @file: CloudVod.py
- @Contact: chanjunkai@163.com
- """
- import json
- import math
- import time
- import urllib
- from Object.AliPayObject import AliPayObject
- import oss2
- import paypalrestsdk
- from aliyunsdkcore import client
- from aliyunsdksts.request.v20150401 import AssumeRoleRequest
- from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
- from django.utils.decorators import method_decorator
- from django.views.decorators.csrf import csrf_exempt
- from django.views.generic.base import View
- from Ansjer.config import BASE_DIR
- from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD
- from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket
- from Object.ResponseObject import ResponseObject
- from Object.TokenObject import TokenObject
- from Object.UidTokenObject import UidTokenObject
- from Service.CommonService import CommonService
- from Service.ModelService import ModelService
- '''
- # 获取设备推送hls流 证书
- http://192.168.136.40:8077/cloudVod/getSts?uidToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJGVFNMTDhITTQzN1ozOFdVMTExQSIsImNoYW5uZWwiOiI0In0.HO-PzoRwhQ4CFNkjthqOitf48c-XOvHjtNGCeUmBe9g
- # 获取存储的播放文件列表
- #修改状态
- http://192.168.136.40:8077/cloudVod/status?token=local&uid=xxx&channel=4&status=1
- # 回调vod
- http://192.168.136.40:8077/cloudVod/storeplaylist?uidToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJGVFNMTDhITTQzN1ozOFdVMTExQSIsImNoYW5uZWwiOiI0In0.HO-PzoRwhQ4CFNkjthqOitf48c-XOvHjtNGCeUmBe9g&time=1234567891
- =============================
- # 生成订单
- http://test.dvema.com/cloudVod/createOrder?token=test&uid=xxx&channel=4&rank=1
- # 修改设备云存状态
- http://test.dvema.com/cloudVod/status?uid=xxx&channel=4&token=test&status=1
- # 获取指定设备云存关联信息
- http://test.dvema.com/cloudVod/details?token=test&uid=xxxx
- # 获取回放列表
- http://test.dvema.com/cloudVod/getHlsList?uid=xxxx&channel=4&token=test&daytime=2018121001
- 2设备端
- http://test.dvema.com/cloudVod/getSts?uidToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjaGFubmVsIjoiNCIsInVpZCI6IkZUU0xMOEhNNDM3WjM4V1UxMTFBIn0.wkrwYvIYf5qEukOSTxALSAgSqop-gNBdEvSwScOgYB8
- # 支付宝支付
- http://192.168.136.40:8077/cloudVod/aliPayCreateOrder?token=local&channel=2&rank=1&uid=OOBDSU9547NTRSMF111A
- '''
- # 设备信息添加
- class CloudVodView(View):
- @method_decorator(csrf_exempt)
- def dispatch(self, *args, **kwargs):
- return super(CloudVodView, self).dispatch(*args, **kwargs)
- def get(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- return self.validation(request.GET, request, operation)
- def post(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- return self.validation(request.POST, request, operation)
- def validation(self, request_dict, request, operation):
- response = ResponseObject()
- # operation => cloudVod/path
- if operation is None:
- return response.json(444, 'error path')
- if operation == 'getSts':
- # 移动侦测获取设备sts证书
- ip = CommonService.get_ip_address(request)
- return self.do_getSts(request_dict, ip, response)
- # 付款完成
- elif operation == 'payExecute':
- return self.do_paypal_execute(request_dict, response)
- elif operation == 'storeplaylist':
- return self.do_store_palylist(request_dict, response)
- elif operation == 'payOK':
- return self.do_pay_ok()
- elif operation == 'payError':
- return self.do_pay_error()
- elif operation == 'aliPayCallback':
- return self.do_ali_pay_callback(request)
- else:
- token = request_dict.get('token', None)
- # 设备主键uid
- tko = TokenObject(token)
- response.lang = tko.lang
- 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':
- return self.do_change_status(request_dict, userID, response)
- elif operation == 'details':
- return self.do_get_details(request_dict, response)
- elif operation == 'filterVod':
- 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)
- 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="测试哟",
- # subject="实用性充气式玩具",
- return_url="https://test.dvema.com/cloudVod/payOK",
- notify_url="https://test.dvema.com/cloudVod/aliPayCallback"
- # 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, 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, '生成订单错误')
- def do_get_details(self, request_dict, response):
- uid = request_dict.get('uid', None)
- dvqs = Device_Info.objects.filter(UID=uid, isShare=False)
- if not dvqs.exists():
- return response.json(12)
- ubqs = UID_Bucket.objects.filter(uid=uid). \
- values('bucket__content', 'status', 'channel', 'endTime', 'uid')
- res = []
- if ubqs.exists():
- res = list(ubqs)
- return response.json(0, res)
- def do_pay_error(self):
- response = HttpResponse()
- response.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>
- '''
- return response
- def do_pay_ok(self):
- response = HttpResponse()
- response.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>
- '''
- return response
- 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
- 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)
- 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", "rank_id", "channel")
- rank_id = order_list[0]['rank_id']
- UID = order_list[0]['UID']
- channel = order_list[0]['channel']
- 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)
- # return response.json(0)
- red_url = "{SERVER_DOMAIN}cloudVod/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
- return HttpResponseRedirect(red_url)
- def do_change_status(self, request_dict, userID, response):
- uid = request_dict.get('uid', None)
- status = request_dict.get('status', None)
- channel = request_dict.get('channel', None)
- if not uid or not status or not channel:
- return response.json(444, 'uid,status,channel')
- dvqs = Device_Info.objects.filter(UID=uid, userID_id=userID, isShare=False)
- if not dvqs.exists():
- return response.json(12)
- ubqs = UID_Bucket.objects.filter(channel=channel, uid=uid)
- if not ubqs.exists():
- return response.json(10, '未购买')
- now_time = int(time.time())
- if now_time > ubqs[0].endTime:
- return response.json(10, '已过期')
- ubqs.update(status=status)
- if status == 0:
- return response.json(0)
- utko = UidTokenObject()
- utko.generate(data={'uid': uid, 'channel': channel})
- uidTkUrl = "{SERVER_DOMAIN}cloudVod/getSts?uidToken={uidToken}". \
- format(uidToken=utko.token, SERVER_DOMAIN=SERVER_DOMAIN)
- storeHlsUrl = "{SERVER_DOMAIN}cloudVod/storeplaylist?uidToken={uidToken}". \
- format(uidToken=utko.token, SERVER_DOMAIN=SERVER_DOMAIN)
- return response.json(0, {'uidTkUrl': uidTkUrl, 'storeHlsUrl': storeHlsUrl})
- def do_store_palylist(self, request_dict, response):
- uidToken = request_dict.get('uidToken', None)
- storeTime = request_dict.get('time', None)
- sec = request_dict.get('sec', None)
- utko = UidTokenObject(uidToken)
- if utko.flag is False:
- return response.json(444, 'uidToken')
- if not uidToken or not storeTime or not sec:
- return response.json(444, 'uidToken,time,sec')
- UID = utko.UID
- channel = utko.channel
- print(channel)
- print(UID)
- nowTime = int(time.time())
- if not OssCrdModel.objects.filter(uid=UID, channel=channel).exists():
- res = {'code': 404, 'msg': '设备未购买'}
- return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
- qs = UID_Bucket.objects.filter(uid=UID, channel=channel, status=1, endTime__gte=nowTime). \
- values("channel", "bucket__storeDay", "bucket_id")
- if not qs.exists():
- res = {'code': 404, 'msg': '设备未购买'}
- return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
- storeDay = qs[0]['bucket__storeDay']
- bucketID = qs[0]['bucket_id']
- endTime = int(storeTime) + storeDay * 86400
- VodHlsModel.objects.create(uid=UID, channel=channel, time=storeTime,
- endTime=endTime, bucket_id=bucketID, sec=sec)
- return response.json(0)
- def do_filter_playlist(self, request_dict, userID, response):
- startTime = int(request_dict.get('startTime', None))
- endTime = int(request_dict.get('endTime', None))
- uid = request_dict.get('uid', None)
- channel = request_dict.get('channel', None)
- dvqs = Device_Info.objects.filter(UID=uid, userID_id=userID, isShare=False)
- if not dvqs.exists():
- return response.json(12)
- ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel).values('status')
- if not ubqs.exists():
- return response.json(10, '设备未购买')
- nowTime = int(time.time())
- vodqs = VodHlsModel.objects.filter(uid=uid, channel=channel, time__range=(startTime, endTime),
- endTime__gte=nowTime) \
- .values("time", "sec", "bucket__bucket", "bucket__endpoint", "bucket__region")
- vod_play_list = []
- print(vodqs)
- auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
- for vod in vodqs:
- bucket_name = vod["bucket__bucket"]
- endpoint = vod["bucket__endpoint"]
- bucket = oss2.Bucket(auth, endpoint, bucket_name)
- m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
- format(uid=uid, channel=channel, time=vod['time'])
- ts = '{uid}/vod{channel}/{time}/ts0.ts'. \
- format(uid=uid, channel=channel, time=vod['time'])
- url = bucket.sign_url('GET', m3u8, 3600, params={'x-oss-process': 'hls/sign'})
- urllst = url.split('?')
- url_start = urllib.parse.unquote(urllst[0])
- url_end = urllst[1]
- vod_play_url = '{url_start}?{url_end}'. \
- format(url_start=url_start, url_end=url_end)
- thumb = bucket.sign_url('GET', ts, 3600,
- params={'x-oss-process': 'video/snapshot,t_10000,m_fast,w_300'})
- vod_play_list.append({'name': vod['time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec']})
- return response.json(0, vod_play_list)
- # backend find play list0
- def do_find_playlist(self, request_dict, userID, response):
- startTime = int(request_dict.get('startTime', None))
- endTime = int(request_dict.get('endTime', None))
- UID = request_dict.get('uid', None)
- channel = request_dict.get('channel', None)
- own_perm = ModelService.check_perm(userID, 20)
- if own_perm is False:
- return response.json(404)
- nowTime = int(time.time())
- vodqs = VodHlsModel.objects.filter(uid=UID, channel=channel, time__range=(startTime, endTime),
- endTime__gte=nowTime) \
- .values("time", "sec", "bucket__bucket", "bucket__endpoint", "bucket__region", "id")
- vod_play_list = []
- print(vodqs)
- auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
- for vod in vodqs:
- bucket_name = vod["bucket__bucket"]
- endpoint = vod["bucket__endpoint"]
- bucket = oss2.Bucket(auth, endpoint, bucket_name)
- m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
- format(uid=UID, channel=channel, time=vod['time'])
- ts = '{uid}/vod{channel}/{time}/ts0.ts'. \
- format(uid=UID, channel=channel, time=vod['time'])
- url = bucket.sign_url('GET', m3u8, 3600, params={'x-oss-process': 'hls/sign'})
- urllst = url.split('?')
- url_start = urllib.parse.unquote(urllst[0])
- url_end = urllst[1]
- vod_play_url = '{url_start}?{url_end}'. \
- format(url_start=url_start, url_end=url_end)
- thumb = bucket.sign_url('GET', ts, 3600,
- params={'x-oss-process': 'video/snapshot,t_1000,m_fast,w_300'})
- vod_play_list.append(
- {'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):
- 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>
- '''
- if om_qs.exists():
- if om_qs[0]['status'] == 1:
- response.content = success_pay_content
- return response
- 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
- else:
- print("not paid...")
- response.content = falil_pay_content
- return response
- else:
- response.content = falil_pay_content
- return response
|