def get_ym_params(self, amount, pattern, order_id, success_uri, fail_uri, type=PAYMENT_BY_CARD):
        """Запрос параметров от ym"""

        request_options = {
            "pattern_id": pattern,
            "sum": amount,
            "customerNumber": order_id,
        }

        if type == PaymentCard.PAYMENT_BY_CARD:
            ym = ExternalPayment(YandexMoneyConfig.INSTANCE_ID)
            payment = ym.request(request_options)
        elif type == PaymentCard.PAYMENT_BY_YM:
            return False
        else:
            return False

        if payment['status'] == "success":
            request_id = payment['request_id']
        else:
            return False

        process_options = {
            "request_id": request_id,
            'ext_auth_success_uri': success_uri,
            'ext_auth_fail_uri': fail_uri
        }
        result = ym.process(process_options)

        return dict(
            url=result['acs_uri'],
            params=result['acs_params']
        )
    def makeRequest(self):
        instance_id = ExternalPayment.get_instance_id(CLIENT_ID)['instance_id']

        api = ExternalPayment(instance_id)
        options = {
            "instance_id": instance_id,
            "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"
        }
        return api.request(options), api
 def setUp(self):
     self.api = ExternalPayment(self.client_id)
     responses.add_callback(
         responses.POST, re.compile('https?://.*/api/instance-id'),
         callback=self.request_callback,
         content_type='application/json',
     )
    def makeRequest(self):
        instance_id = ExternalPayment.get_instance_id(CLIENT_ID)['instance_id']

        api = ExternalPayment(instance_id)
        options = {
            "instance_id": instance_id,
            "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"
        }
        return api.request(options), api
Example #5
0
def get_yandex_instance_id_key(yandex_client_id):
    yandex_instance_id_key = os.environ.get('YANDEX_MONEY_INSTANCE_ID_KEY', None)

    if yandex_instance_id_key is None:
        response_payment_instance = ExternalPayment.get_instance_id(yandex_client_id)
        yandex_instance_id_key = response_payment_instance['instance_id']
        os.environ['YANDEX_MONEY_INSTANCE_ID_KEY'] = yandex_instance_id_key

    return yandex_instance_id_key
Example #6
0
def process_external_payment(instance_id, request_id, auth_success_uri, auth_fail_uri):
    logger.debug('Processing exteranl payment')
    external_payment = ExternalPayment(instance_id)
    process_options = {
        "request_id": request_id,
        'instance_id': instance_id,
        'ext_auth_success_uri': auth_success_uri,
        'ext_auth_fail_uri': auth_fail_uri
    }
    response = external_payment.process(process_options)
    logger.debug('Response from external_payment.process : {0}'.format(response))
    if response['status'] == 'ext_auth_required':
        acs_uri = response['acs_uri']
        acs_params = response['acs_params']
        return response['status'], '{0}?{1}'.format(acs_uri, urllib.parse.urlencode(acs_params))

    return response['status'], None
        
Example #7
0
def request_external_payment(instance_id, amount, wallet):
    logger.debug('Requesting exteranl payment')
    external_payment = ExternalPayment(instance_id)

    payment_options = {
        'pattern_id': 'p2p',
        'instance_id': instance_id,
        'to': wallet,
        'amount': amount,
        'message': 'Оплата бота'
    }
    request_id = None
    response = external_payment.request(payment_options)
    logger.debug('Reposnse from external_payment.request : {0}'.format(response))
    if response['status'] == "success":
        request_id = response['request_id']
    else:
        logger.error('Failed to get request_id. Reason: {0}'.format(response))
    return request_id
    def get_ym_params(self,
                      amount,
                      pattern,
                      order_id,
                      success_uri,
                      fail_uri,
                      type=PAYMENT_BY_CARD):
        """Запрос параметров от ym"""

        request_options = {
            "pattern_id": pattern,
            "sum": amount,
            "customerNumber": order_id,
        }

        if type == PaymentCard.PAYMENT_BY_CARD:
            ym = ExternalPayment(YandexMoneyConfig.INSTANCE_ID)
            payment = ym.request(request_options)
        elif type == PaymentCard.PAYMENT_BY_YM:
            return False
        else:
            return False

        if payment['status'] == "success":
            request_id = payment['request_id']
        else:
            return False

        process_options = {
            "request_id": request_id,
            'ext_auth_success_uri': success_uri,
            'ext_auth_fail_uri': fail_uri
        }
        result = ym.process(process_options)

        return dict(url=result['acs_uri'], params=result['acs_params'])
Example #9
0
def check_status(yandex_client_id, yandex_instance_id_key, payment_request_id,
                 yandex_auth_success_uri, yandex_auth_fail_uri):

    external_payment = ExternalPayment(yandex_instance_id_key)

    response_external_payment_process = methods.external_payment_process(
        external_payment,
        payment_request_id,
        yandex_auth_success_uri,
        yandex_auth_fail_uri,
        yandex_client_id,
        request_token=False)
    if response_external_payment_process["key"] is "status":
        return response_external_payment_process
    else:
        return
Example #10
0
def pay(amount, yandex_access):
    # определяем необходимые переменные для работы с yandex-money
    yandex_wallet = yandex_access['yandex_wallet']
    yandex_client_id = yandex_access['yandex_client_id']
    yandex_auth_success_uri = yandex_access['yandex_auth_success_uri']
    yandex_auth_fail_uri = yandex_access['yandex_auth_fail_uri']
    yandex_instance_id_key = methods.get_yandex_instance_id_key(
        yandex_client_id)

    # создаем обьект платежного клиента
    try:
        external_payment = ExternalPayment(yandex_instance_id_key)
    except:
        return

    try:
        payment_request_id = methods.external_payment_request(
            external_payment,
            yandex_instance_id_key,
            yandex_wallet,
            amount,
            message=None)
    except:
        return
    if payment_request_id is None:
        return

    try:
        response_external_payment_process = methods.external_payment_process(
            external_payment,
            payment_request_id,
            yandex_auth_success_uri,
            yandex_auth_fail_uri,
            yandex_client_id,
            request_token=False)
    except:
        return
    if response_external_payment_process["key"] is not "access_pay":
        return
    redirect_url_for_access_pay = response_external_payment_process["value"]

    return redirect_url_for_access_pay, payment_request_id, yandex_instance_id_key
Example #11
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
class TestExternalPayment(unittest.TestCase):
    client_id = '1'

    @classmethod
    def request_callback(cls, request):
        payload = dict(parse_qsl(request.body))
        success = payload['client_id'] == cls.client_id
        resp_body = {'status': 'success' if success else 'refused'}
        if success:
            resp_body['instance_id'] = '123'
        else:
            resp_body['error'] = 'illegal_param_client_id'
        return 200, {}, json.dumps(resp_body)

    def setUp(self):
        self.api = ExternalPayment(self.client_id)
        responses.add_callback(
            responses.POST, re.compile('https?://.*/api/instance-id'),
            callback=self.request_callback,
            content_type='application/json',
        )

    @responses.activate
    def test_invalid_client_id(self):
        api = ExternalPayment(client_id=self.client_id+'some_data')

        with self.assertRaises(exceptions.YandexPaymentError) as context:
            api.instance_id
        self.assertEqual(exceptions._errors['illegal_param_client_id'].encode('utf-8'), str(context.exception))
        self.assertEqual(len(responses.calls), 1)

    @responses.activate
    def test_instance_id(self):
        self.assertEqual(self.api.instance_id, '123')
        self.assertEqual(len(responses.calls), 1)

        api2 = ExternalPayment(client_id=self.client_id)

        self.assertEqual(api2.instance_id, '123')
        self.assertEqual(len(responses.calls), 1)

    @responses.activate
    def test_request(self):
        def callback(request):
            payload = dict(parse_qsl(request.body))
            success = all(i in payload for i in ['amount', 'to', 'message', 'instance_id'])
            if success:
                return 200, {}, json.dumps({'status': 'success', 'request_id': 1, 'contract_amount': payload['amount']})
            return 200, {}, json.dumps({'status': 'refused', 'error': 'illegal_params'})

        responses.add_callback(
            responses.POST, re.compile('https?://.*/api/request-external-payment'),
            callback=callback,
            content_type='application/json',
        )

        resp = self.api.request({'amount': 100, 'to': 'test', 'message': 'message'})
        self.assertEqual(resp.request_id, 1)
        self.assertEqual(int(resp.contract_amount), 100)

        with self.assertRaises(exceptions.YandexPaymentError) as context:
            resp = self.api.request({'message': 'message'})

        self.assertEqual(exceptions._errors['illegal_params'].encode('utf-8'), str(context.exception))
        self.assertEqual(len(responses.calls), 3)

    @responses.activate
    def test_process(self):
        def callback(request):
            payload = dict(parse_qsl(request.body))
            success = True
            if payload['request_id'] != 1:
                success = False
            success = all(i in payload for i in ['ext_auth_success_uri', 'ext_auth_fail_uri',
                                                 'request_token', 'instance_id'])
            if success:
                return 200, {}, json.dumps({'status': 'success', 'invoice_id': '0'})
            return 200, {}, json.dumps({'status': 'refused', 'error': 'illegal_params'})

        responses.add_callback(
            responses.POST, re.compile('https?://.*/api/process-external-payment'),
            callback=callback,
            content_type='application/json',
        )

        resp = self.api.process({'request_id': 1,
                                 'ext_auth_success_uri': 'test',
                                 'ext_auth_fail_uri': 'test_fail',
                                 'request_token': 'request_token',
                                 'instance_id': '123',
                                 })
        self.assertEqual(resp.status, 'success')
        self.assertEqual(resp.invoice_id, '0')

        self.assertEqual(len(responses.calls), 2)

    def tearDown(self):
        self.api.zero_cache()
 def testGetInstanceId(self):
     response = ExternalPayment.get_instance_id(CLIENT_ID)
     self.assertEqual(response['status'], "success")
 def testGetInstanceId(self):
     response = ExternalPayment.get_instance_id(CLIENT_ID)
     self.assertEqual(response['status'], "success")
Example #15
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
Example #16
0
sHandler.setFormatter(logging.Formatter(FORMAT))

from app.configuration import ProductionConfig, DevelopmentConfig, Config

#!PRODUCTION CONFIGURATION
if os.environ.get('PRODUCTION'):
    app.config.from_object(ProductionConfig())
    sHandler.setLevel(logging.INFO)
    root.addHandler(sHandler)

#! DEBUG CONFIGURATION
else:
    app.config.from_object(DevelopmentConfig())
    sHandler.setLevel(logging.DEBUG)
    root.addHandler(sHandler)

INSTANCE_ID = None
response = ExternalPayment.get_instance_id(app.config['CLIENT_ID'])
if response['status'] == "success":
    INSTANCE_ID = response['instance_id']
else:
    raise Exception('Failed to get instance_id. Reason: {0}'.format(response['error']))    

db = SQLAlchemy(app)
db_session = db.session

from app.models import *
migrate = Migrate(app, db)

from app.views import *
Example #17
0
from yandex_money.api import Wallet, ExternalPayment

client_id = '6D3FD82502F95CC490D4297F871AB2B934597432FE48B681025011F50C079'

response = ExternalPayment.get_instance_id(client_id)
if reponse.status == "success":
    instance_id = response.instance_id;
else:
    # throw exception with reponse->error message

# make instance
external_payment = ExternalPayment(instance_id);

payment_options = {
    # pattern_id, etc..
}
response = external_payment.request(payment_options)
if response.status == "success":
    request_id = response.request_id
else:
    # throw exception with response->message

process_options = {
    "request_id": request_id
    # other params..
}
result = external_payment.process(process_options)
# process result according to docs