Пример #1
0
def view_file(req):
    if not 'uploaded_file' in req.files:
        return BaseResponse('no file uploaded')
    f = req.files['uploaded_file']
    return BaseResponse(wrap_file(req.environ, f),
                        mimetype=f.content_type,
                        direct_passthrough=True)
Пример #2
0
 def put(self):
     try:
         self.car_pooling_service.clean_data()
         self.car_pooling_service.register_cars(request.get_json())
         return BaseResponse('', 200)
     except Exception as e:
         return BaseResponse('', 400)
Пример #3
0
def view_file(req):
    if "uploaded_file" not in req.files:
        return BaseResponse("no file uploaded")
    f = req.files["uploaded_file"]
    return BaseResponse(wrap_file(req.environ, f),
                        mimetype=f.content_type,
                        direct_passthrough=True)
Пример #4
0
    def __call__(self, environ, start_response):
        req = BaseRequest(environ)
        url = req.path
        method = req.method.lower()
        url_dict = self.URL_MAP.get(url)

        if url_dict:
            allowed_methods = [
                m for m in self.URL_MAP.get(url, {}).get("methods", {})
            ]
            if method not in allowed_methods:
                response = BaseResponse(
                    '<h1>405 Method Not Allowed<h1>',
                    content_type='text/html; charset=UTF-8',
                    status=405)
            else:
                args = req.args.to_dict()
                view = url_dict.get("methods", {}).get(method,
                                                       {}).get("function")
                response = view(**args)
                response = BaseResponse(response)
        else:
            response = BaseResponse('<h1>404 Source Not Found<h1>',
                                    content_type='text/html; charset=UTF-8',
                                    status=404)
        return response(environ, start_response)
Пример #5
0
 def post(self):
     try:
         group_id = request.form['ID']
         group = self.car_pooling_service.locate_car_by_group_id(group_id)
         return group.cars.to_dict(), 200
     except (GroupDoNotHaveCarException, GroupNotFoundException) as e:
         return BaseResponse('', e.error_code)
     except Exception as e:
         return BaseResponse('', 400)
Пример #6
0
    def application(self, request):

        # if there are headers into headers is because it is a hidden request
        cipher_output = False
        if "Headers" in request.headers:
            cipher_output = True
            # Hidden request
            hidden_headers = json.loads(
                self.cipher.decrypt(request.headers["Headers"]))
            # _c is creation date
            request_age = datetime.datetime.now() - datetime.datetime.strptime(
                hidden_headers["_c"], "%Y-%m-%dT%H:%M:%S")
            # _d is duration while the request is valid
            d = timedelta(seconds=hidden_headers["_d"])

            # _m is the method type
            if "_m" in hidden_headers:
                request.method = hidden_headers["_m"]

            if request_age <= d:
                request.path = self.cipher.decrypt(request.path[1:])
                request.headers = hidden_headers
                if len(request.data) > 0:
                    request.data = self.cipher.decrypt(request.data)
            else:
                return BaseResponse(self.cipher.encrypt("400Request expired"))

        method_data = self.parser.match(request.path)

        if method_data is not None:
            # Dynamically load the method by name
            o = self.services[method_data["url"]]
            namespace = o.__qualname__.replace("." + o.__name__, "")
            m = importlib.import_module(o.__module__)

            #TODO storage instances in a cache
            controller = getattr(m, namespace)()
            method = getattr(controller, o.__name__)

            try:
                data_res = method(request=request, **method_data["params"])

                if cipher_output:
                    data_res = self.cipher.encrypt("200" + str(data_res))
                return BaseResponse(data_res)
            except Exception as e:
                #raise e
                if cipher_output:
                    data_res = self.cipher.encrypt("400" + str(e))
                else:
                    data_res = str(e)
                return BaseResponse(data_res, status=400)
        else:
            if cipher_output:
                return BaseResponse(self.cipher.encrypt("404Not found"))
            else:
                return BaseResponse("Not found", status=404)
Пример #7
0
 def post(self):
     try:
         group_id = request.form['ID']
         self.car_pooling_service.dropoff_group_and_get_new_journey(
             group_id)
         return BaseResponse('', 204)
     except (GroupDoNotHaveCarException, GroupNotFoundException):
         return BaseResponse('', 404)
     except Exception as e:
         return BaseResponse('', 400)
Пример #8
0
    def post(self):
        client_ip = IpKit.get_remote_ip()
        third_config = ThirdPayConfig.EpayTong_PAY_DEPOSIT.value

        if not EnvironEnum.is_local_evn(current_app.config['FLASK_ENV']):
            # 无论如何都记录一条log
            current_app.logger.info(
                'epaytong deposit callback, ip: %s, data: %s',
                IpKit.get_remote_ip(), request.form)

        if not CallbackEpayTong.check_ip(client_ip):
            current_app.logger.fatal(
                'ip not allow, client_ip: %s, data: %s, body: %s', client_ip,
                request.args, request.form)
            return BaseResponse('FAIlURE')

        sys_tx_id = request.form['order_no']
        order = DepositTransactionCtl.get_order(sys_tx_id)
        if not order:
            current_app.logger.error('epaytong: no found order, order id: %s' %
                                     (sys_tx_id))
            return BaseResponse('FAILURE')

        no_need_field = ['signType', 'sign']
        sorted_fields = sorted([k for k in request.form.keys()])
        request_str = "&".join([
            "{}={}".format(k, request.form[k]) for k in sorted_fields
            if (request.form[k] == 0 or request.form[k] == "0"
                or request.form[k]) and k not in no_need_field
        ])
        sign = request.form['sign']
        sign_str = request_str + third_config['secret_key']
        flag = CallbackEpayTong.check_sign(sign, sign_str)

        if not flag:
            current_app.logger.fatal(
                'invalid sign, client_ip: %s, data: %s, body: %s', client_ip,
                request.args, request_str)
            return ResponseSuccess(code=500, message='签名错误').as_response()

        tx_amount = request.form['price']
        pwTradeId = request.form['notify_id']

        status = request.form['is_success']
        trade = request.form['trade_status']
        if status == 'T' and trade == "TRADE_FINISHED":
            if not DepositTransactionCtl.success_order_process(
                    order, decimal.Decimal(tx_amount), pwTradeId):
                return BaseResponse('FAIlURE')
        else:
            if not DepositTransactionCtl.failed_order_process(
                    order, decimal.Decimal(tx_amount), pwTradeId):
                return BaseResponse('FAIlURE')

        return BaseResponse('success')
Пример #9
0
    def post(self):
        if not EnvironEnum.is_local_evn(current_app.config['FLASK_ENV']):
            # 无论如何都记录一条log
            current_app.logger.info(
                'one pay deposit callback, ip: %s, data: %s, headers: %s, json data:%s',
                IpKit.get_remote_ip(), request.form, request.headers,
                request.json)

        client_ip = IpKit.get_remote_ip()

        if not CallbackOnePay.check_ip(client_ip):
            current_app.logger.fatal('ip not allow, client_ip: %s, data: %s',
                                     client_ip, request.args)
            return BaseResponse('FAIlURE')

        sys_tx_id = request.form['merchantTradeId']
        order = DepositTransactionCtl.get_order(sys_tx_id)
        if not order:
            current_app.logger.error('OnePay: no found order, order id: %s' %
                                     (sys_tx_id))
            return BaseResponse('FAILURE')

        no_need_field = ['signType', 'sign']
        sorted_fields = sorted([k for k in request.form.keys()])
        request_str = "&".join([
            "{}={}".format(k, request.form[k]) for k in sorted_fields
            if k not in no_need_field and request.form[k]
        ])
        sign = request.form['sign']

        flag = CallbackOnePay.check_sign(sign, request_str)

        if not flag:
            current_app.logger.fatal(
                'invalid sign, client_ip: %s, data: %s, body: %s', client_ip,
                request.args, request_str)
            return ResponseSuccess(code=500, message='签名错误').as_response()

        tx_amount = request.form['amountFee']
        pwTradeId = request.form['pwTradeId']

        status = request.form['tradeStatus']
        if status == 'PS_PAYMENT_FAIL':
            if not DepositTransactionCtl.failed_order_process(
                    order, decimal.Decimal(tx_amount), pwTradeId):
                return BaseResponse('FAIlURE')
        elif status == 'PS_PAYMENT_SUCCESS':
            if not DepositTransactionCtl.success_order_process(
                    order, decimal.Decimal(tx_amount), pwTradeId):
                return BaseResponse('FAIlURE')

        return BaseResponse('SUCCESS')
Пример #10
0
def redirect(location, code=302):
    """Return a response object (a WSGI application) that, if called,
    redirects the client to the target location.  Supported codes are 301,
    302, 303, 305, and 307.  300 is not supported because it's not a real
    redirect and 304 because it's the answer for a request with a request
    with defined If-Modified-Since headers.
    
    .. versionadded:: 0.6
       The location can now be a unicode string that is encoded using
       the :func:`iri_to_uri` function.
    
    :param location: the location the response should redirect to.
    :param code: the redirect status code.
    """
    from werkzeug.wrappers import BaseResponse
    display_location = location
    if isinstance(location, unicode):
        from werkzeug.urls import iri_to_uri
        location = iri_to_uri(location)
    response = BaseResponse(
        '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>Redirecting...</title>\n<h1>Redirecting...</h1>\n<p>You should be redirected automatically to target URL: <a href="%s">%s</a>.  If not click the link.'
        % (location, display_location),
        code,
        mimetype='text/html')
    response.headers['Location'] = location
    return response
Пример #11
0
 def logo_login(self, **post):
     p = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
     number_rnd = random.randint(1, 15)
     p = os.path.join(p, 'static/src/img/fundo_{0}.jpg'.format(number_rnd))
     image = open(p, 'rb')
     return BaseResponse(wrap_file(request.httprequest.environ, image),
                         mimetype='image/png')
Пример #12
0
def test_response():
    # unicode
    response = BaseResponse(u'öäü')
    assert response.response_body == 'öäü'

    # writing
    response = BaseResponse('foo')
    response.write('bar')
    assert response.response_body == 'foobar'

    # set cookie
    response = BaseResponse()
    response.set_cookie('foo', 'bar', 60, 0, '/blub', 'example.org', False)
    assert response.header_list == [
        ('Content-Type', 'text/plain; charset=utf-8'),
        ('Set-Cookie', 'foo=bar; Domain=example.org; expires=Thu, '
         '01-Jan-1970 00:00:00 GMT; Max-Age=60; Path=/blub')
    ]
Пример #13
0
def upload_file(req):
    return BaseResponse('''
    <h1>Upload File</h1>
    <form action="" method="post" enctype="multipart/form-data">
        <input type="file" name="uploaded_file">
        <input type="submit" value="Upload">
    </form>
    ''',
                        mimetype='text/html')
Пример #14
0
def application(environ, start_response):
    request = Request(environ)
    response = BaseResponse({
        'get': get_time,
        'set': set_time
    }.get(request.path.strip('/'), index)(request),
                            mimetype='text/html')
    request.session.save_cookie(response)
    return response(environ, start_response)
Пример #15
0
    def _auth_spnego(self, request):
        """Perform SPNEGO authentication.
        """
        if 'Authorization' not in request.headers:
            # Send the SPNEGO Negociate challenge
            _LOGGER.debug("Sending SPNEGO Negotiate request")
            resp = BaseResponse(status=401)
            resp.headers['WWW-Authenticate'] = 'Negotiate'
            return resp

        # We have authorization headers
        auth_type, auth_chal = request.headers['Authorization'].split(' ', 3)
        if auth_type != 'Negotiate':
            return _UNAUTHORIZED('Invalid authorization header.')

        _LOGGER.debug("Received SPNEGO Negociate token: %r", auth_chal)
        try:
            if not hasattr(self.LOCALS, 'ctx'):
                # pylint: disable=assigning-non-slot
                self.LOCALS.ctx = gssapi.SecurityContext(
                    creds=None, usage='accept'
                )
                _LOGGER.debug('Init security context.')

            in_token = base64.standard_b64decode(auth_chal)
            out_token = self.LOCALS.ctx.step(in_token)
            auth_token = base64.b64encode(out_token)

            if not self.LOCALS.ctx.complete:
                _LOGGER.debug("Sending SPNEGO Negotiate (continue).")
                resp = BaseResponse(status=401)
                resp.headers['WWW-Authenticate'] = 'Negotiate %s' % auth_token
                return resp

            # GSSAPI negotiation completed.
            auth_user = str(self.LOCALS.ctx.initiator_name)
            _LOGGER.info('Authenticated user: %s', auth_user)

            return self._wrapped_authenticated(auth_user, auth_token)

        # pylint: disable=c-extension-no-member
        except gssapi.raw.misc.GSSError as err:
            _LOGGER.warning('Unhandled exception: %s', str(err))
            return _UNAUTHORIZED(str(err))
Пример #16
0
 def application(self, environ, start_response):
     req = BaseRequest(environ)
     if req.method == 'POST':
         resp = self.post_handler(req)
     elif req.method == 'GET':
         resp = self.get_handler(req)
     else:
         return BaseResponse('HTTP method not supported',
                             mimetype='text/plain')
     return resp(environ, start_response)
Пример #17
0
 def get_response(self, environ):
     """Get a response object.
     
     :param environ: the environ for the request.
     :return: a :class:`BaseResponse` object or a subclass thereof.
     """
     environ = _get_environ(environ)
     from werkzeug.wrappers import BaseResponse
     headers = self.get_headers(environ)
     return BaseResponse(self.get_body(environ), self.code, headers)
Пример #18
0
    def get(self):
        """
        Tong yi Pay,充值回调
        :return:
        """
        if not EnvironEnum.is_local_evn(current_app.config['FLASK_ENV']):
            # 无论如何都记录一条log
            current_app.logger.info('tong yi deposit callback, ip: %s, data: %s', IpKit.get_remote_ip(), request.args)

        client_ip = IpKit.get_remote_ip()
        if not CallbackTongYiPay.check_ip(client_ip):
            current_app.logger.error('ip not allow, client_ip: %s, data: %s, body: %s', client_ip, request.args,
                                    request.json)

        sign = request.args.get("sign")
        keys = sorted(list(request.args.keys()))
        sign_str = "&".join(["{}={}".format(k, request.args.get(k)) for k in keys if k not in ['sign'] and request.args.get(k, False)])
        flag = CallbackTongYiPay.check_sign(sign, sign_str)
        if not flag:
            current_app.logger.error('invalid sign, client_ip: %s, data: %s, body: %s', client_ip, request.args,
                                     sign_str)
            return BaseResponse('error')

        order_id = request.args.get('order')

        order = DepositTransactionCtl.get_order(order_id)
        if not order:
            current_app.logger.error('invalid order: order_id: %s', order_id)
            return BaseResponse('FAIlURE')

        if order.state.name == OrderStateEnum.SUCCESS.name:
            return BaseResponse('SUCCESS')

        channel_tx_id = request.args.get('orderId', False)

        state = request.args.get('status', 0)
        tx_amount = request.args.get('money', 0)

        if str(state) == "2" or str(state) == "3":
            if not DepositTransactionCtl.success_order_process(order, Decimal(tx_amount), channel_tx_id):
                return BaseResponse('FAIlURE')

        return BaseResponse('SUCCESS')
Пример #19
0
def test_http_proxy(dev_server):
    server = dev_server(r"""
        from werkzeug.wrappers import Request, Response

        @Request.application
        def app(request):
            return Response(u'%s|%s|%s' % (
                request.headers.get('X-Special'),
                request.environ['HTTP_HOST'],
                request.full_path,
            ))
        """)

    app = ProxyMiddleware(
        BaseResponse("ROOT"),
        {
            "/foo": {
                "target": server.url,
                "host": "faked.invalid",
                "headers": {
                    "X-Special": "foo"
                },
            },
            "/bar": {
                "target": server.url,
                "host": None,
                "remove_prefix": True,
                "headers": {
                    "X-Special": "bar"
                },
            },
            "/autohost": {
                "target": server.url
            },
        },
    )

    client = Client(app, response_wrapper=BaseResponse)

    rv = client.get("/")
    assert rv.data == b"ROOT"

    rv = client.get("/foo/bar")
    assert rv.data.decode("ascii") == "foo|faked.invalid|/foo/bar?"

    rv = client.get("/bar/baz")
    assert rv.data.decode("ascii") == "bar|localhost|/baz?"

    rv = client.get("/autohost/aha")
    expected = "None|%s|/autohost/aha?" % url_parse(server.url).ascii_host
    assert rv.data.decode("ascii") == expected

    # test query string
    rv = client.get("/bar/baz?a=a&b=b")
    assert rv.data.decode("ascii") == "bar|localhost|/baz?a=a&b=b"
Пример #20
0
def test_http_proxy(dev_server):
    APP_TEMPLATE = r'''
    from werkzeug.wrappers import Request, Response

    @Request.application
    def app(request):
        return Response(u'%s|%s|%s' % (
            request.headers.get('X-Special'),
            request.environ['HTTP_HOST'],
            request.full_path,
        ))
    '''

    server = dev_server(APP_TEMPLATE)

    app = wsgi.ProxyMiddleware(
        BaseResponse('ROOT'), {
            '/foo': {
                'target': server.url,
                'host': 'faked.invalid',
                'headers': {
                    'X-Special': 'foo'
                },
            },
            '/bar': {
                'target': server.url,
                'host': None,
                'remove_prefix': True,
                'headers': {
                    'X-Special': 'bar'
                },
            },
            '/autohost': {
                'target': server.url,
            },
        })

    client = Client(app, response_wrapper=BaseResponse)

    rv = client.get('/')
    assert rv.data == b'ROOT'

    rv = client.get('/foo/bar')
    assert rv.data.decode('ascii') == 'foo|faked.invalid|/foo/bar?'

    rv = client.get('/bar/baz')
    assert rv.data.decode('ascii') == 'bar|localhost|/baz?'

    rv = client.get('/autohost/aha')
    assert rv.data.decode('ascii') == 'None|%s|/autohost/aha?' % url_parse(
        server.url).ascii_host

    # test query string
    rv = client.get('/bar/baz?a=a&b=b')
    assert rv.data.decode('ascii') == 'bar|localhost|/baz?a=a&b=b'
Пример #21
0
    def post(self):
        """
        极付,充值回调,极付的回调只会只订单成功后才通知,如果处理失败,通道侧会每隔十秒重新请求一次,共请求十次
        :return:
        """
        if not EnvironEnum.is_local_evn(current_app.config['FLASK_ENV']):
            # 无论如何都记录一条log
            current_app.logger.info('jifu deposit callback, ip: %s, data: %s',
                                    IpKit.get_remote_ip(), request.form)

        form, error = JifuCallbackForm().request_validate()
        if error:
            current_app.logger.fatal('msg: %s, data: %s', error.message,
                                     request.form)
            return BaseResponse(error.message)

        # 交易订单id
        sys_tx_id = form.remark.data
        # 通道订单id
        channel_tx_id = form.id.data
        # 实际支付金额
        tx_amount = Decimal(form.money.data)
        # 客户端IP
        client_ip = form.client_ip.data

        # IP白名单校验
        checker = DepositCallbackJifu(ChannelConfigEnum.CHANNEL_7001)
        if not checker.check_ip(client_ip):
            current_app.logger.fatal('ip not allow, client_ip: %s, data: %s',
                                     client_ip, form.form_data)
            return BaseResponse('ip not allow')

        # 签名验证
        if not checker.check_sign(form.get_sign_fields(), form.get_raw_sign()):
            current_app.logger.fatal('invalid sign, client_ip: %s, data: %s',
                                     client_ip, form.form_data)
            return BaseResponse('invalid sign')

        order = DepositTransactionCtl.get_order(sys_tx_id)
        if not order:
            return BaseResponse('no order found for sys_tx_id: %s', sys_tx_id)

        if order.channel_tx_id != channel_tx_id:
            # 根据API文档的建议,之前已经将code放入数据库的channel_tx_id中,等回调时拿来比对
            current_app.logger.fatal(
                'invalid channel_tx_id, client_ip: %s, channel_tx_id: %s, data: %s',
                client_ip, order.channel_tx_id, form.form_data)
            return BaseResponse('invalid channel_tx_id')

        # 支付成功
        if not DepositTransactionCtl.success_order_process(
                order, tx_amount, channel_tx_id):
            return BaseResponse('order process failed, sys_tx_id: %s',
                                sys_tx_id)

        # 成功返回小写字符串success
        return BaseResponse('success')
Пример #22
0
    def get(self):
        """
        立马付充值回调
        :return:
        """
        if not EnvironEnum.is_local_evn(current_app.config['FLASK_ENV']):
            # 无论如何都记录一条log
            current_app.logger.info(
                'ponypay withdraw callback, ip: %s, data: %s',
                IpKit.get_remote_ip(), request.args)

        form, error = PonyPayWithdrawForm().request_validate()
        if error:
            current_app.logger.fatal('msg: %s, data: %s', error.message,
                                     request.args)
            return BaseResponse('FAIlURE')

        # 交易订单id
        tx_id = form.corderid.data
        # 实际支付金额
        tx_amount = Decimal(form.money.data)
        # 订单状态: 成功/失败
        status = form.status.data
        # 签名
        sign = form.sign.data
        # 客户端IP
        client_ip = form.client_ip.data

        order = WithdrawTransactionCtl.get_order(tx_id)
        if not order:
            return BaseResponse('FAIlURE')

        channel_config = ChannelConfig.query_by_channel_id(order.channel_id)
        controller = WithdrawCallbackPonypay(channel_config.channel_enum)

        # IP白名单校验
        if not controller.check_ip(client_ip):
            current_app.logger.fatal('ip not allow, client_ip: %s, data: %s',
                                     client_ip, request.args)
            return BaseResponse('FAIlURE')

        # 签名验证
        if not controller.check_sign(tx_id, tx_amount, sign):
            current_app.logger.fatal('invalid sign, client_ip: %s, data: %s',
                                     client_ip, request.args)
            return BaseResponse('FAIlURE')

        if status == '1':
            # 支付成功
            if not WithdrawTransactionCtl.order_success(order, tx_amount):
                return BaseResponse('FAIlURE')
        else:
            # 支付失败
            if not WithdrawTransactionCtl.order_fail(order):
                return BaseResponse('FAIlURE')

        return BaseResponse('SUCCESS')
Пример #23
0
def application(environ, start_response):
    request = Request(environ)
    response = BaseResponse(
        {
            "get": get_time,
            "set": set_time
        }.get(request.path.strip("/"), index)(request),
        mimetype="text/html",
    )
    request.session.save_cookie(response)
    return response(environ, start_response)
Пример #24
0
def test_range_wrapper():
    response = BaseResponse(b"Hello World")
    range_wrapper = _RangeWrapper(response.response, 6, 4)
    assert next(range_wrapper) == b"Worl"

    response = BaseResponse(b"Hello World")
    range_wrapper = _RangeWrapper(response.response, 1, 0)
    with pytest.raises(StopIteration):
        next(range_wrapper)

    response = BaseResponse(b"Hello World")
    range_wrapper = _RangeWrapper(response.response, 6, 100)
    assert next(range_wrapper) == b"World"

    response = BaseResponse(x
                            for x in (b"He", b"ll", b"o ", b"Wo", b"rl", b"d"))
    range_wrapper = _RangeWrapper(response.response, 6, 4)
    assert not range_wrapper.seekable
    assert next(range_wrapper) == b"Wo"
    assert next(range_wrapper) == b"rl"

    response = BaseResponse(x for x in (b"He", b"ll", b"o W", b"o", b"rld"))
    range_wrapper = _RangeWrapper(response.response, 6, 4)
    assert next(range_wrapper) == b"W"
    assert next(range_wrapper) == b"o"
    assert next(range_wrapper) == b"rl"
    with pytest.raises(StopIteration):
        next(range_wrapper)

    response = BaseResponse(x for x in (b"Hello", b" World"))
    range_wrapper = _RangeWrapper(response.response, 1, 1)
    assert next(range_wrapper) == b"e"
    with pytest.raises(StopIteration):
        next(range_wrapper)

    resources = os.path.join(os.path.dirname(__file__), "res")
    env = create_environ()
    with open(os.path.join(resources, "test.txt"), "rb") as f:
        response = BaseResponse(wrap_file(env, f))
        range_wrapper = _RangeWrapper(response.response, 1, 2)
        assert range_wrapper.seekable
        assert next(range_wrapper) == b"OU"
        with pytest.raises(StopIteration):
            next(range_wrapper)

    with open(os.path.join(resources, "test.txt"), "rb") as f:
        response = BaseResponse(wrap_file(env, f))
        range_wrapper = _RangeWrapper(response.response, 2)
        assert next(range_wrapper) == b"UND\n"
        with pytest.raises(StopIteration):
            next(range_wrapper)
Пример #25
0
    def get(self):
        """
        立马付,充值回调
        :return:
        """
        if not EnvironEnum.is_local_evn(current_app.config['FLASK_ENV']):
            # 无论如何都记录一条log
            current_app.logger.info(
                'ponypay deposit callback, ip: %s, data: %s',
                IpKit.get_remote_ip(), request.args)

        form, error = PonyPayForm().request_validate()
        if error:
            current_app.logger.fatal('msg: %s, data: %s', error.message,
                                     request.args)
            return BaseResponse(error.message)

        # 交易订单id
        tx_id = form.orderid.data
        # 充值通道 订单id
        channel_tx_id = form.porder.data
        # 实际支付金额
        tx_amount = Decimal(form.money.data)
        # 订单状态: 成功/失败
        status = form.status.data
        # 客户端IP
        client_ip = form.client_ip.data

        # IP白名单校验
        if not CallbackPonypay.check_ip(client_ip):
            current_app.logger.fatal('ip not allow, client_ip: %s, data: %s',
                                     client_ip, request.args)
            return BaseResponse('FAIlURE')

        # 签名验证
        if not CallbackPonypay.check_sign(form):
            current_app.logger.fatal('invalid sign, client_ip: %s, data: %s',
                                     client_ip, request.args)
            return BaseResponse('FAIlURE')

        order = DepositTransactionCtl.get_order(tx_id)
        if not order:
            return BaseResponse('FAIlURE')

        if status == '1':
            # 支付成功
            if not DepositTransactionCtl.success_order_process(
                    order, tx_amount, channel_tx_id):
                return BaseResponse('FAIlURE')
        else:
            # 支付失败
            if not DepositTransactionCtl.failed_order_process(
                    order, tx_amount, channel_tx_id):
                return BaseResponse('FAIlURE')

        return BaseResponse('SUCCESS')
Пример #26
0
def test_range_wrapper():
    response = BaseResponse(b'Hello World')
    range_wrapper = _RangeWrapper(response.response, 6, 4)
    assert next(range_wrapper) == b'Worl'

    response = BaseResponse(b'Hello World')
    range_wrapper = _RangeWrapper(response.response, 1, 0)
    with pytest.raises(StopIteration):
        next(range_wrapper)

    response = BaseResponse(b'Hello World')
    range_wrapper = _RangeWrapper(response.response, 6, 100)
    assert next(range_wrapper) == b'World'

    response = BaseResponse(
        (x for x in (b'He', b'll', b'o ', b'Wo', b'rl', b'd')))
    range_wrapper = _RangeWrapper(response.response, 6, 4)
    assert not range_wrapper.seekable
    assert next(range_wrapper) == b'Wo'
    assert next(range_wrapper) == b'rl'

    response = BaseResponse((x for x in (b'He', b'll', b'o W', b'o', b'rld')))
    range_wrapper = _RangeWrapper(response.response, 6, 4)
    assert next(range_wrapper) == b'W'
    assert next(range_wrapper) == b'o'
    assert next(range_wrapper) == b'rl'
    with pytest.raises(StopIteration):
        next(range_wrapper)

    response = BaseResponse((x for x in (b'Hello', b' World')))
    range_wrapper = _RangeWrapper(response.response, 1, 1)
    assert next(range_wrapper) == b'e'
    with pytest.raises(StopIteration):
        next(range_wrapper)

    resources = os.path.join(os.path.dirname(__file__), 'res')
    env = create_environ()
    with open(os.path.join(resources, 'test.txt'), 'rb') as f:
        response = BaseResponse(wrap_file(env, f))
        range_wrapper = _RangeWrapper(response.response, 1, 2)
        assert range_wrapper.seekable
        assert next(range_wrapper) == b'OU'
        with pytest.raises(StopIteration):
            next(range_wrapper)

    with open(os.path.join(resources, 'test.txt'), 'rb') as f:
        response = BaseResponse(wrap_file(env, f))
        range_wrapper = _RangeWrapper(response.response, 2)
        assert next(range_wrapper) == b'UND\n'
        with pytest.raises(StopIteration):
            next(range_wrapper)
Пример #27
0
    def post(self):
        client_ip = IpKit.get_remote_ip()

        if not EnvironEnum.is_local_evn(current_app.config['FLASK_ENV']):
            # 无论如何都记录一条log
            current_app.logger.info('Gpay deposit callback, ip: %s, data: %s',
                                    IpKit.get_remote_ip(), request.form)

        sys_tx_id = request.form['company_order_num']
        tx_amount = request.form['amount']
        pw_trade_id = request.form['mownecum_order_num']

        if not CallbackGpay.check_ip(client_ip):
            current_app.logger.fatal(
                'ip not allow, client_ip: %s, data: %s, body: %s', client_ip,
                request.args, request.form)
            return BaseResponse(
                '{"company_order_num":"%s", "mownecum_order_num":"%s", "status":"1", "error_msg":"%s"}'
                % (sys_tx_id, pw_trade_id, "订单状态已更新"))

        order = DepositTransactionCtl.get_order(sys_tx_id)
        if not order:
            current_app.logger.error('gpay: no found order, order id: %s' %
                                     (sys_tx_id))
            return BaseResponse(
                '{"company_order_num":"%s", "mownecum_order_num":"%s", "status":"0", "error_msg":"%s"}'
                % (sys_tx_id, pw_trade_id, "查不到该订单"))

        if order.state.name != OrderStateEnum.INIT.name:
            return BaseResponse(
                '{"company_order_num":"%s", "mownecum_order_num":"%s", "status":"1", "error_msg":"%s"}'
                % (sys_tx_id, pw_trade_id, "订单状态已更新"))

        sorted_fields = [
            "pay_time", "bank_id", "amount", "company_order_num",
            "mownecum_order_num", "pay_card_num", "pay_card_name", "channel",
            "area", "fee", "transaction_charge", "deposit_mode"
        ]

        request_str = "".join([request.form.get(k, "") for k in sorted_fields])
        sign = request.form['key']
        flag = CallbackGpay.check_sign(sign, request_str)

        if not flag:
            current_app.logger.fatal(
                'invalid sign, client_ip: %s, data: %s, body: %s', client_ip,
                request.args, request_str)
            return BaseResponse(
                '{"company_order_num":"%s", "mownecum_order_num":"%s", "status":"0", "error_msg":"%s"}'
                % (sys_tx_id, pw_trade_id, "更新订单状态失败"))

        if not DepositTransactionCtl.success_order_process(
                order, decimal.Decimal(tx_amount), pw_trade_id):
            return BaseResponse(
                '{"company_order_num":"%s", "mownecum_order_num":"%s", "status":"0", "error_msg":"%s"}'
                % (sys_tx_id, pw_trade_id, "更新订单状态失败"))

        return BaseResponse(
            '{"company_order_num":"%s", "mownecum_order_num":"%s", "status":"1", "error_msg":""}'
            % (sys_tx_id, pw_trade_id))
Пример #28
0
def redirect(location, code=302):
    from werkzeug.wrappers import BaseResponse
    display_location = location
    if isinstance(location, unicode):
        from werkzeug.urls import iri_to_uri
        location = iri_to_uri(location)
    response = BaseResponse(
        '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>Redirecting...</title>\n<h1>Redirecting...</h1>\n<p>You should be redirected automatically to target URL: <a href="%s">%s</a>.  If not click the link.'
        % (location, display_location),
        code,
        mimetype='text/html')
    response.headers['Location'] = location
    return response
Пример #29
0
def createResponse(status_code:int, message: Dict[str, Any]) -> BaseResponse:
    """
    Create a standarized response from a message
    Arguments:
        status_code {int} -- [description]
        message {str} -- [description]
    Returns:
        [flask response]
    """
    response = BaseResponse(response=json.dumps(message, ensure_ascii=False),
                            status=status_code,
                            headers={'Contet-Type': 'application/json ; charset=utf-8'})
    return response
Пример #30
0
    def wsgi_app(self, environ, start_response):
        # response = BaseResponse('hello world')
        # return response(environ, start_response)
        # request = BaseRequest(environ)
        if BaseRequest(environ).path == '/favicon.ico':
            response = BaseResponse('ico')
        else:

            request = Request(BaseRequest(environ))

            response = self.kernel.handle(request)

        return response(environ, start_response)