| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965 | #!/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 jsonimport timeimport urllibimport boto3import oss2import paypalrestsdkfrom aliyunsdkcore import clientfrom aliyunsdksts.request.v20150401 import AssumeRoleRequestfrom boto3.session import Sessionfrom django.http import JsonResponse, HttpResponseRedirect, HttpResponsefrom django.views.generic.base import Viewfrom Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \    SERVER_DOMAIN_SSLfrom Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModelfrom Object.AliPayObject import AliPayObjectfrom Object.ResponseObject import ResponseObjectfrom Object.TokenObject import TokenObjectfrom Object.UidTokenObject import UidTokenObjectfrom Service.CommonService import CommonServicefrom Object.m3u8generate import PlaylistGeneratorSERVER_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# commoditylisthttp://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 == '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()        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':                return self.do_create_pay_order(request_dict, userID, 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)            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)        qs = Store_Meal.objects        if mold:            qs = qs.filter(bucket__mold=mold)        else:            qs = qs.all()        qs = qs.values("id", "title", "content", "price",                       "day", "currency", "bucket__storeDay",                       "bucket__bucket", "bucket__area", "type",                       "commodity_code", "commodity_type")        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')):                res_c = {'area': area, 'items': list(items)}                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(11,'不存在')        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': 10,            })        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")        print('-------------bucket')        print(ubqs)        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 + '_' + 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")    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(UID=uid, userID_id=userID, isShare=False)        if not dv_qs.exists():            return response.json(12)        now_time = int(time.time())        vh_qs = VodHlsModel.objects.filter\            (uid=uid, channel=channel, time__range=(startTime, endTime), endTime__gte=now_time). \            values("time", "sec", "bucket__bucket", "bucket__endpoint", "bucket__region", "bucket__mold")        vod_play_list = []        print("-------------vh_qs")        print(vh_qs)        auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)        print('--------------bigin')        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:                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']})            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}/thumbs.jpg'. \                #     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                # m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \                #     format(uid=uid, channel=channel, time=vod['time'])                vod_url = 'http://test.dvema.com/cloudstorage/signplaym3u8?' \                          'uid={uid}&channel={channel}&time={time}&sign=tktktktk'. \                    format(uid=uid, channel=channel, time=vod['time'])                vod_play_list.append({                    'name': vod['time'],                    'sign_url': vod_url,                    # 'thumb': thumb_url,                    'sec': vod['sec']})        print('--------------end')        print(int(time.time()))        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")        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)        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}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):        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.location.href="https://www.baidu.com?page=closePage"      }	</script></body> </html>        '''        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                ub_cqs = UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId,                                                   endTime=new_starTime + addTime)                uid_bucket_id = ub_cqs.id            else:                ub_cqs = UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId,                                                   endTime=nowTime + addTime)                uid_bucket_id = ub_cqs.id            order_qs.update \                (payTime=nowTime, 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")        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()            print(ubqs_count)            ubq = ubqs[ubqs_count - 1]            print(ubq)            new_starTime = ubq['endTime'] + 1            ub_cqs = UID_Bucket.objects.create \                (uid=UID, channel=channel, bucket_id=bucketId,                 endTime=new_starTime + addTime)            uid_bucket_id = ub_cqs.id        else:            ub_cqs = UID_Bucket.objects.create \                (uid=UID, channel=channel, bucket_id=bucketId, endTime=nowTime + addTime)            uid_bucket_id = ub_cqs.id        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_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))        rank = request_dict.get('rank', None)        if uid == None or channel == None or commodity_code == None or pay_type == None or rank == None:            return response.json(13, '参数有误.')        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}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,                                               endTime=(nowTime + int(day) * 3600 * 24), pay_url=approval_url,                                               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')        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}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,                                               endTime=(nowTime + int(day) * 3600 * 24), pay_url=redirectUrl,                                               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, '生成订单错误.')
 |