예제 #1
0
def get_yandex_balance():
    yandex_money_token = get_config_var('YandexMoneyToken')
    if not yandex_money_token:
        return False
    wallet = Wallet(yandex_money_token)
    account_info = wallet.account_info()
    return account_info['balance']
예제 #2
0
파일: bot.py 프로젝트: EremeykinS/bot
        def pay(message, to, amount, con):
            cur = con.cursor()
            cur.execute('SELECT token FROM `users` WHERE cid=' + str(message.from_user.id))
            con.commit()

            sql_result = cur.fetchall()
            if sql_result:
                token = sql_result[0][0]
            else:
                # no user in DB
                return 'Перейдите по <a href="http://95.163.114.6/?cid=' + str(message.from_user.id) + '&to=' + str(self.to_number) + '&amount=' + str(self.amount) + '">ссылке</a>'

            request_options = {"pattern_id": "p2p", "to": self.to_number, "amount_due": self.amount, "comment": "переведено через бота", "message": "переведено через бота", "label": "testPayment"}
            wallet = Wallet(token)
            request_result = wallet.request_payment(request_options)
            print(request_result)
            if 'error' in request_result:
                return 'Произошла ошибка\nВозможно, неверно введен номер или пользователю невозможно отправить перевод'
            else:
                # check status
                process_payment = wallet.process_payment({"request_id": request_result['request_id'],})
                # check result
                if process_payment['status'] == "success":
                    return 'Ваш платеж успешно проведен!'
                else:
                    return 'К сожалению, что-то пошло не так =(\n Платеж не проведен\nМожете попробовать еще раз'
예제 #3
0
파일: bot.py 프로젝트: EremeykinS/bot
        def account_info(message, con):
            cur = con.cursor()
            cur.execute('SELECT token FROM `users` WHERE cid=' + str(message.from_user.id))
            con.commit()
            sql_result = cur.fetchall()
            if sql_result:
                token = sql_result[0][0]
            else:
                # no user in DB
                return 'Для продолжения перейдите по <a href="http://95.163.114.6/?cid=' + str(message.from_user.id) + '&b=1">ссылке</a>'

            wallet = Wallet(token)
            return wallet.account_info()['balance_details']['available']
예제 #4
0
        def account_info(message, con):
            cur = con.cursor()
            cur.execute('SELECT token FROM `users` WHERE cid=' +
                        str(message.from_user.id))
            con.commit()
            sql_result = cur.fetchall()
            if sql_result:
                token = sql_result[0][0]
            else:
                # no user in DB
                return 'Для продолжения перейдите по <a href="http://95.163.114.6/?cid=' + str(
                    message.from_user.id) + '&b=1">ссылке</a>'

            wallet = Wallet(token)
            return wallet.account_info()['balance_details']['available']
예제 #5
0
 def testObtainTokenUrl(self):
     client_id = "client-id"
     url = Wallet.build_obtain_token_url(
         "client-id",
         "http://localhost/redirect",
         ["account-info", "operation_history"]
     )
예제 #6
0
def get_yandex_auth_url():
    scope = [
        'account-info', 'operation-history', 'operation-details',
        'payment-p2p.limit(1,100000)', 'money-source("wallet","card")'
    ]
    return Wallet.build_obtain_token_url(client_id, 'http://' + ip + '/ym',
                                         scope) + '&response_type=code'
예제 #7
0
def api_internal_yandex_get_auth_url(discodes_id):
    log = logging.getLogger('payment')

    result = {'error': 1}
    if not PaymentWallet.get_valid_by_discodes_id(discodes_id):
        return make_response(jsonify(result))

    url = None
    if 'url' in request.args:
        url = request.args['url']
    if not url:
        return make_response(jsonify(result))

    try:
        auth_url = Wallet.build_obtain_token_url(
            YandexMoneyConfig.CLIENT_ID,
            url,
            YandexMoneyConfig.WALLET_SCOPE)
    except Exception as e:
        log.error(e)
        return make_response(jsonify(result))
    else:
        result['error'] = 0
        result['url'] = auth_url

    return make_response(jsonify(result))
예제 #8
0
def check_payment_history(comment, amount):
    yandex_money_token = get_config_var('YandexMoneyToken')
    if not yandex_money_token:
        return False
    wallet = Wallet(yandex_money_token)
    options = {
        "type": "deposition",
        "details": "true"
    }
    for operation in wallet.operation_history(options)['operations']:
        try:
            if operation['message'] == comment and operation['amount'] >= amount:
                return True
        except KeyError:
            continue
    return False
예제 #9
0
    def get_ym_token(discodes_id, code, url):
        log = logging.getLogger('payment')

        wallet = PaymentWallet.get_valid_by_discodes_id(discodes_id)
        if not wallet:
            return False

        try:
            info = Wallet.get_access_token(
                client_id=YandexMoneyConfig.CLIENT_ID,
                code=code,
                redirect_uri=url,
                client_secret=YandexMoneyConfig.OAUTH_KEY)
        except Exception as e:
            log.error(e)
            return False
        else:
            if 'error' in info:
                log.error(info)
                return False
            try:
                PaymentCard.set_archiv(wallet.id)

                card = PaymentCard.add_ym_wallet(wallet, info['access_token'])
                card.save()
            except Exception as e:
                log.error(e)
                return False
            else:
                wallet.blacklist = PaymentWallet.ACTIVE_ON
                wallet.save()
            return True
예제 #10
0
def send_money(number, amount):
    yandex_money_token = get_config_var('YandexMoneyToken')
    if not yandex_money_token:
        return False
    wallet = Wallet(yandex_money_token)
    options = {
        "pattern_id": "p2p",
        "to": number,
        "amount_due": amount
    }
    request_result = wallet.request_payment(options)
    process_payment = wallet.process_payment({"request_id": request_result['request_id']})
    if process_payment['status'] == "success":
        return True
    else:
        ym_logger.warning(process_payment['error'])
        return False
예제 #11
0
def get_yandex_wallet_history():
    wallet, c = Wallets.objects.get_or_create(name='Yandex Money')
    yandex_uw = UserWallet.objects.filter(wallet=wallet)
    if len(yandex_uw) > 0:
        for uw in yandex_uw:
            access_token = uw.access_token
            if access_token is not None:
                yandex_wallet_object = Wallet(access_token)
                account_info = yandex_wallet_object.account_info()
                uw.balance = account_info['balance']
                uw.total_btc = get_btc_value('rur', account_info['balance'])
                uw.total_usd = get_usd_value('rur', account_info['balance'])
                uw.save()
                get_yandex_records(wallet=yandex_wallet_object, uw=uw)
        print('ok')
    else:
        print("Кошельки отсутствуют")
    return True
예제 #12
0
파일: bot.py 프로젝트: o0neup/hackaym
def get_auth_url(user_id, code_redirect_uri=REDIRECT_TO):
    """
    :param user_id:
    :param code_redirect_uri:
    :return:
    """
    redirect_url = "{}/{}?user_id={}".format(
        BASE_URL, code_redirect_uri, user_id)
    return Wallet.build_obtain_token_url(client_id=YM_CLIENT_ID, redirect_uri=redirect_url,
                                         scope=YM_SCOPE)
예제 #13
0
def wallet(request):
    if request.method == 'POST':
        wallet = Wallets.objects.get(pk=request.POST.get('wallet'))
        if wallet.name == 'Yandex Money':
            if not settings.YANDEX_MONEY_CLIENT_ID or not settings.YANDEX_MONEY_REDIRECT_URI or not \
                    settings.YANDEX_MONEY_CLIENT_SECRET:
                return HttpResponse('You must define yandex money settings',
                                    status=404)
            scope = ['account-info', 'operation-history', 'operation-details']
            auth_url = Wallet.build_obtain_token_url(
                client_id=settings.YANDEX_MONEY_CLIENT_ID,
                redirect_uri=settings.YANDEX_MONEY_REDIRECT_URI,
                scope=scope) + '&response_type=code'
            return redirect(auth_url)
        else:
            uw = UserWallet()
            uw.user = request.user
            uw.address = request.POST.get('address')
            uw.wallet = wallet
            uw.save()
    elif request.method == 'GET':
        if not settings.YANDEX_MONEY_CLIENT_ID or not settings.YANDEX_MONEY_REDIRECT_URI or not \
                settings.YANDEX_MONEY_CLIENT_SECRET:
            return HttpResponse('You must define yandex money settings',
                                status=404)
        access_token = Wallet.get_access_token(
            client_id=settings.YANDEX_MONEY_CLIENT_ID,
            redirect_uri=settings.YANDEX_MONEY_REDIRECT_URI,
            code=request.GET.get('code'),
            client_secret=settings.YANDEX_MONEY_CLIENT_SECRET)
        access_token = access_token['access_token']
        wallet = Wallet(access_token)
        account_info = wallet.account_info()
        uw = UserWallet()
        uw.wallet = Wallets.objects.get(name='Yandex Money')
        uw.access_token = access_token
        uw.user = request.user
        uw.address = account_info['account']
        uw.balance = account_info['balance']
        uw.save()
    return redirect(index)
예제 #14
0
        def pay(message, to, amount, con):
            cur = con.cursor()
            cur.execute('SELECT token FROM `users` WHERE cid=' +
                        str(message.from_user.id))
            con.commit()

            sql_result = cur.fetchall()
            if sql_result:
                token = sql_result[0][0]
            else:
                # no user in DB
                return 'Перейдите по <a href="http://95.163.114.6/?cid=' + str(
                    message.from_user.id) + '&to=' + str(
                        self.to_number) + '&amount=' + str(
                            self.amount) + '">ссылке</a>'

            request_options = {
                "pattern_id": "p2p",
                "to": self.to_number,
                "amount_due": self.amount,
                "comment": "переведено через бота",
                "message": "переведено через бота",
                "label": "testPayment"
            }
            wallet = Wallet(token)
            request_result = wallet.request_payment(request_options)
            print(request_result)
            if 'error' in request_result:
                return 'Произошла ошибка\nВозможно, неверно введен номер или пользователю невозможно отправить перевод'
            else:
                # check status
                process_payment = wallet.process_payment({
                    "request_id":
                    request_result['request_id'],
                })
                # check result
                if process_payment['status'] == "success":
                    return 'Ваш платеж успешно проведен!'
                else:
                    return 'К сожалению, что-то пошло не так =(\n Платеж не проведен\nМожете попробовать еще раз'
예제 #15
0
    def get_ym_account(card_id):
        log = logging.getLogger('payment')

        card = PaymentCard.query.get(card_id)
        if not card:
            message = 'Payment: Not found card card_id=%s' % card_id
            log.error(message)
            return False

        wallet = Wallet(card.token)
        try:
            info = wallet.account_info()
        except Exception as e:
            log.error(e)
            return False
        else:
            if 'account' not in info:
                return False

            card.pan = info['account']
            card.save()
            return True
예제 #16
0
 def testGetAccessToken(self):
     options = {
         "code": "code",
         "client_id": "client_id",
         "grant_type": "authorization_code",
         "redirect_uri": "redirect_uri",
         "client_secret": "client_secret"
     }
     response = Wallet.get_access_token(
         code=options["code"],
         client_id=options["client_id"],
         redirect_uri=options["redirect_uri"],
         client_secret=options["client_secret"])
     self.assertEqual(response['error'], 'unauthorized_client')
예제 #17
0
 def testGetAccessToken(self):
     options = {
         "code": "code",
         "client_id": "client_id",
         "grant_type": "authorization_code",
         "redirect_uri": "redirect_uri",
         "client_secret": "client_secret"
     }
     response = Wallet.get_access_token(
         code=options["code"],
         client_id=options["client_id"],
         redirect_uri=options["redirect_uri"],
         client_secret=options["client_secret"]
     )
     self.assertEqual(response['error'], 'unauthorized_client')
예제 #18
0
파일: ymauth.py 프로젝트: o0neup/hackaym
def oauth_confirm():
    code = request.args.get("code")
    user_id = request.args.get("user_id")
    if not code:
        raise ValueError("The code is missing, and it's sucks :(")
    ym_redirect_url = "{}/{}".format(BASE_URL, REDIRECT_TO)
    token = Wallet.get_access_token(client_id=YM_CLIENT_ID, code=code,
                                    redirect_uri=ym_redirect_url)
    account_info = Wallet(access_token=token['access_token']).account_info()

    service = ModelService(session)
    try:
        service.add_wallet(username=user_id, auth_token=token['access_token'],
                           account_id=int(account_info["account"]))
    except IntegrityError:
        return redirect("{}/auth_confirmed?user_id={}".format(BASE_URL, user_id))
    except Exception as e:  # TODO handle exceptions with invalid user_id!
        logger.exception(e)
        return redirect("{}/auth_failed?user_id={}".format(BASE_URL, user_id))
    return redirect("{}/auth_confirmed?user_id={}".format(BASE_URL, user_id))
 def testGetAccessToken(self):
     self.addResponse(Wallet.SP_MONEY_URL + "/oauth/token",
                      {"status": "success"},
                      is_api_url=False
                      )
     options = {
         "code": "code",
         "client_id": "client_id",
         "grant_type": "authorization_code",
         "redirect_uri": "redirect_uri",
         "client_secret": "client_secret" 
         }
     response = Wallet.get_access_token(
         code=options["code"],
         client_id=options["client_id"],
         redirect_uri=options["redirect_uri"],
         client_secret=options["client_secret"]
     )
     self.assertEqual(response, {"status": "success"})
     self.assertEqual(
         responses.calls[0].request.body,
         urlencode(options)
     )
예제 #20
0
def api_internal_yandex_get_auth_url(discodes_id):
    log = logging.getLogger('payment')

    result = {'error': 1}
    if not PaymentWallet.get_valid_by_discodes_id(discodes_id):
        return make_response(jsonify(result))

    url = None
    if 'url' in request.args:
        url = request.args['url']
    if not url:
        return make_response(jsonify(result))

    try:
        auth_url = Wallet.build_obtain_token_url(
            YandexMoneyConfig.CLIENT_ID, url, YandexMoneyConfig.WALLET_SCOPE)
    except Exception as e:
        log.error(e)
        return make_response(jsonify(result))
    else:
        result['error'] = 0
        result['url'] = auth_url

    return make_response(jsonify(result))
예제 #21
0
파일: server.py 프로젝트: EremeykinS/bot
 def do_GET(self):
     #DB connection
     con = sqlite3.connect('/home/user/bot/users.sqlite')
     cur = con.cursor()
     p = urlparse(self.path)
     q = parse_qs(p.query)
     self.send_response(302, 'Found')
     if 'cid' in q:
         scope = ['account-info', 'operation-history', 'payment-p2p']
         auth_url = Wallet.build_obtain_token_url(config.client_id, config.redirect_uri, scope)
         self.send_header('Location', auth_url)
         if 'b' in q:
             self.send_header("Set-Cookie", "cid=" + q['cid'][0] + '&b=1')
         else:
             self.send_header("Set-Cookie", "cid=" + q['cid'][0] + '&to=' + q['to'][0] + '&amount=' + q['amount'][0])
     elif 'code' in q:
         access_token = Wallet.get_access_token(config.client_id, q['code'][0], config.redirect_uri, client_secret=None)
         cookie = parse_qs(self.headers.get('Cookie'))
         cid = cookie['cid'][0]
         cur.execute('INSERT INTO users (cid, token) VALUES ("' + str(cid) +'", "' + access_token['access_token'] + '")')
         con.commit()
         wallet = Wallet(access_token['access_token'])
         if 'b' in cookie:
             queue.put({'cid': cid, 'b': wallet.account_info()['balance_details']['available']})
         else:
             to = cookie['to'][0]
             amount = cookie['amount'][0]
             request_options = {"pattern_id": "p2p", "to": to, "amount_due": amount, "comment": "переведено через бота", "message": "переведено через бота", "label": "testPayment"}
             request_result = wallet.request_payment(request_options)
             # check status
             process_payment = wallet.process_payment({"request_id": request_result['request_id'],})
             # check result
             if process_payment['status'] == "success":
                 queue.put({'cid': cid, 'result':'+'})
             else:
                 queue.put({'cid': cid, 'result':'-'})
         self.send_header('Location', 'http://telegram.me/GodMoneyBot')
     self.end_headers()
     con.close()
 def testRevokeToken(self):
     self.addResponse("revoke", {"status": "success"})
     Wallet.revoke_token("TEST TOKEN")
     self.assert_auth_header_present()
예제 #23
0
 def setUp(self):
     super(WalletTestSuite, self).setUp()
     self.api = Wallet(ACCESS_TOKEN)
예제 #24
0
class WalletTestSuite(unittest.TestCase):
    def setUp(self):
        super(WalletTestSuite, self).setUp()
        self.api = Wallet(ACCESS_TOKEN)

    def assert_auth_header_present(self):
        pass

    def testAccountInfo(self):
        response = self.api.account_info()
        self.assert_auth_header_present()

    def testGetAuxToken(self):
        token = "some_aux_token"

        response = self.api.get_aux_token(["account-info", "operation-history"])

        self.assertIn('aux_token', response)

    def testOperationHistory(self):
        options = {"records": 3}
        response = self.api.operation_history(options)

    def testOperationDetails(self):
        pass

    def testRequestPayment(self):
        options = {
            "pattern_id": "p2p",
            "to": "410011161616877",
            "amount_due": "0.02",
            "comment": "test payment comment from yandex-money-python",
            "message": "test payment message from yandex-money-python",
            "label": "testPayment",
            "test_payment": True,
            "test_result": "success"
        }

        response = self.api.request_payment(options)
        self.assertEqual(response['status'], 'success')

    def testResponsePayment(self):
        options = {
            "request_id": "test-p2p",
            "test_payment": True,
            "test_result": "success"
        }

        response = self.api.process_payment(options)
        self.assertEqual(response['status'], 'success')

    def testIncomingTransferAccept(self):
        #self.addResponse("incoming-transfer-accept", {"status": "success"})
        operation_id = "some id"
        protection_code = "some code"  # TODO: test when it's None

        response = self.api.incoming_transfer_accept(
            operation_id=operation_id,
            protection_code=protection_code
        )
        self.assertEqual(response['status'], "refused")

    def testIncomingTransferReject(self):
        #self.addResponse("incoming-transfer-reject", {"status": "success"})
        operation_id = "some operatoin id"
        response = self.api.incoming_transfer_reject(
            operation_id=operation_id,
        )

    def testObtainTokenUrl(self):
        client_id = "client-id"
        url = Wallet.build_obtain_token_url(
            "client-id",
            "http://localhost/redirect",
            ["account-info", "operation_history"]
        )
        # TODO: check url

    def testGetAccessToken(self):
        options = {
            "code": "code",
            "client_id": "client_id",
            "grant_type": "authorization_code",
            "redirect_uri": "redirect_uri",
            "client_secret": "client_secret"
        }
        response = Wallet.get_access_token(
            code=options["code"],
            client_id=options["client_id"],
            redirect_uri=options["redirect_uri"],
            client_secret=options["client_secret"]
        )
        self.assertEqual(response['error'], 'unauthorized_client')
예제 #25
0
print(delete('http://localhost:5000/api/news/1').json())'''
'''s = get('http://localhost:5000//api/v2/image/1').json()['image']
print(s)'''
'''with open('photo.jpg', 'rb') as f:
    a = f.read()
a = a.decode('latin1')
a = a.encode('latin1')

with open('good.jpg', 'wb') as file:
    file.write(a)'''

scope = ['account-info', 'operation-history']  # etc..
client_id = 'A76ACB24B8300F9585A065ECEBF272C746AC909DE178E8D696D17B6E1D0BA0C6'
redirect_uri = 'http://localhost/redirect'
url = Wallet.build_obtain_token_url(client_id, "http://localhost/redirect",
                                    ["account-info", "operation_history"])
print(url)
access_token = Wallet.get_access_token(client_id,
                                       code,
                                       redirect_uri,
                                       client_secret=None)
api = Wallet(access_token)
account_info = api.account_info()
balance = account_info['balance']  # and so on

request_options = {
    "pattern_id": "p2p",
    "to": "410011161616877",
    "amount_due": "0.02",
    "comment": "test payment comment from yandex-money-python",
    "message": "test payment message from yandex-money-python",
예제 #26
0
        def handle_text(message):
            #DB connection
            con = sqlite3.connect('/home/user/bot/users.sqlite')
            txt = message.text
            print('Получено сообщение: \'', txt, '\' от пользователя ',
                  message.from_user.first_name, '(', message.from_user.id, ')')
            # if menu stack is empty:
            kbd = main_kbd
            if txt == '.':
                self.q = []
                send_message(message.from_user.id, 'Выберите действие',
                             main_kbd)
                return
            if not self.q:
                if txt == '\U0001F4B8 Перевод денег':
                    ans = 'Введите номер кошелька или номер телефона или e-mail получателя'
                    kbd = telebot.types.ReplyKeyboardHide(selective=False)
                    send_message(message.from_user.id, ans, kbd)
                    self.q.append('to_number')
                elif txt == '\U00002139 Информация':
                    ans = 'О чем Вы хотите узнать?'
                    send_message(message.from_user.id, ans, info_kbd)
                elif txt == '\U0001F4CB Услуги':
                    ans = 'Пожалуйста, выберите услугу'
                    kbd = ser_kbd
                    send_message(message.from_user.id, ans, kbd)
                elif txt == '\U0001F4E2 Почему Яндекс.Деньги?':
                    ans = 'Пройдите наш мини-опрос и узнайте, чем может быть полезен сервис Яндекс.Деньги именно Вам\n\nЧасто ли у Вас возникает чувство, что Вы забыли заплатить за интернет или телефон?'
                    kbd = yn_kbd
                    send_message(message.from_user.id, ans, kbd)
                    self.q.append('q1')
                elif txt == '\U0001F694 Проверка штрафов ГИБДД':
                    ans = 'Введите номер водительского удостоверения'
                    kbd = telebot.types.ReplyKeyboardHide(selective=False)
                    self.q.append('check_penalty')
                    send_message(message.from_user.id, ans, kbd)

                elif txt == '\U0001F6CD Акции партнеров':
                    title_path = '/html/body/div[2]/div[2]/div/div[<i>]/div[<j>]/div/div[1]'
                    img_path = '/html/body/div[2]/div[2]/div/div[<i>]/div[<j>]/a/div/img'
                    url_path = '/html/body/div[2]/div[2]/div/div[<i>]/div[<j>]/a'
                    promo_titles = []
                    promo_img = []
                    promo_url = []
                    r = requests.get('https://money.yandex.ru/promo')
                    for j in range(1, 2 + 1):
                        for i in range(1, 3 + 1):
                            ht = lxml.html.fromstring(r.text)
                            l = ht.xpath(
                                title_path.replace('<i>', str(i)).replace(
                                    '<j>', str(j)))
                            p = ht.xpath(
                                img_path.replace('<i>', str(i)).replace(
                                    '<j>', str(j)))
                            url = ht.xpath(
                                url_path.replace('<i>', str(i)).replace(
                                    '<j>', str(j)))
                            promo_url.append(url[0].values()[4])
                            if promo_url[-1].startswith('http'):
                                ans = l[0].text.replace(
                                    '\xa0', ' ') + '\n' + url[0].values()[4]
                            else:
                                ans = l[0].text.replace(
                                    '\xa0',
                                    ' ') + '\nhttp://money.yandex.ru' + url[
                                        0].values()[4]
                            send_message(message.from_user.id, ans, kbd)
                elif txt == '\U0001F916 Информация о боте':
                    ans = """Я умею:
<b>Переводить деньги</b> на кошельки
Укажите кошелек,телефон или email. Можете отправить контакт из адресной книжки и мы переведем деньги на кошелек по этому номеру.
<b>Узнавать штрафы ГИБДД</b>
Нужен только номер водительского удотоверения
Сообщать об <b>акциях и предложениях</b> в Яндекс.Деньгах
Покажу весь список со ссылками
Узнавать ваш <b>баланс</b> и рассказывать про <b>курс валют</b>
Только актуальные данные!
А еще Вы можете пройти <b>опрос</b> и узнать о выгодах от использования лично для Вас.
\n
Полезные команды:
чтобы перейти в главное меню введите точку '.'
/help информация о боте
/start начало работы
"""
                    kbd = main_kbd
                    send_message(message.from_user.id, ans, kbd)
                elif txt == '\U0001F4B1 Курсы валют':
                    ans = '\U0001F4C5 Данные актуальны на 13.03.2016 ' + str(
                        datetime.datetime.now().time()
                    )[:8] + '\n\U0001F4B5 Доллар США\n70,3067 RUB\n\U0001F4B6 Евро\n77.9700 RUB'
                    cur = con.cursor()
                    cur.execute('SELECT token FROM `users` WHERE cid=' +
                                str(message.from_user.id))
                    con.commit()
                    sql_result = cur.fetchall()
                    if sql_result:
                        token = sql_result[0][0]
                        wallet = Wallet(token)
                        b = wallet.account_info(
                        )['balance_details']['available']
                        ans += '\nНа имеющиеся на вашем счете ' + str(
                            b) + ' руб. Вы можете купить:\n· ' + str(
                                round(b / 70.3067,
                                      2)) + ' долларов США\n· ' + str(
                                          round(b / 77.97, 2)) + ' евро'
                    send_message(message.from_user.id, ans, info_kbd)
                elif txt == 'Меню':
                    self.q = []
                    send_message(message.from_user.id, 'Выберите действие',
                                 main_kbd)
                elif txt == '\U0001F4B0 Информация о балансе':
                    ai = str(account_info(message, con))
                    print('ai = ', ai)
                    print('ai.startswith(\'http\')', ai.startswith('http'))
                    if ai.startswith('Для'):
                        ans = ai
                    else:
                        ans = 'Баланс: ' + ai + ' руб.'
                    kbd = info_kbd
                    send_message(message.from_user.id, ans, kbd)
                else:
                    ans = 'Я не понял, попробуйте что-нибудь другое'
                    send_message(message.from_user.id, ans, kbd)
            else:
                if self.q:
                    cmenu = self.q.pop()
                    if cmenu == 'check_penalty':
                        ans = check_penalty(message)
                        send_message(message.from_user.id, ans, kbd)
                    elif cmenu == 'to_number':
                        self.to_number = message.text
                        ans = 'Введите сумму к получению в рублях'
                        kbd = amount_kbd
                        send_message(message.from_user.id, ans, kbd)
                        self.q.append('amount')
                    elif cmenu == 'q1':
                        if message.text == 'да':
                            ans = 'Вы оплачиваете ЖКУ сами лично?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q2')
                        else:
                            ans = 'У Вас есть свой веб-сайт?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q3')
                    elif cmenu == 'q3':
                        if message.text == 'да':
                            ans = 'Скорее всего, Вы выглядите как-то так...'
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.send_photo(
                                message.from_user.id,
                                open('/home/user/bot/img/bm.jpg', 'rb'))
                            ans = '\nВы можете принимать платежи на вашем сайте через <a href="https://kassa.yandex.ru/">Яндекс.Кассу</a>'
                            send_message(message.from_user.id, ans, kbd)
                        else:
                            ans = 'Вы оплачиваете ЖКУ сами лично?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q2')
                    elif cmenu == 'q2':
                        if message.text == 'да':
                            ans = 'У Вас есть карта "Тройка"?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q4')
                        else:
                            ans = 'У Вас мало времени на досуг?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q5')
                    elif cmenu == 'q5':
                        if message.text == 'да':
                            ans = 'Скорее всего, Вы выглядите как-то так...'
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.send_photo(
                                message.from_user.id,
                                open('/home/user/bot/img/work.jpg', 'rb'))
                            ans = '\nМы понимаем, что у Вас не хватает времени на себя. Именно поэтому, чтобы помочь вам выкроить немного свободного времени, предлагаем удобно оплачивать штрафы ГИБДД, билеты в театр и прочие заказы в несколько кликов'
                            send_message(message.from_user.id, ans, kbd)
                        else:
                            ans = 'Вы когда-либо покупали технику в инетрнет-магазине?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q8')
                    elif cmenu == 'q4':
                        if message.text == 'да':
                            ans = 'Вы когда-либо покупали одежду в интернет-магазине?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q7')
                        else:
                            ans = 'У Вас есть личное авто?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q6')
                    elif cmenu == 'q6':
                        if message.text == 'да':
                            ans = 'У Вас мало времени на досуг?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q5')
                        else:
                            ans = 'Вы когда-либо покупали одежду в интернет-магазине?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q7')
                    elif cmenu == 'q7' or cmenu == 'q5':
                        if message.text == 'нет':
                            ans = 'Вы когда-либо покупали технику в интернет-магазине?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q8')
                    elif cmenu == 'q8':
                        if message.text == 'да':
                            ans = 'Скорее всего, Вы выглядите как-то так...'
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.send_photo(
                                message.from_user.id,
                                open('/home/user/bot/img/student.jpg', 'rb'))
                            ans = '\nВы молоды и энергичны. Не стоит понапрасну терять время - оплачивайте покупки без отрыва от вашей насыщенной жизни прямо сейчас'
                            send_message(message.from_user.id, ans, kbd)
                        else:
                            ans = 'Скорее всего, Вы выглядите как-то так...'
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.send_photo(
                                message.from_user.id,
                                open('/home/user/bot/img/hw.jpg', 'rb'))
                            ans = '\nВы явно заботитесь о домашнем очаге. Чтобы принести в дом еще больше уюта, платите легко и узнавайте скидки на <ahref="https://money.yandex.ru/promo/">сайте</a>'
                            send_message(message.from_user.id, ans, kbd)
                    elif cmenu == 'q7':
                        if message.text == 'нет':
                            ans = 'Скорее всего, Вы выглядите как-то так...'
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.send_photo(
                                message.from_user.id,
                                open('/home/user/bot/img/hw.jpg', 'rb'))
                            ans = '\nВы явно заботитесь о домашнем очаге. Чтобы принести в дом еще больше уюта, платите легко и узнавайте скидки на <a href="https://money.yandex.ru/promo/">сайте</a>'
                            send_message(message.from_user.id, ans, kbd)
                        else:
                            ans = 'Скорее всего, Вы выглядите как-то так...'
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.send_photo(
                                message.from_user.id,
                                open('/home/user/bot/img/student.jpg', 'rb'))
                            ans = '\nВы молоды и энергичны. Не стоит понапрасну терять время - оплачивайте покупки без отрыва от вашей насыщенной жизни прямо сейчас'
                            send_message(message.from_user.id, ans, kbd)
                    elif cmenu == 'amount':
                        self.amount = round(
                            decimal.Decimal(message.text.replace(',', '.')), 2)
                        amount_ = self.amount
                        amount_ = round(
                            decimal.Decimal(message.text.replace(',', '.')), 2)
                        total_amount = str(amount_ * decimal.Decimal('1.005'))
                        print(total_amount)
                        if total_amount[total_amount.index('.') +
                                        2] == '5' or total_amount[
                                            total_amount.index('.') +
                                            2] == '0':
                            if int(total_amount[total_amount.index('.') +
                                                3]) > 4:
                                amount_ = float(total_amount[:(
                                    total_amount.index('.') + 3)]) + 0.01
                                print(1)
                            else:
                                amount_ = float(
                                    total_amount[:(total_amount.index('.') +
                                                   3)])
                                print(0)
                        else:
                            amount_ = round(decimal.Decimal(total_amount), 2)
                            print(2)
                        ans = 'Сумма к оплате с учетом комиссии:' + str(
                            amount_) + '\nПереводим?'
                        kbd = yn_kbd
                        send_message(message.from_user.id, ans, kbd)
                        self.q.append('send')
                    elif cmenu == 'send':
                        if message.text.lower() == 'да':
                            # print('to_number = ', to_number)
                            ans = pay(message, self.to_number, self.amount,
                                      con)
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                        else:
                            ans = 'Очень жаль, что Вы не хотите =('
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
예제 #27
0
class WalletTestSuite(unittest.TestCase):
    def setUp(self):
        super(WalletTestSuite, self).setUp()
        self.api = Wallet(ACCESS_TOKEN)

    def assert_auth_header_present(self):
        pass

    def testAccountInfo(self):
        self.api.account_info()
        self.assert_auth_header_present()

    def testGetAuxToken(self):
        response = self.api.get_aux_token(
            ["account-info", "operation-history"])

        self.assertIn('aux_token', response)

    def testOperationHistory(self):
        options = {"records": 3}
        self.api.operation_history(options)

    def testOperationDetails(self):
        self.api.operation_details("some-invalid-id")

    def testRequestPayment(self):
        options = {
            "pattern_id": "p2p",
            "to": "410011161616877",
            "amount_due": "0.02",
            "comment": "test payment comment from yandex-money-python",
            "message": "test payment message from yandex-money-python",
            "label": "testPayment",
            "test_payment": True,
            "test_result": "success"
        }

        response = self.api.request_payment(options)
        self.assertEqual(response['status'], 'success')

    def testResponsePayment(self):
        options = {
            "request_id": "test-p2p",
            "test_payment": True,
            "test_result": "success"
        }

        response = self.api.process_payment(options)
        self.assertEqual(response['status'], 'success')

    def testIncomingTransferAccept(self):
        operation_id = "some id"
        protection_code = "some code"  # TODO: test when it's None

        response = self.api.incoming_transfer_accept(
            operation_id=operation_id, protection_code=protection_code)
        self.assertEqual(response['status'], "refused")

    def testIncomingTransferReject(self):
        operation_id = "some operatoin id"
        self.api.incoming_transfer_reject(operation_id=operation_id, )

    def testObtainTokenUrl(self):
        Wallet.build_obtain_token_url("client-id", "http://localhost/redirect",
                                      ["account-info", "operation_history"])
        # TODO: check url

    def testGetAccessToken(self):
        options = {
            "code": "code",
            "client_id": "client_id",
            "grant_type": "authorization_code",
            "redirect_uri": "redirect_uri",
            "client_secret": "client_secret"
        }
        response = Wallet.get_access_token(
            code=options["code"],
            client_id=options["client_id"],
            redirect_uri=options["redirect_uri"],
            client_secret=options["client_secret"])
        self.assertEqual(response['error'], 'unauthorized_client')
예제 #28
0
 def do_GET(self):
     #DB connection
     con = sqlite3.connect('/home/user/bot/users.sqlite')
     cur = con.cursor()
     p = urlparse(self.path)
     q = parse_qs(p.query)
     self.send_response(302, 'Found')
     if 'cid' in q:
         scope = [
             'account-info', 'operation-history', 'payment-p2p'
         ]
         auth_url = Wallet.build_obtain_token_url(
             config.client_id, config.redirect_uri, scope)
         self.send_header('Location', auth_url)
         if 'b' in q:
             self.send_header("Set-Cookie",
                              "cid=" + q['cid'][0] + '&b=1')
         else:
             self.send_header(
                 "Set-Cookie", "cid=" + q['cid'][0] + '&to=' +
                 q['to'][0] + '&amount=' + q['amount'][0])
     elif 'code' in q:
         access_token = Wallet.get_access_token(config.client_id,
                                                q['code'][0],
                                                config.redirect_uri,
                                                client_secret=None)
         cookie = parse_qs(self.headers.get('Cookie'))
         cid = cookie['cid'][0]
         cur.execute('INSERT INTO users (cid, token) VALUES ("' +
                     str(cid) + '", "' +
                     access_token['access_token'] + '")')
         con.commit()
         wallet = Wallet(access_token['access_token'])
         if 'b' in cookie:
             queue.put({
                 'cid':
                 cid,
                 'b':
                 wallet.account_info()['balance_details']
                 ['available']
             })
         else:
             to = cookie['to'][0]
             amount = cookie['amount'][0]
             request_options = {
                 "pattern_id": "p2p",
                 "to": to,
                 "amount_due": amount,
                 "comment": "переведено через бота",
                 "message": "переведено через бота",
                 "label": "testPayment"
             }
             request_result = wallet.request_payment(
                 request_options)
             # check status
             process_payment = wallet.process_payment({
                 "request_id":
                 request_result['request_id'],
             })
             # check result
             if process_payment['status'] == "success":
                 queue.put({'cid': cid, 'result': '+'})
             else:
                 queue.put({'cid': cid, 'result': '-'})
         self.send_header('Location',
                          'http://telegram.me/GodMoneyBot')
     self.end_headers()
     con.close()
예제 #29
0
 def testObtainTokenUrl(self):
     Wallet.build_obtain_token_url("client-id", "http://localhost/redirect",
                                   ["account-info", "operation_history"])
예제 #30
0
 def setUp(self):
     super(WalletTestSuite, self).setUp()
     self.api = Wallet(ACCESS_TOKEN)
예제 #31
0
from yandex_money.api import Wallet, ExternalPayment

scope = ['account-info', 'operation-history'] # etc..
auth_url = Wallet.build_obtain_token_url(client_id,
    redirect_uri, scope)

access_token = Wallet.get_access_token(client_id, code, redirect_uri,
    client_secret=None)

account_info = api.account_info()
balance = account_info['balance'] # and so on

request_options = {
    "pattern_id": "p2p",
    "to": "410011161616877",
    "amount_due": "0.02",
    "comment": "test payment comment from yandex-money-python",
    "message": "test payment message from yandex-money-python",
    "label": "testPayment",
    "test_payment": true,
    "test_result": "success"
};
request_result = api.request(request_options)
# check status

process_payment = api.process({
    "request_id": request_result['request_id'],
})
# check result
if process_payment['status'] == "success":
    # show success page
예제 #32
0
    def check_status(history_id):
        log = logging.getLogger('payment')

        history = PaymentHistory.query.get(history_id)
        if not history:
            message = 'Check: Not found history, history_id=%s' % history_id
            log.error(message)
            return message

        wallet = PaymentWallet.query.get(history.wallet_id)
        if not wallet:
            message = 'Check: Not found wallet, wallet_id=%s' % wallet.id
            log.error(message)
            return message

        card = PaymentCard.get_payment_card(history.wallet_id)
        if not card:
            PaymentTask.set_fail(history.report_id, wallet)
            message = 'Payment: Not found card, for history_id=%s' % history.id
            log.error(message)
            return False

        try:
            request_options = dict(
                request_id=history.request_id,
                ext_auth_success_uri=YandexMoneyConfig.SUCCESS_URI,
                ext_auth_fail_uri=YandexMoneyConfig.FAIL_URI,
            )
            if card.system == PaymentCard.SYSTEM_MPS:
                request_options['money_source_token'] = card.token
                ym = ExternalPayment(YandexMoneyConfig.INSTANCE_ID)
                result = ym.process(request_options)
            elif card.system == PaymentCard.SYSTEM_YANDEX:
                ym = Wallet(card.token)
                result = ym.process_payment(request_options)
            else:
                return False
        except Exception as e:
            log.error(e)
            return False
        else:
            if not result or 'status' not in result:
                PaymentTask.set_fail(history.report_id, wallet)
                history.delete()
                message = 'Check: Fail, report_id=%s, request_id=%s' % \
                    (history.report_id, history.request_id)
                log.error(message)
                log.error(result)
                return message

            if result['status'] in ('refused', 'ext_auth_required'):
                PaymentTask.set_fail(history.report_id, wallet)
                history.delete()
                message = 'Check: Fail, report_id=%s, request_id=%s' % \
                    (history.report_id, history.request_id)
                log.error(message)
                log.error(result)
                return message

            if result['status'] == 'in_progress':
                history.status = PaymentHistory.STATUS_IN_PROGRESS
                history.save()

            elif result['status'] == 'success':
                if not 'invoice_id' in result:
                    message = 'Check: Fail, not found invoice_id, history_id=%s' % history_id
                    log.error(message)
                    log.error(result)
                    return message

                history.invoice_id = result['invoice_id']
                history.status = PaymentHistory.STATUS_COMPLETE
                history.save()

                PaymentTask.set_success(history.report_id, wallet)

                report = Report.query.get(history.report_id)
                report.status = Report.STATUS_COMPLETE
                report.save()

            return True
예제 #33
0
    def background_payment(report_id):
        """Проводим фоновый платеж"""
        log = logging.getLogger('payment')

        report = Report.query.get(report_id)
        if not report:
            message = 'Payment: Not found report with id %s' % report_id
            log.error(message)
            return message

        if report.is_payment_busy():
            return False

        wallet = PaymentWallet.get_by_payment_id(report.payment_id)
        if not wallet:
            message = 'Payment: Not found wallet with pid %s' % report.payment_id
            log.error(message)
            return message
        
        PaymentHistory.remove_braked(report.id)
        history = PaymentHistory.query.filter_by(report_id=report.id).first()
        if history:
            return False

        history = PaymentHistory().from_report(report, wallet)
        if not history:
            message = 'Payment: Fail in history add, report_id=%s' % report_id
            log.error(message)
            return message

        card = PaymentCard.get_payment_card(wallet.id)
        if not card:
            PaymentTask.set_fail(report_id, wallet)
            history.delete()
            message = 'Payment: Not found card, for wallet_id=%s' % wallet.id
            log.error(message)
            return False

        term = Term.query.get(report.term_id)
        if not term:
            log.error('Payment: Not found term %s' % report.term_id)

        firm = Firm.query.get(report.term_firm_id)
        if not firm:
            log.error(
                'Payment: Not found firm, with term %s' % report.term_id)

        request_options = {
            "pattern_id": firm.pattern_id,
            "sum": float(report.amount) / int(Term.DEFAULT_FACTOR),
            "customerNumber": history.id,
        }

        try:
            if card.system == PaymentCard.SYSTEM_MPS:
                history.system = PaymentHistory.SYSTEM_MPS
                ym = ExternalPayment(YandexMoneyConfig.INSTANCE_ID)
                payment = ym.request(request_options)
            elif card.system == PaymentCard.SYSTEM_YANDEX:
                history.system = PaymentHistory.SYSTEM_YANDEX
                ym = Wallet(card.token)
                payment = ym.request_payment(request_options)
            else:
                return False
        except Exception as e:
            log.error(e)
            return False
        else:
            if not payment or 'request_id' not in payment:
                PaymentTask.set_fail(report_id, wallet)
                message = 'Payment: Fail in request payment, report_id %s, request %s' % (
                    report_id, payment)
                log.error(message)
                history.delete()
                return message

            history.request_id = payment['request_id']
            history.save()
            return True
예제 #34
0
파일: bot.py 프로젝트: EremeykinS/bot
        def handle_text(message):
            #DB connection
            con = sqlite3.connect('/home/user/bot/users.sqlite')
            txt = message.text
            print('Получено сообщение: \'', txt, '\' от пользователя ', message.from_user.first_name, '(', message.from_user.id, ')')
            # if menu stack is empty:
            kbd = main_kbd
            if txt == '.':
                self.q = []
                send_message(message.from_user.id, 'Выберите действие', main_kbd)
                return
            if not self.q:
                if txt == '\U0001F4B8 Перевод денег':
                    ans = 'Введите номер кошелька или номер телефона или e-mail получателя'
                    kbd = telebot.types.ReplyKeyboardHide(selective=False)
                    send_message(message.from_user.id, ans, kbd)
                    self.q.append('to_number')
                elif txt == '\U00002139 Информация':
                    ans = 'О чем Вы хотите узнать?'
                    send_message(message.from_user.id, ans, info_kbd)
                elif txt == '\U0001F4CB Услуги':
                    ans = 'Пожалуйста, выберите услугу'
                    kbd = ser_kbd
                    send_message(message.from_user.id, ans, kbd)
                elif txt == '\U0001F4E2 Почему Яндекс.Деньги?':
                    ans = 'Пройдите наш мини-опрос и узнайте, чем может быть полезен сервис Яндекс.Деньги именно Вам\n\nЧасто ли у Вас возникает чувство, что Вы забыли заплатить за интернет или телефон?'
                    kbd = yn_kbd
                    send_message(message.from_user.id, ans, kbd)
                    self.q.append('q1')
                elif txt == '\U0001F694 Проверка штрафов ГИБДД':
                    ans = 'Введите номер водительского удостоверения'
                    kbd = telebot.types.ReplyKeyboardHide(selective=False)
                    self.q.append('check_penalty')
                    send_message(message.from_user.id, ans, kbd)

                elif txt == '\U0001F6CD Акции партнеров':
                    title_path = '/html/body/div[2]/div[2]/div/div[<i>]/div[<j>]/div/div[1]'
                    img_path = '/html/body/div[2]/div[2]/div/div[<i>]/div[<j>]/a/div/img'
                    url_path = '/html/body/div[2]/div[2]/div/div[<i>]/div[<j>]/a'
                    promo_titles = []
                    promo_img = []
                    promo_url = []
                    r = requests.get('https://money.yandex.ru/promo')
                    for j in range(1,2+1):
                        for i in range(1,3+1):
                            ht = lxml.html.fromstring(r.text)
                            l = ht.xpath(title_path.replace('<i>', str(i)).replace('<j>', str(j)))
                            p = ht.xpath(img_path.replace('<i>', str(i)).replace('<j>', str(j)))
                            url = ht.xpath(url_path.replace('<i>', str(i)).replace('<j>', str(j)))
                            promo_url.append(url[0].values()[4])
                            if promo_url[-1].startswith('http'):
                                ans = l[0].text.replace('\xa0', ' ') + '\n' + url[0].values()[4]
                            else:
                                ans = l[0].text.replace('\xa0', ' ') + '\nhttp://money.yandex.ru' + url[0].values()[4]
                            send_message(message.from_user.id, ans, kbd)
                elif txt == '\U0001F916 Информация о боте':
                    ans = """Я умею:
<b>Переводить деньги</b> на кошельки
Укажите кошелек,телефон или email. Можете отправить контакт из адресной книжки и мы переведем деньги на кошелек по этому номеру.
<b>Узнавать штрафы ГИБДД</b>
Нужен только номер водительского удотоверения
Сообщать об <b>акциях и предложениях</b> в Яндекс.Деньгах
Покажу весь список со ссылками
Узнавать ваш <b>баланс</b> и рассказывать про <b>курс валют</b>
Только актуальные данные!
А еще Вы можете пройти <b>опрос</b> и узнать о выгодах от использования лично для Вас.
\n
Полезные команды:
чтобы перейти в главное меню введите точку '.'
/help информация о боте
/start начало работы
"""
                    kbd = main_kbd
                    send_message(message.from_user.id, ans, kbd)
                elif txt == '\U0001F4B1 Курсы валют':
                    ans = '\U0001F4C5 Данные актуальны на 13.03.2016 ' + str(datetime.datetime.now().time())[:8] + '\n\U0001F4B5 Доллар США\n70,3067 RUB\n\U0001F4B6 Евро\n77.9700 RUB'
                    cur = con.cursor()
                    cur.execute('SELECT token FROM `users` WHERE cid=' + str(message.from_user.id))
                    con.commit()
                    sql_result = cur.fetchall()
                    if sql_result:
                        token = sql_result[0][0]
                        wallet = Wallet(token)
                        b = wallet.account_info()['balance_details']['available']
                        ans += '\nНа имеющиеся на вашем счете ' + str(b) + ' руб. Вы можете купить:\n· ' + str(round(b/70.3067, 2)) + ' долларов США\n· ' + str(round(b/77.97, 2)) + ' евро'
                    send_message(message.from_user.id, ans, info_kbd)
                elif txt == 'Меню':
                    self.q = []
                    send_message(message.from_user.id, 'Выберите действие', main_kbd)
                elif txt == '\U0001F4B0 Информация о балансе':
                    ai = str(account_info(message, con))
                    print('ai = ', ai)
                    print('ai.startswith(\'http\')', ai.startswith('http'))
                    if ai.startswith('Для'):
                        ans = ai
                    else:
                        ans = 'Баланс: ' + ai + ' руб.'
                    kbd = info_kbd
                    send_message(message.from_user.id, ans, kbd)
                else:
                    ans = 'Я не понял, попробуйте что-нибудь другое'
                    send_message(message.from_user.id, ans, kbd)
            else:
                if self.q:
                    cmenu = self.q.pop()
                    if cmenu == 'check_penalty':
                        ans = check_penalty(message)
                        send_message(message.from_user.id, ans, kbd)
                    elif cmenu == 'to_number':
                        self.to_number = message.text
                        ans = 'Введите сумму к получению в рублях'
                        kbd = amount_kbd
                        send_message(message.from_user.id, ans, kbd)
                        self.q.append('amount')
                    elif cmenu == 'q1':
                        if message.text == 'да':
                            ans = 'Вы оплачиваете ЖКУ сами лично?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q2')
                        else:
                            ans = 'У Вас есть свой веб-сайт?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q3')
                    elif cmenu == 'q3':
                        if message.text == 'да':
                            ans = 'Скорее всего, Вы выглядите как-то так...'
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.send_photo(message.from_user.id, open('/home/user/bot/img/bm.jpg','rb'))
                            ans = '\nВы можете принимать платежи на вашем сайте через <a href="https://kassa.yandex.ru/">Яндекс.Кассу</a>'
                            send_message(message.from_user.id, ans, kbd)
                        else:
                            ans = 'Вы оплачиваете ЖКУ сами лично?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q2')
                    elif cmenu == 'q2':
                        if message.text == 'да':
                            ans = 'У Вас есть карта "Тройка"?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q4')
                        else:
                            ans = 'У Вас мало времени на досуг?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q5')
                    elif cmenu == 'q5':
                        if message.text == 'да':
                            ans = 'Скорее всего, Вы выглядите как-то так...'
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.send_photo(message.from_user.id, open('/home/user/bot/img/work.jpg','rb'))
                            ans = '\nМы понимаем, что у Вас не хватает времени на себя. Именно поэтому, чтобы помочь вам выкроить немного свободного времени, предлагаем удобно оплачивать штрафы ГИБДД, билеты в театр и прочие заказы в несколько кликов'
                            send_message(message.from_user.id, ans, kbd)
                        else:
                            ans = 'Вы когда-либо покупали технику в инетрнет-магазине?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q8')
                    elif cmenu == 'q4':
                        if message.text == 'да':
                            ans = 'Вы когда-либо покупали одежду в интернет-магазине?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q7')
                        else:
                            ans = 'У Вас есть личное авто?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q6')
                    elif cmenu == 'q6':
                        if message.text == 'да':
                            ans = 'У Вас мало времени на досуг?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q5')
                        else:
                            ans = 'Вы когда-либо покупали одежду в интернет-магазине?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q7')
                    elif cmenu == 'q7' or cmenu == 'q5':
                        if message.text == 'нет':
                            ans = 'Вы когда-либо покупали технику в интернет-магазине?'
                            kbd = yn_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.q.append('q8')
                    elif cmenu == 'q8':
                        if message.text == 'да':
                            ans = 'Скорее всего, Вы выглядите как-то так...'
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.send_photo(message.from_user.id, open('/home/user/bot/img/student.jpg','rb'))
                            ans = '\nВы молоды и энергичны. Не стоит понапрасну терять время - оплачивайте покупки без отрыва от вашей насыщенной жизни прямо сейчас'
                            send_message(message.from_user.id, ans, kbd)
                        else:
                            ans = 'Скорее всего, Вы выглядите как-то так...'
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.send_photo(message.from_user.id, open('/home/user/bot/img/hw.jpg','rb'))
                            ans = '\nВы явно заботитесь о домашнем очаге. Чтобы принести в дом еще больше уюта, платите легко и узнавайте скидки на <ahref="https://money.yandex.ru/promo/">сайте</a>' 
                            send_message(message.from_user.id, ans, kbd)
                    elif cmenu == 'q7':
                        if message.text == 'нет':
                            ans = 'Скорее всего, Вы выглядите как-то так...'
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.send_photo(message.from_user.id, open('/home/user/bot/img/hw.jpg','rb'))
                            ans = '\nВы явно заботитесь о домашнем очаге. Чтобы принести в дом еще больше уюта, платите легко и узнавайте скидки на <a href="https://money.yandex.ru/promo/">сайте</a>'
                            send_message(message.from_user.id, ans, kbd)
                        else:
                            ans = 'Скорее всего, Вы выглядите как-то так...'
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                            self.send_photo(message.from_user.id, open('/home/user/bot/img/student.jpg','rb'))
                            ans  = '\nВы молоды и энергичны. Не стоит понапрасну терять время - оплачивайте покупки без отрыва от вашей насыщенной жизни прямо сейчас' 
                            send_message(message.from_user.id, ans, kbd)
                    elif cmenu == 'amount':
                        self.amount = round(decimal.Decimal(message.text.replace(',','.')), 2)
                        amount_ = self.amount
                        amount_ = round(decimal.Decimal(message.text.replace(',','.')), 2)
                        total_amount = str(amount_ * decimal.Decimal('1.005'))
                        print(total_amount)
                        if total_amount[total_amount.index('.') + 2] == '5' or total_amount[total_amount.index('.') + 2] == '0':
                            if int(total_amount[total_amount.index('.') + 3]) > 4:
                                amount_ = float(total_amount[:(total_amount.index('.') + 3)]) + 0.01
                                print(1)
                            else:
                                 amount_ = float(total_amount[:(total_amount.index('.') + 3)])
                                 print(0)
                        else:
                            amount_ = round(decimal.Decimal(total_amount), 2)
                            print(2)
                        ans = 'Сумма к оплате с учетом комиссии:' + str(amount_) + '\nПереводим?'
                        kbd = yn_kbd
                        send_message(message.from_user.id, ans, kbd)
                        self.q.append('send')
                    elif cmenu == 'send':
                        if message.text.lower() == 'да':
                            # print('to_number = ', to_number)
                            ans = pay(message, self.to_number, self.amount, con)
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
                        else:
                            ans = 'Очень жаль, что Вы не хотите =('
                            kbd = main_kbd
                            send_message(message.from_user.id, ans, kbd)
 def setUp(self):
     super(WalletTestSuite, self).setUp()
     self.api = Wallet("TEST TOKEN")
 def setUp(self):
     self.api = Wallet("TEST TOKEN")
class WalletTestSuite(ResponseMockTestCase):
    def setUp(self):
        super(WalletTestSuite, self).setUp()
        self.api = Wallet("TEST TOKEN")

    def assert_auth_header_present(self):
        self.assertEqual("Bearer TEST TOKEN",
                      responses.calls[0].request.headers['Authorization'],
                      )

    def testAccountInfo(self):
        self.addResponse("account-info",
            {"status": "success"}
        )
        response = self.api.account_info()
        self.assertEqual(response['status'], "success")

        self.assert_auth_header_present()

    def testGetAuxToken(self):
        token = "some_aux_token"

        self.addResponse("token-aux", {"aux_token": token})

        response = self.api.get_aux_token(["account-info", "operation-history"])

        self.assertEqual(response['aux_token'], token)
        self.assertEqual(responses.calls[0].request.body,
                "scope=account-info+operation-history")

    def testOperationHistory(self):
        options = {"foo": "bar", "foo2": "bar2"}

        self.addResponse("operation-history", [])

        response = self.api.operation_history(options)
        self.assertEqual(response, [])
        self.assertEqual(responses.calls[0].request.body,
                urlencode(options)
        )

    def testRequestPayment(self):
        self.addResponse("request-payment", {"status": "success"})
        options = {
            "foo": "bar",
            "foo2": "bar2",
        }

        response = self.api.request_payment(options)
        self.assertEqual(response, {"status": "success"})
        self.assertEqual(responses.calls[0].request.body,
                urlencode(options)
        )

    def testResponsePayment(self):
        self.addResponse("process-payment", {"status": "success"})
        options = {
            "foo": "bar",
            "foo2": "bar2",
        }

        response = self.api.process_payment(options)
        self.assertEqual(response, {"status": "success"})
        self.assertEqual(responses.calls[0].request.body,
                urlencode(options)
        )

    def testIncomingTransferAccept(self):
        self.addResponse("incoming-transfer-accept", {"status": "success"})
        options = {
            "foo": "bar",
            "foo2": "bar2",
        }
        operation_id = "some id"
        protection_code = "some code" # TODO: test when it's None

        response = self.api.incoming_transfer_accept(
            operation_id=operation_id,
            protection_code=protection_code
        )
        self.assertEqual(response, {"status": "success"})
        self.assertEqual(
            responses.calls[0].request.body,
            urlencode({
                "operation_id": operation_id,
                "protection_code": protection_code 
            })
        )

    def testIncomingTransferReject(self):
        self.addResponse("incoming-transfer-reject", {"status": "success"})
        operation_id = "some id"
        response = self.api.incoming_transfer_reject(
            operation_id=operation_id,
        )
        self.assertEqual(response, {"status": "success"})
        self.assertEqual(
            responses.calls[0].request.body,
            urlencode({
                "operation_id": operation_id,
            })
        )
    def testObtainTokenUrl(self):
        client_id = "client-id"
        url = Wallet.build_obtain_token_url(
            "client-id",
            "http://localhost/redirect",
            ["account-info", "operation_history"]
        )
        # TODO: check url

    def testGetAccessToken(self):
        self.addResponse(Wallet.SP_MONEY_URL + "/oauth/token",
                         {"status": "success"},
                         is_api_url=False
                         )
        options = {
            "code": "code",
            "client_id": "client_id",
            "grant_type": "authorization_code",
            "redirect_uri": "redirect_uri",
            "client_secret": "client_secret" 
            }
        response = Wallet.get_access_token(
            code=options["code"],
            client_id=options["client_id"],
            redirect_uri=options["redirect_uri"],
            client_secret=options["client_secret"]
        )
        self.assertEqual(response, {"status": "success"})
        self.assertEqual(
            responses.calls[0].request.body,
            urlencode(options)
        )

    def testRevokeToken(self):
        self.addResponse("revoke", {"status": "success"})
        Wallet.revoke_token("TEST TOKEN")
        self.assert_auth_header_present()