Beispiel #1
0
def selltoken(request):
    request_obj = None
    api_user = None
    try:
        logger.info('receive request from: {0}'.format(request.get_host()))
        logger.info('receive request {0}'.format(request.body.decode('utf-8')))
        try:
            request_json = json.loads(request.body.decode('utf-8'))
        except:
            raise ValueError(ERR_INVALID_JSON_INPUT)

        request_obj, api_user = parseUserInput(request_json)
        validateUserInput(API_METHOD_REDEEM, request_obj, api_user)
        logger.info(
            'selltoken(): [out_trade_no:{0}] find out api user id is {1}, key {2}'
            .format(request_obj.out_trade_no, api_user.user.id,
                    api_user.secretKey))
        validate_request(request_obj, api_user, API_METHOD_REDEEM)
        tradex = TradeExchangeManager()
        api_trans, sell_orderId = tradex.post_sell_order(request_obj, api_user)
        return JsonResponse(
            create_selltoken_response(request_obj, api_trans, sell_orderId))
    #TODO: should handle different error here.
    # what if network issue, what if the return is 30x, 40x, 50x
    except ValueError as ve:
        logger.error('selltoken(): hit ValueError {0}'.format(ve.args[0]))
        return handleValueError(ve.args[0],
                                api_user.secretKey if api_user else None)
    except:
        error_msg = 'selltoken()遇到错误: {0}'.format(sys.exc_info()[0])
        logger.exception(error_msg)
        resp = create_error_trade_response(request_obj, api_user, '系统错误',
                                           '系统错误', '')
        return JsonResponse(resp.to_json())
    def test_normal_trade_price_is_lowest(self):
        orders = []
        admin = User.objects.get(username='******')
        user = User.objects.get(username='******')
        orders.append(Order.objects.create(
            order_id='order_1',
            user= user,
            units = 10,
            unit_price = 5.0,
            order_source = 'TRADESITE',
            created_by = user,
            lastupdated_by = user
        ))

        orders.append(Order.objects.create(
            order_id='order_2',
            user = user,
            units = 10,
            unit_price = 5.0,
            order_source = 'API',
            created_by = user,
            lastupdated_by = user
        ))

        orders.append(Order.objects.create(
            order_id='order_3',
            user = user,
            units = 10,
            unit_price = 5.1,
            order_source = 'TRADESITE',
            created_by = user,
            lastupdated_by = user
        ))

        orders.append(Order.objects.create(
            order_id='order_4',
            user = user,
            units = 10,
            unit_price = 3.5,
            order_source = 'API',
            created_by = user,
            lastupdated_by = user
        ))

        orders.append(Order.objects.create(
            order_id='order_5',
            user = user,
            units = 10,
            unit_price = 3.499,
            order_source = 'TRADESITE',
            created_by = user,
            lastupdated_by = user
        ))

        tradeex = TradeExchangeManager()

        suggested_price = tradeex.decide_sell_price(orders)
        print("suggesed price: {0} lowest api price {1}".format(suggested_price, orders[4].unit_price))
        self.assertTrue(suggested_price < orders[4].unit_price, "final price should be lower than lowest normal sell order")
        self.assertTrue(math.fabs(suggested_price - orders[4].unit_price * 0.95) < 0.0001, "final price should be 5\% lower than lowest normal sell order")
Beispiel #3
0
def handle_pend_api_trans(api_trans):
    tradex = TradeExchangeManager()
    logger.info("handle_pend_api_trans: {0}".format(
        api_trans.original_request))
    request_obj = TradeAPIRequest.parseFromJson(
        json.loads(api_trans.original_request))
    tradex.post_sell_order(request_obj, api_trans.api_user, api_trans)
Beispiel #4
0
def cancel_order(request):
    try:
        logger.debug('receive request from: {0}'.format(request.get_host()))
        logger.info('receive request {0}'.format(request.body.decode('utf-8')))
        try:
            request_json = json.loads(request.body.decode('utf-8'))
        except:
            raise ValueError(ERR_INVALID_JSON_INPUT)

        request_obj = TradeAPIRequest.parseFromJson(request_json)
        api_user = APIUserManager.get_api_user_by_apikey(request_obj.api_key)
        validate_request(request_obj, api_user, 'wallet.trade.cancel')
        tradeex = TradeExchangeManager()
        api_trans = tradeex.find_transaction(request_obj.trx_bill_no)
        sitesettings = context_processor.settings(request)['settings']
        appId = sitesettings.heepay_app_id
        appKey = sitesettings.heepay_app_key

        # if trade status is alreadu in failed state, just return the status
        if api_trans.trade_status in [
                'ExpiredInvalid', 'DevClose', 'UserAbandon', 'PaidSuccess',
                'PaidSuccess'
        ]:
            return JsonResponse(
                create_cancel_response(api_trans, api_user).to_json())

        if api_trans.payment_status in ['Unknow', 'NotStart', 'PaySuccess']:
            if api_trans.payment_provider != 'heepay':
                logger.error(
                    'query_order_status(): found unsupported payment provider {0}'
                    .format(api_trans.payment_provider))
                raise ValueError('PAYMENT_PROVIDER_NOT_SUPPORTED')
            logger.info(
                'api trans id {0}, reference_order {1}: payment_status: {2}. Query heepay for status...'
                .format(api_trans.transactionId,
                        api_trans.reference_order.order_id,
                        api_trans.payment_status))
            heepay = HeePayManager()
            json_response = heepay.get_payment_status(
                api_trans.reference_order.order_id,
                api_trans.reference_bill_no, appId, appKey)
            ordermanager.update_order_with_heepay_notification(
                json_response, 'admin')
            api_trans.refresh_from_db()
            if api_trans.payment_status in ['Unknow', 'NotStart']:
                APIUserTransactionManager.abandon_trans(api_trans)
                api_trans.refresh_from_db()
        return JsonResponse(
            create_query_status_response(api_trans, api_user).to_json())
    #TODO: should handle different error here.
    # what if network issue, what if the return is 30x, 40x, 50x
    except:
        error_msg = 'query_order_status()遇到错误: {0}'.format(sys.exc_info()[0])
        logger.exception(error_msg)
        resp = create_error_trade_response(request_obj, api_user, '系统错误',
                                           '系统错误', '')
        return JsonResponse(resp.to_json())
Beispiel #5
0
def prepurchase(request):
    request_obj = None
    api_user = None
    try:
        logger.info('receive request from: {0}'.format(request.get_host()))
        logger.info('receive request in binary {0}'.format(request.body))
        logger.info('receive request {0}'.format(request.body.decode('utf-8')))

        try:
            request_json = json.loads(request.body.decode('utf-8'))
        except:
            raise ValueError(ERR_INVALID_JSON_INPUT)

        request_obj, api_user = parseUserInput(request_json)
        validateUserInput(API_METHOD_PURCHASE, request_obj, api_user)

        #if request_obj.total_fee > settings.API_TRANS_LIMIT:
        #    raise ValueError('OVERLIMIT: amount:{0}, limit:{1}'.format(request_obj.total_fee, settings.API_TRANS_LIMIT))
        #api_user = APIUserManager.get_api_user_by_apikey(request_obj.apikey)
        #logger.info('prepurchase(): [out_trade_no:{0}] find out api user id is {1}, key {2}'.format(
        #    request_obj.out_trade_no, api_user.user.id, api_user.secretKey
        #))
        #validate_request(request_obj, api_user, 'wallet.trade.buy')
        #logger.info('prepurchase(): [out_trade_no:{0}] request is valid'.format(
        #    request_obj.out_trade_no
        #))

        tradex = TradeExchangeManager()
        sitesettings = context_processor.settings(request)['settings']
        final_resp_json = tradex.purchase_by_cash_amount(
            api_user, request_obj, 'AXFund', sitesettings, True)

        logger.info("prepurchase(): sending response to buyer...")
        return JsonResponse(final_resp_json)
        #else:
        #    raise ValueError("payment provider {0} is not supported".format(request_obj.payment_provider))
    #TODO: should handle different error here.
    # what if network issue, what if the return is 30x, 40x, 50x
    except ValueError as ve:
        logger.error('prepurchase(): hit ValueError {0}'.format(ve.args[0]))
        return handleValueError(ve.args[0],
                                api_user.secretKey if api_user else None)
    except:
        error_msg = 'prepurchase()遇到错误: {0}'.format(sys.exc_info()[0])
        logger.exception(error_msg)
        resp = create_error_trade_response(request_obj, api_user, '系统错误',
                                           '系统错误', '')
        return JsonResponse(resp.to_json())
Beispiel #6
0
def heepay_notification(request):
    sitesettings = context_processor.settings(request)['settings']
    notify_json = get_payment_confirmation_json(request,
                                                sitesettings.heepay_app_key)
    heepay_notify = HeepayNotification.parseFromJson(
        notify_json, sitesettings.heepay_app_key)
    tradeex = TradeExchangeManager()
    api_trans = None
    try:
        api_trans = APIUserTransactionManager.get_trans_by_reference_order(
            heepay_notify.out_trade_no)
        updated_api_trans = tradeex.handle_payment_notificiation(
            'heepay', heepay_notify, api_trans)
        logger.debug(
            "handle_payment_notificiation(): return trade_status: {0}".format(
                updated_api_trans.trade_status))
        if updated_api_trans.trade_status.upper() == 'INPROGRESS':
            logger.debug(
                "heepay_notification(): Do nothing if payment provider is in progress"
            )
            return HttpResponse(content='ok')
        elif updated_api_trans.trade_status.upper() == 'PAIDSUCCESS':
            resp_content = 'OK'
            if not APIUserTransactionManager.on_trans_paid_success(
                    updated_api_trans):
                logger.debug(
                    "heepay_notification(): on_trans_paid_success() failed")
                resp_content = 'error'
            return HttpResponse(content=resp_content)
        else:
            logger.debug("heepay_notification(): return failed response")
            return HttpResponse(content='error')

    except ValueError as ve:
        error_msg = "heepay_notification(): [out_trade_no:{0}] hit value error {1}".format(
            heepay_notify.out_trade_no, ve.args[0])
        logger.error(error_msg)
        if api_trans:
            APIUserTransactionManager.update_status_info(
                api_trans.transactionId, error_msg)
        return HttpResponse(content='error')
    except:
        error_msg = 'heepay_notification()遇到错误: {0}'.format(sys.exc_info()[0])
        logger.exception(error_msg)
        if api_trans:
            APIUserTransactionManager.update_status_info(
                api_trans.transactionId, error_msg)
        return HttpResponse(content='error')
Beispiel #7
0
def query_order_status(request):
    api_user = None
    request_obj = None
    try:
        logger.debug('receive request from: {0}'.format(request.get_host()))
        logger.info('receive request {0}'.format(request.body.decode('utf-8')))
        try:
            request_json = json.loads(request.body.decode('utf-8'))
        except:
            raise ValueError(ERR_INVALID_JSON_INPUT)

        request_obj, api_user = parseUserInput(request_json)
        validateUserInput(API_METHOD_QUERY, request_obj, api_user)
        tradeex = TradeExchangeManager()
        api_trans = tradeex.find_transaction(request_obj.trx_bill_no)
        sitesettings = context_processor.settings(request)['settings']
        appId = sitesettings.heepay_app_id
        appKey = sitesettings.heepay_app_key

        # if trade status is alreadu in failed state, just return the status
        logger.info(
            'query_order_status(): api trans[{0}] trade_status is {1}'.format(
                api_trans.transactionId, api_trans.trade_status))
        if api_trans.trade_status in [
                'ExpiredInvalid', 'DevClose', 'UserAbandon'
        ]:
            return JsonResponse(
                create_query_status_response(api_trans, api_user).to_json())

        if api_trans.payment_status in ['Unknow', 'NotStart', 'PaySuccess']:
            if api_trans.payment_provider != 'heepay':
                logger.error(
                    'query_order_status(): found unsupported payment provider {0}'
                    .format(api_trans.payment_provider))
                raise ValueError('PAYMENT_PROVIDER_NOT_SUPPORTED')
            logger.info(
                'api trans id {0}, reference_order {1}: payment_status: {2}. Query heepay for status...'
                .format(api_trans.transactionId,
                        api_trans.reference_order.order_id,
                        api_trans.payment_status))
            heepay = HeePayManager()
            json_response = heepay.get_payment_status(
                api_trans.reference_order.order_id,
                api_trans.reference_bill_no, appId, appKey)
            ordermanager.update_order_with_heepay_notification(
                json_response, 'admin')
            api_trans.refresh_from_db()

        return JsonResponse(
            create_query_status_response(api_trans, api_user).to_json())
    except ValueError as ve:
        logger.error('query_order_status(): hit ValueError {0}'.format(
            ve.args[0]))
        return handleValueError(ve.args[0],
                                api_user.secretKey if api_user else None)
    except:
        error_msg = 'query_order_status()遇到错误: {0}'.format(sys.exc_info()[0])
        logger.exception(error_msg)
        resp = create_error_trade_response(request_obj, api_user, '系统错误',
                                           '系统错误', '')
        return JsonResponse(resp.to_json())
    def test_two_close_low_api_price(self):
        orders = []
        admin = User.objects.get(username='******')
        user = User.objects.get(username='******')
        orders.append(Order.objects.create(
            order_id='order_1',
            user= user,
            units = 10,
            unit_price = 1.0,
            order_source = 'TRADESITE',
            created_by = user,
            lastupdated_by = user
        ))

        orders.append(Order.objects.create(
            order_id='order_2',
            user = user,
            units = 10,
            unit_price = 1.0,
            order_source = 'API',
            created_by = user,
            lastupdated_by = user
        ))

        orders.append(Order.objects.create(
            order_id='order_3',
            user = user,
            units = 10,
            unit_price = 1.1,
            order_source = 'TRADESITE',
            created_by = user,
            lastupdated_by = user
        ))

        orders.append(Order.objects.create(
            order_id='order_4',
            user = user,
            units = 10,
            unit_price = 0.5,
            order_source = 'API',
            created_by = user,
            lastupdated_by = user
        ))

        orders.append(Order.objects.create(
            order_id='order_5',
            user = user,
            units = 10,
            unit_price = 0.499,
            order_source = 'API',
            created_by = user,
            lastupdated_by = user
        ))

        tradeex = TradeExchangeManager()

        suggested_price = tradeex.decide_sell_price(orders)
        print("suggesed price: {0} lowest api price {1}".format(suggested_price, orders[4].unit_price))
        self.assertTrue(suggested_price > orders[4].unit_price, "final price should be higher than lowest API sell order")
        self.assertTrue(suggested_price - orders[4].unit_price - 0.01 > 0, "final price should be at least 0.01 higher than lowest API sell order")
        self.assertTrue(suggested_price - orders[4].unit_price * 1.005 > 0, "final price should be higher than lowest API sell order addi ng 5\%")
        self.assertTrue(suggested_price - orders[4].unit_price * 1.005 < 0.01, "final price should be less than 0.01 higher than the lowest API sell order adding 5\%")