123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377 |
- #!/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: cloudstorage.py
- @Contact: chanjunkai@163.com
- """
- import json
- import time
- import urllib
- import boto3
- import oss2
- import paypalrestsdk
- import threading
- import calendar
- import datetime
- import logging
- from aliyunsdkcore import client
- from aliyunsdksts.request.v20150401 import AssumeRoleRequest
- from boto3.session import Session
- from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
- 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, StsCrdModel, \
- ExperienceContextModel, Pay_Type, CDKcontextModel
- from Object.AliPayObject import AliPayObject
- from Object.ResponseObject import ResponseObject
- from Object.TokenObject import TokenObject
- from Object.UidTokenObject import UidTokenObject
- from Service.CommonService import CommonService
- from Object.m3u8generate import PlaylistGenerator
- from Object.WechatPayObject import WechatPayObject
- from django.db.models import Q
- from Service.ModelService import ModelService
- SERVER_DOMAIN = 'http://test.dvema.com/'
- '''
- 生成订单
- http://test.dvema.com/cloudstorage/createpayorder?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiIxNTY3NzU4MjE4NjE5MTM4MDAxMzgwMDAiLCJleHAiOjE1ODk1MjM0OTIsIm1fY29kZSI6IjEyMzQxMzI0MzIxNCIsImxhbmciOiJlbiIsInVzZXIiOiIxMzExOTY1NzcxMyJ9.e2NdhJtbXrDngZTSmOX_52Y-oxyfUEXjZD_qNxg6VrU&uid=VVDHCVBYDKFMJRWA111A&channel=1&pay_type=0&commodity_code=aws_us_vod_7_val_30
- 开启开关
- http://test.dvema.com/cloudstorage/changevodstatus?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiIxNTY3NzU4MjE4NjE5MTM4MDAxMzgwMDAiLCJleHAiOjE1ODk1MjM0OTIsIm1fY29kZSI6IjEyMzQxMzI0MzIxNCIsImxhbmciOiJlbiIsInVzZXIiOiIxMzExOTY1NzcxMyJ9.e2NdhJtbXrDngZTSmOX_52Y-oxyfUEXjZD_qNxg6VrU&uid=VVDHCVBYDKFMJRWA111A&channel=1&status=1
- # 获取播放列表
- http://localhost:8077/cloudstorage/queryvodlist?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiIxNTY3NzU4MjE4NjE5MTM4MDAxMzgwMDAiLCJleHAiOjE1ODk1MjM0OTIsIm1fY29kZSI6IjEyMzQxMzI0MzIxNCIsImxhbmciOiJlbiIsInVzZXIiOiIxMzExOTY1NzcxMyJ9.e2NdhJtbXrDngZTSmOX_52Y-oxyfUEXjZD_qNxg6VrU&uid=VVDHCVBYDKFMJRWA111A&startTime=1&endTime=1954687458&channel=1
- # 存储视频列表信息
- http://test.dvema.com/cloudstorage/storeplaylist?uidToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJWVkRIQ1ZCWURLRk1KUldBMTExQSIsImNoYW5uZWwiOiIxIn0.eGwi5QKyrXi4WSKRbrUG7iFTChv_Utec2hSnqZkDKt8&time=1586940120&sec=20&fg=10
- # 获取订单列表
- http://localhost:8077/cloudstorage/queryorder?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySUQiOiIxNTY3NzU4MjE4NjE5MTM4MDAxMzgwMDAiLCJsYW5nIjoiZW4iLCJ1c2VyIjoiMTMxMTk2NTc3MTMiLCJtX2NvZGUiOiIxMjM0MTMyNDMyMTQiLCJleHAiOjE1ODk1OTIyNzh9.u211DHiMKg-pqhXv4b2yR__eNyOcSwBZCyPUGjsxFLU&page=1&line=10&uid=VVDHCVBYDKFMJRWA111A
- # commoditylist
- http://test.dvema.com/cloudstorage/commoditylist?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiIxNTY3NzU4MjE4NjE5MTM4MDAxMzgwMDAiLCJleHAiOjE1ODk1MjM0OTIsIm1fY29kZSI6IjEyMzQxMzI0MzIxNCIsImxhbmciOiJlbiIsInVzZXIiOiIxMzExOTY1NzcxMyJ9.e2NdhJtbXrDngZTSmOX_52Y-oxyfUEXjZD_qNxg6VrU
- '''
- # 设备信息添加
- class CloudStorageView(View):
- 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()
- if operation is None:
- return response.json(444, 'error path')
- elif operation == 'testpaly.m3u8':
- return self.do_test_play_m3u8(request_dict, response)
- elif operation == 'dopaypalcallback':
- return self.do_pay_by_paypal_callback(request_dict, response)
- elif operation == 'doalicallback':
- return self.do_pay_by_ali_callback(request)
- elif operation == 'dowechatnotify':
- return self.do_pay_by_wechat_callback(request_dict,response)
- elif operation == 'getsignsts':
- ip = CommonService.get_ip_address(request)
- return self.do_get_sign_sts(request_dict, ip, response)
- # return self.do_get_sign_sts_test(request_dict, ip, response)
- elif operation == 'storeplaylist':
- return self.do_store_playlist(request_dict, response)
- elif operation == 'signplaym3u8':
- return self.do_sign_play_m3u8(request_dict, response)
- elif operation == 'payOK':
- return self.do_pay_ok(request_dict)
- 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 == 'createpayorder':
- ip = CommonService.get_ip_address(request)
- return self.do_create_pay_order(request_dict, userID, ip, response)
- elif operation == 'changevodstatus':
- return self.do_change_vod_status(request_dict, userID, response)
- elif operation == 'queryvodlist':
- return self.do_query_vod_list(request_dict, userID, response)
- elif operation == 'commoditylist':
- return self.do_commodity_list(request_dict, userID, response)
- elif operation == 'queryorder':
- return self.do_query_order(request_dict, userID, response)
- elif operation == 'experienceorder':
- return self.do_experience_order(request_dict, userID, response)
- elif operation == 'experiencereset':
- return self.do_experience_reset(request_dict, userID, response)
- elif operation == 'deletevodlist':
- return self.deleteVodList(request_dict, userID, response)
- elif operation == 'devicecommodity':
- return self.device_commodity(request_dict, userID, response)
- elif operation == 'switchdevicecommodity':
- return self.switch_device_commodity(request_dict, userID, response)
- else:
- return response.json(414)
- def do_test_play_m3u8(self, request_dict, response):
- playlist_entries = [
- {
- 'name': 'https://azvod1.s3-ap-northeast-1.amazonaws.com/test/output000.ts',
- 'duration': 10,
- },
- {
- 'name': 'https://azvod1.s3-ap-northeast-1.amazonaws.com/test/output000.ts',
- 'duration': 10,
- },
- {
- 'name': 'https://azvod1.s3-ap-northeast-1.amazonaws.com/test/output000.ts',
- 'duration': 10,
- },
- ]
- playlist = PlaylistGenerator(playlist_entries).generate()
- # return HttpResponse(playlist)
- # response = HttpResponse(playlist, content_type="application/octet-stream")
- response = HttpResponse(playlist, content_type="application/vnd.apple.mpegurl")
- return response
- def do_query_order(self, request_dict, userID, response):
- status = request_dict.get('status', None)
- page = int(request_dict.get('page', None))
- line = int(request_dict.get('line', None))
- uid = request_dict.get('uid', None)
- order_qs = Order_Model.objects.filter(userID_id=userID)
- if status:
- order_qs = order_qs.filter(status=status)
- # 筛选指定设备id的订单
- if uid:
- order_qs = order_qs.filter(UID=uid)
- if not order_qs.exists():
- return response.json(173)
- # return response.json(10, '订单不存在')
- count = order_qs.count()
- order_ql = order_qs[(page - 1) * line:page * line]. \
- values("orderID", "UID", "channel", "desc", "price", "currency",
- "addTime", "updTime", "endTime", "pay_url", "payType",
- "status", "commodity_type", "commodity_code")
- order_list = list(order_ql)
- data = []
- nowTime = int(time.time())
- # 这里需要进行优化
- uid_list = []
- for od in order_list:
- uid_list.append(od['UID'])
- didqs = Device_Info.objects.filter(userID_id=userID, UID__in=uid_list). \
- values('id', 'UID', 'Type')
- for d in order_list:
- if d['status'] == 0:
- if d['addTime'] + 3600 < nowTime:
- d['status'] = 3
- for did in didqs:
- if d['UID'] == did['UID']:
- d['did'] = did['id']
- d['Type'] = did['Type']
- data.append(d)
- return response.json(0, {'data': data, 'count': count})
- def do_commodity_list(self, request_dict, userID, response):
- mold = request_dict.get('mold', None)
- uid = request_dict.get('uid', None)
- qs = Store_Meal.objects
- eq = ExperienceContextModel.objects.filter(uid=uid,experience_type=0).values('id')
- # userqs = Device_User.objects.filter(userID=userID).values('is_experience')
- if mold:
- qs = qs.filter(bucket__mold=mold)
- else:
- qs = qs.all()
- if eq:
- qs=qs.filter(~Q(pay_type='10'))
- else:
- qs = qs.filter(pay_type='10')
- qs=qs.filter(~Q(pay_type='11')) #过滤不显示激活码套餐
- qs = qs.values("id", "title", "content", "price","day", "currency", "bucket__storeDay",
- "bucket__bucket", "bucket__area","commodity_code",
- "commodity_type", "is_discounts", "virtual_price", "expire",
- "discount_price", "discount_content","symbol")
- if qs.exists():
- ql = list(qs)
- from operator import itemgetter
- from itertools import groupby
- ql.sort(key=itemgetter('bucket__area'))
- res = []
- for area, items in groupby(ql, key=itemgetter('bucket__area')):
- items_list = list(items)
- for key, val in enumerate(items_list):
- pay_types = Pay_Type.objects.filter(store_meal=items_list[key]['id']).values("id","payment")
- items_list[key]['pay_type'] = list(pay_types)
- res_c = {'area': area, 'items': items_list}
- res.append(res_c)
- result = {
- 'meals': res,
- 'extra':
- {
- 'cloud_banner': 'https://www.dvema.com/web/images/cloud_cn_banner.png',
- 'cloud_en_baner': 'https://www.dvema.com/web/images/cloud_en_banner.png'
- }
- }
- return response.json(0, result)
- else:
- return response.json(0)
- def do_sign_play_m3u8(self, request_dict, response):
- uid = request_dict.get('uid', None)
- channel = request_dict.get('channel', None)
- storeTime = request_dict.get('time', None)
- now_time = int(time.time())
- vh_qs = VodHlsModel.objects.filter(uid=uid, channel=channel, time=storeTime, endTime__gte=now_time). \
- values("sec", "fg", "bucket__bucket", "bucket__endpoint", "bucket__region", "bucket__mold")
- if not vh_qs.exists():
- return response.json(173)
- sec = vh_qs[0]['sec']
- fg = vh_qs[0]['fg']
- bucket__region = vh_qs[0]['bucket__region']
- bucket_name = vh_qs[0]['bucket__bucket']
- print(bucket__region)
- print(bucket_name)
- aws_access_key_id = 'AKIA2E67UIMD45Y3HL53'
- aws_secret_access_key = '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'
- session = Session(
- aws_access_key_id=aws_access_key_id,
- aws_secret_access_key=aws_secret_access_key,
- region_name=bucket__region
- )
- '''
- http://test.dvema.com/cloudstorage/signplaym3u8?uid=VVDHCVBYDKFMJRWA111A&channel=1&time=1586940120&sign=tktktktk
- '''
- conn = session.client('s3')
- playlist_entries = []
- # for i in range(fg):
- # thumbspng = '{uid}/vod{channel}/{time}/ts{i}.ts'. \
- # format(uid=uid, channel=channel, time=storeTime, i=i)
- # response_url = conn.generate_presigned_url(
- # 'get_object',
- # Params={
- # 'Bucket': bucket_name,
- # 'Key': thumbspng
- # },
- # ExpiresIn=3600
- # )
- # # m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
- # # format(uid=uid, channel=channel, time=vod['time'])
- # playlist_entries.append({
- # 'name': response_url,
- # 'duration': sec,
- # })
- fg = int(fg)
- ts_count = fg & 0xf
- for i in range(ts_count):
- shift = (i+1)*4
- duration = (fg >> shift) & 0xf
- if duration > 0:
- tsFile = '{uid}/vod{channel}/{time}/ts{i}.ts'. \
- format(uid=uid, channel=channel, time=storeTime, i=i)
- response_url = conn.generate_presigned_url(
- 'get_object',
- Params={
- 'Bucket': bucket_name,
- 'Key': tsFile
- },
- ExpiresIn=3600
- )
- # m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
- # format(uid=uid, channel=channel, time=vod['time'])
- playlist_entries.append({
- 'name': response_url,
- 'duration': duration,
- })
- playlist = PlaylistGenerator(playlist_entries).generate()
- response = HttpResponse(playlist)
- response['Content-Type'] = 'application/octet-stream'
- response['Content-Disposition'] = 'attachment;filename="play.m3u8"'
- return response
- # response = HttpResponse(playlist, content_type="application/vnd.apple.mpegurl")
- # response = HttpResponse(playlist, content_type="application/octet-stream")
- # return response
- def do_get_sign_sts(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)
- now_time = int(time.time())
- ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time). \
- values("bucket__mold", "bucket__bucket", "bucket__endpoint",
- "bucket__region", "endTime").order_by('addTime')[:1]
- 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)
- 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='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',
- region_name=REGION_NAME
- )
- print('--------2--test')
- print(REGION_NAME)
- Policy = {
- "Version": "2012-10-17",
- "Statement": [
- {
- "Effect": "Allow",
- "Action": "s3:*",
- "Resource": ["arn:aws:s3:::{bucket_name}/{uid_channel}*".
- format(bucket_name=bucket_name,uid_channel=storage)]
- }
- ]
- }
- print(Policy)
- response = boto3_sts.get_federation_token(
- Name='{role_name}'.format(role_name=uid + '_' + str(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")
- res = {'code': 405, 'msg': 'Not purchased or expired!'}
- return HttpResponse(json.dumps(res, ensure_ascii=False),content_type="application/json,charset=utf-8")
- def do_query_vod_list(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)
- dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False).values('primaryUserID',
- 'primaryMaster')
- if not dv_qs.exists():
- return response.json(12)
- if dv_qs[0]['primaryUserID'] != '' and dv_qs[0]['primaryUserID'] != userID:
- return response.json(10034)
- now_time = int(time.time())
- bv_qs = UID_Bucket.objects.filter(uid=uid,channel=channel, endTime__gte=now_time).order_by('addTime')
- if not bv_qs.exists():
- return response.json(10030)
- vh_qs = VodHlsModel.objects.filter \
- ( uid=uid, channel=channel, time__range=(startTime, endTime), endTime__gte=now_time). \
- values("id", "time", "sec", "bucket__bucket", "fg", "bucket__endpoint", "bucket__region", "bucket__mold")
- vod_play_list = []
- print(int(time.time()))
- for vod in vh_qs:
- bucket__mold = vod["bucket__mold"]
- bucket_name = vod["bucket__bucket"]
- endpoint = vod["bucket__endpoint"]
- bucket__region = vod["bucket__region"]
- if bucket__mold == 0:
- auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
- 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'], 'vod_id': vod['id']})
- elif bucket__mold == 1:
- # aws_access_key_id = 'AKIA2E67UIMD45Y3HL53'
- # aws_secret_access_key = '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'
- # session = Session(
- # aws_access_key_id=aws_access_key_id,
- # aws_secret_access_key=aws_secret_access_key,
- # region_name=bucket__region
- # )
- # conn = session.client('s3')
- #
- # thumbspng = '{uid}/vod{channel}/{time}/Thumb.jpeg'. \
- # format(uid=uid, channel=channel, time=vod['time'])
- # response_url = conn.generate_presigned_url(
- # 'get_object',
- # Params={
- # 'Bucket': bucket_name,
- # 'Key': thumbspng
- # },
- # ExpiresIn=3600
- # )
- # thumb_url = response_url
- vod_url = '{server_domain}/cloudstorage/signplaym3u8?' \
- 'uid={uid}&channel={channel}&time={time}&sign=tktktktk'. \
- format(server_domain=SERVER_DOMAIN,uid=uid, channel=channel, time=vod['time'])
- ts_num = int(vod['fg']) & 0xf
- vod_play_list.append({
- 'name': vod['time'],
- 'sign_url': vod_url,
- # 'thumb': thumb_url,
- 'sec': vod['sec'],
- 'ts_num' : ts_num,
- 'vod_id': vod['id']
- }),
- return response.json(0, vod_play_list)
- def do_store_playlist(self, request_dict, response):
- uidToken = request_dict.get('uidToken', None)
- storeTime = request_dict.get('time', None)
- sec = request_dict.get('sec', None)
- fg = request_dict.get('fg', 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(0)
- pass
- UID = utko.UID
- channel = utko.channel
- print('UID:')
- print(UID)
- print('channel:')
- print(channel)
- now_time = int(time.time())
- ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, endTime__gte=now_time). \
- values("bucket__mold", "bucket__bucket", "bucket__endpoint",
- "bucket__region", "status", "bucket__storeDay", "bucket__id").order_by('addTime')[:1]
- if ubqs.exists():
- ub_qs_data = ubqs[0]
- store_day = ub_qs_data['bucket__storeDay']
- bucket_id = ub_qs_data['bucket__id']
- end_time = int(storeTime) + store_day * 86400
- if ub_qs_data['status'] == 1:
- if ub_qs_data["bucket__mold"] == 0:
- oss_crd_qs = OssCrdModel.objects.filter(uid=UID, channel=channel)
- if oss_crd_qs.exists():
- VodHlsModel.objects.create(
- uid=UID,
- channel=channel,
- time=storeTime,
- endTime=end_time,
- bucket_id=bucket_id,
- sec=sec,
- )
- res = {'code': 0, 'msg': '存储成功'}
- return HttpResponse(json.dumps(res, ensure_ascii=False),
- content_type="application/json,charset=utf-8")
- else:
- res = {'code': 404, 'msg': '设备未购买'}
- return HttpResponse(json.dumps(res, ensure_ascii=False),
- content_type="application/json,charset=utf-8")
- elif ub_qs_data['bucket__mold'] == 1:
- sts_qs = StsCrdModel.objects.filter(uid=UID, channel=channel, type=1). \
- values("addTime", "data")
- if sts_qs.exists():
- VodHlsModel.objects.create(
- uid=UID,
- channel=channel,
- time=storeTime,
- endTime=end_time,
- bucket_id=bucket_id,
- fg=fg,
- sec=sec,
- )
- res = {'code': 0, 'msg': '存储成功'}
- return HttpResponse(json.dumps(res, ensure_ascii=False),
- content_type="application/json,charset=utf-8")
- else:
- res = {'code': 404, 'msg': '设备未购买'}
- return HttpResponse(json.dumps(res, ensure_ascii=False),
- content_type="application/json,charset=utf-8")
- else:
- res = {'code': 404, 'msg': '设备未开启'}
- return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
- else:
- res = {'code': 404, 'msg': '设备未购买'}
- return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
- # def do_change_vod_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 all([uid, status, channel]):
- # dv_qs = Device_Info.objects.filter(UID=uid, userID_id=userID, isShare=False, isExist=1)
- # if dv_qs.exists():
- # now_time = int(time.time())
- # ub_qs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time)
- # if ub_qs.exists():
- # ub_qs.status = status
- # ub_qs.save()
- # if status == 0:
- # return response.json(0)
- # else:
- # utko = UidTokenObject()
- # utko.generate(data={'uid': uid, 'channel': channel})
- # uidTK = utko.token
- # uidTkUrl = "{SERVER_DOMAIN}cloudstorage/getsignsts?uidToken={uidToken}". \
- # format(uidToken=uidTK, SERVER_DOMAIN=SERVER_DOMAIN)
- # storeHlsUrl = "{SERVER_DOMAIN}cloudstorage/storeplaylist?uidToken={uidToken}". \
- # format(uidToken=uidTK, SERVER_DOMAIN=SERVER_DOMAIN)
- # return response.json(0, {'uidTkUrl': uidTkUrl, 'storeHlsUrl': storeHlsUrl})
- # else:
- # return response.json(10, '未购买')
- # else:
- # return response.json(12)
- # else:
- # return response.json(444, 'uid,status,channel')
- def do_change_vod_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).order_by('addTime')
- if not ubqs.exists():
- return response.json(10030)
- now_time = int(time.time())
- if now_time > ubqs[0].endTime:
- return response.json(10031)
- ubqs.update(status=status)
- if status == 0:
- return response.json(0)
- utko = UidTokenObject()
- utko.generate(data={'uid': uid, 'channel': channel})
- uidTkUrl = "{SERVER_DOMAIN}cloudstorage/getsignsts?uidToken={uidToken}". \
- format(uidToken=utko.token, SERVER_DOMAIN=SERVER_DOMAIN)
- storeHlsUrl = "{SERVER_DOMAIN}cloudstorage/storeplaylist?uidToken={uidToken}". \
- format(uidToken=utko.token, SERVER_DOMAIN=SERVER_DOMAIN)
- return response.json(0, {'uidTkUrl': uidTkUrl, 'storeHlsUrl': storeHlsUrl})
- 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.location.href="https://www.baidu.com?page=closePage";
- }
- </script>
- </body>
- </html>
- '''
- return response
- def do_pay_ok(self,request_dict):
- response = HttpResponse()
- paytype = request_dict.get('paytype', None)
- showtitle = "支付成功"
- if paytype == "10":
- showtitle = "成功体验云存"
- if paytype == "11":
- showtitle = "兑换成功"
- response.content = '''
- <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>'''+showtitle+'''</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: 15px;
- color:#0000008A;
-
- }
- .content_img{
- margin-bottom:15px;
- width: 60px;
- height: 60px;
- }
- .bottom{
- margin-bottom: 10px;
- margin-top: 250px;
- color : white;
- }
- .bottom_div{
- border: 1px solid #68c9c5;
- line-height: 38px;
- text-align: center;
- width: 100px;
- height: 38px;
- border-radius: 30px;
- background-color:#68c9c5;
- }
-
- .bottom_div:hover{
- background-color: #dde4e2;
- }
- </style>
- </head>
- <body style="" rlt="1" inmaintabuse="true">
-
- <div class="content">
- <p>
- <img src="https://test.dvema.com/web/images/success.png" class="content_img">
- <br>
- '''+showtitle+'''
- </p>
- </div>
- <center class="bottom">
- <div class="bottom_div" onclick="payOKButton()">
- 完成
- </div>
- </center>
- <script src="//hm.baidu.com/hm.js?eaa57ca47dacb4ad4f5a257001a3457c"></script><script> // 点击付款成功按钮
- function payOKButton() {
- // 复杂数据
- console.log('success')
- window.location.href="https://www.baidu.com?page=closePage"
- }
- </script>
-
- <div id="qds" style="display:none;"></div></body></html>
- '''
- return response
- def do_pay_by_ali_callback(self, request):
- print("进来了,阿里支付成功回调")
- response = ResponseObject()
- data = request.POST.dict()
- asy = threading.Thread(target=ModelService.add_log,
- args=(CommonService.get_ip_address(request), data['out_trade_no'], '进来了,阿里支付成功回调'))
- asy.start()
- 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")
- order_qs = Order_Model.objects.filter(orderID=orderID)
- nowTime = int(time.time())
- order_list = order_qs.values("UID", "channel", "commodity_code", "rank", "isSelectDiscounts", "userID__userID", "userID__username")
- userid = order_list[0]['userID__userID']
- username = order_list[0]['userID__username']
- UID = order_list[0]['UID']
- channel = order_list[0]['channel']
- rank = order_list[0]['rank']
- smqs = Store_Meal.objects.filter(id=rank). \
- values("day", "bucket_id", "bucket__storeDay", "expire")
- bucketId = smqs[0]['bucket_id']
- if not smqs.exists():
- return response.json(173)
- ubqs = UID_Bucket.objects.filter(bucket__id=bucketId, uid=UID, channel=channel, endTime__gte=nowTime). \
- values("id", "bucket__storeDay", "bucket__region", "endTime").order_by('addTime')[:1]
- nowTime = int(time.time())
- expire = smqs[0]['expire']
- if order_list[0]['isSelectDiscounts'] == 1:
- expire = smqs[0]['expire'] * 2
- if ubqs.exists():
- ubq = ubqs[0]
- endTime = CommonService.calcMonthLater(expire, ubq['endTime'])
- ub_cqs = UID_Bucket.objects.filter(id=ubq['id']).update \
- (uid=UID, channel=channel, bucket_id=bucketId,
- endTime=endTime,updateTime=nowTime)
- uid_bucket_id = ubq['id']
- else:
- endTime = CommonService.calcMonthLater(expire)
- ub_cqs = UID_Bucket.objects.create \
- (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime, updateTime=nowTime)
- uid_bucket_id = ub_cqs.id
- dvq = Device_Info.objects.filter(UID=UID, primaryUserID='', primaryMaster='')
- if dvq.exists():
- dvq_set_update_dict = {
- 'primaryUserID': userid,
- 'primaryMaster': username
- }
- dvq.update(**dvq_set_update_dict)
- order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
- red_url = "{SERVER_DOMAIN}cloudstorage/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}cloudstorage/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}cloudstorage/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_list = order_qs.values("UID", "channel", "commodity_code", "rank", "isSelectDiscounts", "userID__userID",
- "userID__username")
- userid = order_list[0]['userID__userID']
- username = order_list[0]['userID__username']
- UID = order_list[0]['UID']
- channel = order_list[0]['channel']
- rank = order_list[0]['rank']
- smqs = Store_Meal.objects.filter(id=rank). \
- values("day", "bucket_id", "bucket__storeDay", "expire")
- bucketId = smqs[0]['bucket_id']
- if not smqs.exists():
- return response.json(173)
- # ##
- ubqs = UID_Bucket.objects.filter(bucket__id=bucketId, uid=UID, channel=channel, endTime__gte=nowTime). \
- values("id", "bucket__storeDay", "bucket__region", "endTime").order_by('addTime')[:1]
- expire = smqs[0]['expire']
- if order_list[0]['isSelectDiscounts'] == 1:
- expire = smqs[0]['expire'] * 2
- if ubqs.exists():
- ubq = ubqs[0]
- endTime = CommonService.calcMonthLater(expire,ubq['endTime'])
- ub_cqs = UID_Bucket.objects.filter(id=ubq['id']).update \
- (uid=UID, channel=channel, bucket_id=bucketId,
- endTime=endTime,updateTime=nowTime)
- uid_bucket_id = ubq['id']
- else:
- endTime = CommonService.calcMonthLater(expire)
- ub_cqs = UID_Bucket.objects.create \
- (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime, updateTime=nowTime)
- uid_bucket_id = ub_cqs.id
- dvq = Device_Info.objects.filter(UID=UID, primaryUserID='', primaryMaster='')
- if dvq.exists():
- dvq_set_update_dict = {
- 'primaryUserID': userid,
- 'primaryMaster': username
- }
- dvq.update(**dvq_set_update_dict)
- order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
- # return response.json(0)
- red_url = "{SERVER_DOMAIN}cloudstorage/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
- return HttpResponseRedirect(red_url)
- def do_pay_by_wechat_callback(self, request_dict, response):
- result_code = request_dict.get('result_code', None)
- if result_code == 'SUCCESS':
- response = HttpResponse()
- check_sign = WechatPayObject.get_notifypay(request_dict)
- if not check_sign:
- return HttpResponse(WechatPayObject.xml_to_dict({'return_code':'FAIL', 'return_msg':'签名失败'}))
- orderID = request_dict.get('out_trade_no',None)
- order_qs = Order_Model.objects.filter(orderID=orderID)
- nowTime = int(time.time())
- order_list = order_qs.values("UID", "channel", "commodity_code", "rank", "isSelectDiscounts",
- "userID__userID", "userID__username")
- userid = order_list[0]['userID__userID']
- username = order_list[0]['userID__username']
- UID = order_list[0]['UID']
- channel = order_list[0]['channel']
- rank = order_list[0]['rank']
- smqs = Store_Meal.objects.filter(id=rank). \
- values("day", "bucket_id", "bucket__storeDay", "expire")
- bucketId = smqs[0]['bucket_id']
- if not smqs.exists():
- return HttpResponse(WechatPayObject.xml_to_dict({'return_code':'FAIL', 'return_msg':'套餐不存在'}))
- # ##
- ubqs = UID_Bucket.objects.filter(bucket__id=bucketId, uid=UID, channel=channel, endTime__gte=nowTime). \
- values("id", "bucket__storeDay", "bucket__region", "endTime").order_by('addTime')[:1]
- expire = smqs[0]['expire']
- if order_list[0]['isSelectDiscounts'] == 1:
- expire = smqs[0]['expire'] * 2
- if ubqs.exists():
- ubq = ubqs[0]
- endTime = CommonService.calcMonthLater(expire,ubq['endTime'])
- ub_cqs = UID_Bucket.objects.filter(id=ubq['id']).update \
- (uid=UID, channel=channel, bucket_id=bucketId,
- endTime=endTime, updateTime=nowTime)
- uid_bucket_id = ubq['id']
- else:
- endTime = CommonService.calcMonthLater(expire)
- ub_cqs = UID_Bucket.objects.create \
- (uid=UID, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime, updateTime=nowTime)
- uid_bucket_id = ub_cqs.id
- dvq = Device_Info.objects.filter(UID=UID, primaryUserID='', primaryMaster='')
- if dvq.exists():
- dvq_set_update_dict = {
- 'primaryUserID': userid,
- 'primaryMaster': username
- }
- dvq.update(**dvq_set_update_dict)
- order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
- return HttpResponse(WechatPayObject.xml_to_dict({'return_code':'SUCCESS', 'return_msg':'OK'}))
- return HttpResponse(WechatPayObject.xml_to_dict({'return_code':'FAIL', 'return_msg':'参数格式校验错误'}))
- def do_create_pay_order(self, request_dict, userID, ip, response):
- 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)
- is_select_discount = request_dict.get('is_select_discount', 0)
- if not uid or not channel or not pay_type or not rank:
- return response.json(444)
- dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1).values('primaryUserID',
- 'primaryMaster')
- if not dv_qs.exists():
- return response.json(12)
- if dv_qs[0]['primaryUserID'] != '' and dv_qs[0]['primaryUserID'] != userID:
- return response.json(13, '非设备主用户无法购买')
- smqs = Store_Meal.objects.filter(id=rank, pay_type=pay_type). \
- values('currency', 'price', 'content', 'day',
- 'commodity_type', 'title', 'content',
- 'expire', 'commodity_code', 'discount_price')
- if not smqs.exists():
- return response.json(173)
- currency = smqs[0]['currency']
- price = smqs[0]['price']
- if is_select_discount == '1':
- price = float(smqs[0]['price']) + float(smqs[0]['discount_price'])
- content = smqs[0]['content']
- day = smqs[0]['day']
- commodity_code = smqs[0]['commodity_code']
- 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 == 1:
- call_sub_url = "{SERVER_DOMAIN}cloudstorage/dopaypalcallback?orderID={orderID}". \
- format(SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
- # call_sub_url = "http://192.168.136.40:8077/cloudstorage/payExecute?orderID={orderID}".format(
- # SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
- call_clc_url = "{SERVER_DOMAIN}cloudstorage/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, payType=pay_type, payTime=nowTime,
- price=price, currency=currency, addTime=nowTime, updTime=nowTime,
- pay_url=approval_url, isSelectDiscounts=is_select_discount,
- commodity_code=commodity_code, commodity_type=commodity_type,rank_id=rank)
- return response.json(0, {"redirectUrl": approval_url, "orderID": orderID})
- return response.json(10, 'generate_order_false')
- elif pay_type == 2:
- 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}cloudstorage/payOK".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL),
- notify_url="{SERVER_DOMAIN_SSL}cloudstorage/doalicallback".format(
- SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
- # return_url="http://192.168.136.40/cloudstorage/payOK",
- # notify_url="http://192.168.136.40/cloudstorage/aliPayCallback"
- )
- except Exception as e:
- print(repr(e))
- return response.json(10, repr(e))
- else:
- if order_string:
- redirectUrl = aliPayObj.alipay_prefix + order_string
- print('---------tttt')
- print(redirectUrl)
- Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
- desc=content, payType=pay_type, payTime=nowTime,
- price=price, currency=currency, addTime=nowTime, updTime=nowTime,
- pay_url=redirectUrl, isSelectDiscounts=is_select_discount,
- commodity_code=commodity_code, commodity_type=commodity_type,rank_id=rank)
- return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
- 'result': {"redirectUrl": redirectUrl, "orderID": orderID},
- 'error_code': 0})
- else:
- return response.json(10, '生成订单错误.')
- elif pay_type == 3:
- pay = WechatPayObject()
- notify_url="{SERVER_DOMAIN_SSL}cloudstorage/dowechatnotify".format(
- SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
- # 获取参数
- price = float(price)*100
- parameter_dict = pay.get_parameter(orderID, content, price, ip, notify_url)
- print('parameter_dict', parameter_dict)
- # parameter_dict 参数中获取MWEB_URL 调转页面在路径后面添加redirect_url
- # 统一调用接口
- response = pay.re_finall()
- if not response:
- return response.json(10, '生成订单错误.')
- # 回调函数
- Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
- desc=content, payType=pay_type, payTime=nowTime,
- price=price, currency=currency, addTime=nowTime, updTime=nowTime,
- pay_url=notify_url, isSelectDiscounts=is_select_discount,
- commodity_code=commodity_code, commodity_type=commodity_type,rank_id=rank)
- return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
- 'result': response,
- 'orderId': orderID,
- 'error_code': 0})
- # 调起支付接口
- # 生成体验订单
- def do_experience_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))
- rank = request_dict.get('rank', None)
- cdk = request_dict.get('cdk', None)
- if cdk != 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(10, '无效激活码')
- if cdk_qs[0]['is_activate'] == 1:
- return response.json(10, '激活码已被使用过')
- rank = cdk_qs[0]['rank__id']
- commodity_code = cdk_qs[0]['rank__commodity_code']
- if uid == None or channel == None or commodity_code == None or pay_type == None or rank == None:
- return response.json(13, '参数有误.')
- dvq = Device_Info.objects.filter(UID=uid)
- dvq=dvq.filter(~Q(primaryUserID='')).values('primaryUserID')
- if dvq.exists():
- if dvq[0]['primaryUserID']!=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())
- smqs = Store_Meal.objects.filter(id=rank). \
- values("day", "bucket_id", "bucket__storeDay", "expire")
- if not smqs.exists():
- return response.json(173)
- bucketId = smqs[0]['bucket_id']
- # ##
- ubqs = UID_Bucket.objects.filter(bucket__id=bucketId, uid=uid, channel=channel, endTime__gte=nowTime). \
- values("id", "bucket__storeDay", "bucket__region", "endTime").order_by('addTime')[:1]
- expire = smqs[0]['expire']
- if ubqs.exists():
- ubq = ubqs[0]
- endTime = CommonService.calcMonthLater(expire,ubq['endTime'])
- ub_cqs = UID_Bucket.objects.filter(id=ubq['id']).update \
- (uid=uid, channel=channel, bucket_id=bucketId,
- endTime=endTime,updateTime=nowTime)
- uid_bucket_id = ubq['id']
- else:
- endTime = CommonService.calcMonthLater(expire)
- ub_cqs = UID_Bucket.objects.create \
- (uid=uid, channel=channel, bucket_id=bucketId, endTime=endTime, addTime=nowTime, updateTime=nowTime)
- uid_bucket_id = ub_cqs.id
- Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
- desc=smqs[0]['content'], payType=pay_type, payTime=nowTime,
- price=smqs[0]['price'], currency=smqs[0]['currency'], addTime=nowTime, updTime=nowTime,
- pay_url="体验版",
- commodity_code=commodity_code, commodity_type=smqs[0]['commodity_type'],
- rank_id=rank,status=1, uid_bucket_id=uid_bucket_id)
- dvq = Device_Info.objects.filter(UID=UID, primaryUserID='', primaryMaster='')
- if dvq.exists():
- dvq_set_update_dict = {
- 'primaryUserID': userid,
- 'primaryMaster': username
- }
- dvq.update(**dvq_set_update_dict)
- order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
- # return response.json(0)
- returnurl = "{SERVER_DOMAIN}cloudstorage/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
- if pay_type == 10:
- ExperienceContextModel.objects.create(
- experience_type=0,
- uid=uid,
- do_time=nowTime
- )
- returnurl = "{SERVER_DOMAIN}cloudstorage/payOK?paytype=10".format(SERVER_DOMAIN=SERVER_DOMAIN)
- if pay_type== 11:
- update_dict = {}
- update_dict['is_activate'] = 1
- update_dict['order'] = orderID
- CDKcontextModel.objects.filter(cdk=cdk).update(**update_dict)
- returnurl = "{SERVER_DOMAIN}cloudstorage/payOK?paytype=11".format(SERVER_DOMAIN=SERVER_DOMAIN)
- result = returnurl
- return response.json(0, result)
- # red_url =
- # return JsonResponse(status=200, data={'red_url': red_url})
- # return HttpResponseRedirect(red_url)
- #重置设备云存体验
- def do_experience_reset(self, request_dict, userID, response):
- bid = request_dict.get("id",None)
- ubq = UID_Bucket.objects.filter(id=bid)
- if ubq:
- eq =ExperienceContextModel.objects.filter(uid = ubq[0].uid)
- if eq:
- eq.delete()
- Order_Model.objects.filter(uid_bucket_id = bid).delete()
- ubq.delete()
- else:
- return response.json(10007)
- else:
- return response.json(0, '重置云存体验失败')
- return response.json(0,'重置云存体验成功')
- def deleteVodList(self, request_dict, userID, response):
- uid = request_dict.get('uid',None)
- dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1) \
- .values('primaryUserID')
- if not dv_qs.exists() or dv_qs[0]['primaryUserID'] != userID:
- return response.json(12)
- vod_id_list = json.loads(request_dict.get('vod_id_list', None))
- is_del_all = request_dict.get('is_del_all',0)
- try:
- if is_del_all == 1:
- VodHlsModel.objects.filter(uid=uid).delete()
- else:
- if type(vod_id_list).__name__ != 'list':
- return response.json(444)
- VodHlsModel.objects.filter(id__in=vod_id_list).delete()
- except Exception as e:
- return response.json(424, repr(e))
- else:
- return response.json(0)
- #设备关联套餐列表
- def device_commodity(self, request_dict, userID, response):
- uid = request_dict.get('uid',None)
- dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1) \
- .values('primaryUserID')
- if not dv_qs.exists() or dv_qs[0]['primaryUserID'] != userID:
- return response.json(12)
- now_time = int(time.time())
- uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time).values("id", "uid", "endTime",
- "bucket__content").order_by('addTime')
- if not uid_bucket.exists():
- return response.json(10030)
- for index, value in enumerate(uid_bucket):
- value['is_use'] = 0
- if index == 0:
- value['is_use'] = 1
- return response.json(0,list(uid_bucket))
- #提前使用设备关联套餐
- def switch_device_commodity(self, request_dict, userID, response):
- uid = request_dict.get('uid',None)
- dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1) \
- .values('primaryUserID')
- if not dv_qs.exists() or dv_qs[0]['primaryUserID'] != userID:
- return response.json(12)
- switch_commodity_id = request_dict.get('switch_commodity_id',None)
- if switch_commodity_id:
- #切换设备套餐关联
- using_uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=int(time.time())).values("id", "uid",
- "endTime","bucket__content").order_by('addTime')
- if not using_uid_bucket.exists():
- return response.json(10030)
- if int(using_uid_bucket[0]['id']) == int(switch_commodity_id):
- return response.json(10032)
- # UID_Bucket.objects.filter(id=switch_commodity_id).update(is_use=1) #更新转移的云存套餐为使用中
- UID_Bucket.objects.filter(id=using_uid_bucket[0]['id']).delete() #删除原来使用中的云存套餐
- VodHlsModel.objects.filter(uid=uid).delete() #删除播放列表
- StsCrdModel.objects.filter(uid=uid).delete() #删除sts记录
- return response.json(0)
- return response.json(444)
- #删除过期云存播放列表
- def deleteVodHls(request):
- # UID = 'DSXG7481JVA2JM94111A'
- # channel = 1
- # 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
- # print(new_starTime)
- # exit()
- #
- # # ub_cqs = UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId,
- # # endTime=new_starTime + addTime)
- # # uid_bucket_id = ub_cqs.id
- # exit()
- response = ResponseObject()
- i = int(request.GET.get('i', 5))
- nowTime = int(time.time())
- for i in range(i):
- vh_qs = VodHlsModel.objects.filter(endTime__lte=str(nowTime))[0:10000]
- id_list = vh_qs.values_list("id", flat=True)
- print(id_list)
- VodHlsModel.objects.filter(id__in=list(id_list)).delete()
- return response.json(0)
- #删除过期云存关联套餐
- def deleteExpiredUidBucket(request):
- response = ResponseObject()
- now_time = int(time.time())
- expired_uid_bucket = UID_Bucket.objects.filter(endTime__lte=now_time)
- id_list = expired_uid_bucket.values_list("id", flat=True)
- UID_Bucket.objects.filter(id__in=list(id_list)).delete() #删除过期云存关联套餐, 后续是否考虑用软删除
- return response.json(0)
|