Exemple #1
0
 def validate_transaction(self, data: dict) -> Transaction:
     transaction = Transaction()
     transaction.id = data["bill_id"]
     transaction.meta = data
     if data["state"] in ("pay", "request"):
         transaction.validate_status = True
     return transaction
Exemple #2
0
 def validate_transaction(self, data: dict) -> Transaction:
     transaction = Transaction()
     transaction.id = data['token']
     transaction.meta = data
     if 'resultCode' in data and int(data['resultCode']) == 100:
         transaction.validate_status = True
     return transaction
Exemple #3
0
 def validate_transaction(self, data: dict) -> Transaction:
     transaction = Transaction()
     transaction.id = data["token"]
     transaction.meta = data
     if "resultCode" in data and int(data["resultCode"]) == 100:
         transaction.validate_status = True
     return transaction
Exemple #4
0
    def verify_transaction(self, transaction: Transaction, data):
        url = "%s/bills/%s" % (self._server_url, transaction.id)
        headers = {
            "access-token": self.config["access_token"],
            "content-type": "application/json",
        }
        try:
            response = request("get", url, headers=headers)
        except RequestException:
            raise GatewayNetworkError("Cannot connect to bahamta server.")

        if response.status_code != 200:
            raise TransactionError("Invalid transaction information (%s)" %
                                   response.status_code)
        response_data = response.json()

        if response_data["state"] != "pay":
            raise TransactionError("Transaction not paid")

        if int(transaction.amount) != int(response_data["amount"]):
            raise TransactionError("Amount mismatch")

        transaction.pan = response_data["pay_pan"]
        transaction.meta = response_data
        return transaction
Exemple #5
0
    def verify_transaction(self, transaction: Transaction, data):
        if data["id"] == "false":
            raise TransactionError("Invalid transaction ID")

        transaction.pan = data.get("cardNumber")
        print("Transaction verified: \n%s" % transaction.__repr__())
        return transaction
Exemple #6
0
    def verify_transaction(self, transaction: Transaction, data):
        url = "https://pay.ir/pg/verify"
        formdata = {
            "api": "test" if self.testing else self.config["pin"],
            "token": transaction.id,
        }
        try:
            resp = request("post", url, data=formdata)
        except RequestException:
            raise GatewayNetworkError("Cannot connect to payir server")

        try:
            body = resp.json()
        except Exception:
            body = None

        if resp.status_code != 200:
            if not body:
                raise TransactionError(
                    "Invalid transaction information (%s)" % resp.status_code
                )

            raise TransactionError(
                "%s, code: %s" % (body["errorMessage"], body["errorCode"])
            )

        if int(transaction.amount) != int(body["amount"]):
            raise TransactionError("Amount mismatch")

        transaction.pan = body["cardNumber"]
        transaction.amount = int(body["amount"])
        transaction.order_id = body["factorNumber"]
        transaction.meta = body
        return transaction
Exemple #7
0
 def validate_transaction(self, data: dict) -> Transaction:
     transaction = Transaction()
     transaction.id = data['bill_id']
     transaction.meta = data
     if data['state'] in ('pay', 'request'):
         transaction.validate_status = True
     return transaction
Exemple #8
0
    def verify_transaction(self, transaction: Transaction, data):
        url = '%s/bills/%s' % (self._server_url, transaction.id)
        headers = {
            'access-token': self.config['access_token'],
            'content-type': 'application/json'
        }
        try:
            response = request('get', url, headers=headers)
        except RequestException:
            raise GatewayNetworkError('Cannot connect to bahamta server.')

        if response.status_code != 200:
            raise TransactionError(
                'Invalid transaction information (%s)' % response.status_code
            )
        response_data = response.json()

        if response_data['state'] != 'pay':
            raise TransactionError('Transaction not paid')

        if int(transaction.amount) != int(response_data['amount']):
            raise TransactionError('Amount mismatch')

        transaction.pan = response_data['pay_pan']
        transaction.meta = response_data
        return transaction
Exemple #9
0
    def request_transaction(self, transaction: Transaction) -> Transaction:
        data = {
            "payer_number": transaction.meta.get("payer_number"),
            "payer_name": transaction.meta.get("payer_name"),
            "amount": transaction.amount,
            "note": transaction.meta.get("note"),
            "silent": transaction.meta.get("silent"),
        }
        for key in ("payer_name", "payer_number", "note"):
            if data[key] is None:
                raise ValueError("Transaction meta required (%s)" % key)
        url = "%s/bills" % self._server_url
        headers = {
            "access-token": self.config["access_token"],
            "content-type": "application/json",
        }
        try:
            response = request("post", url, json=[data], headers=headers)
        except RequestException:
            raise GatewayNetworkError("Cannot connect to bahamta server.")

        if response.status_code != 200:
            raise TransactionError("Invalid transaction information (%s)" %
                                   response.status_code)
        response_data = response.json()[0]
        transaction.id = response_data["bill_id"]
        transaction.meta = response_data
        return transaction
Exemple #10
0
    def verify_transaction(self, transaction: Transaction, data):
        if data['id'] == 'false':
            raise TransactionError('Invalid transaction ID')

        transaction.pan = data.get('cardNumber')
        print('Transaction verified: \n%s' % transaction.__repr__())
        return transaction
Exemple #11
0
    def test_dummy_gateway(self):
        gateway = DummyGateway(config=self._config)
        transaction = gateway.request_transaction(Transaction(amount=10))
        gateway.get_redirection(transaction)

        valid_transaction = gateway.validate_transaction({
            "id": transaction.id,
            "validateStatus": True
        })
        self.assertEqual(valid_transaction.validate_status, True)

        invalid_transaction = gateway.validate_transaction({
            "id":
            transaction.id,
            "validateStatus":
            False
        })
        self.assertEqual(invalid_transaction.validate_status, False)

        gateway.verify_transaction(transaction, dict(id=transaction.id))

        with self.assertRaises(TransactionError):
            gateway.verify_transaction(transaction, dict(id="false"))

        with self.assertRaises(TransactionError):
            gateway.request_transaction(Transaction(amount=15220))
Exemple #12
0
 def validate_transaction(self, data: dict) -> Transaction:
     transaction = Transaction()
     transaction.id = data['transId']
     transaction.meta = data
     if int(data['status']) == 1:
         transaction.validate_status = True
     return transaction
Exemple #13
0
 def validate_transaction(self, data: dict) -> Transaction:
     transaction = Transaction()
     transaction.id = data['Authority']
     transaction.meta = data
     if data['Status'] == 'OK':
         transaction.validate_status = True
     return transaction
Exemple #14
0
 def validate_transaction(self, data: dict) -> Transaction:
     transaction = Transaction()
     transaction.id = data["RefId"]
     transaction.meta = data
     if int(data["ResCode"]) == 0:
         transaction.validate_status = True
     return transaction
Exemple #15
0
 def validate_transaction(self, data: dict) -> Transaction:
     transaction = Transaction()
     transaction.id = data['Token']
     transaction.meta = data
     if 'status' in data and int(data['status']) == 0:
         transaction.validate_status = True
     return transaction
Exemple #16
0
 def validate_transaction(self, data: dict) -> Transaction:
     transaction = Transaction()
     transaction.id = data["Authority"]
     transaction.meta = data
     if data["Status"] == "OK":
         transaction.validate_status = True
     return transaction
Exemple #17
0
 def validate_transaction(self, data: dict) -> Transaction:
     transaction = Transaction()
     transaction.id = data["Token"]
     transaction.meta = data
     if "status" in data and int(data["status"]) == 0:
         transaction.validate_status = True
     return transaction
Exemple #18
0
    def request_transaction(self, transaction: Transaction) -> Transaction:
        data = {
            'payer_number': transaction.meta.get('payer_number'),
            'payer_name': transaction.meta.get('payer_name'),
            'amount': transaction.amount,
            'note': transaction.meta.get('note'),
            'silent': transaction.meta.get('silent')
        }
        for key in ('payer_name', 'payer_number', 'note'):
            if data[key] is None:
                raise ValueError('Transaction meta required (%s)' % key)
        url = '%s/bills' % self._server_url
        headers = {
            'access-token': self.config['access_token'],
            'content-type': 'application/json'
        }
        try:
            response = request(
                'post', url, json=[data], headers=headers
            )
        except RequestException:
            raise GatewayNetworkError('Cannot connect to bahamta server.')

        if response.status_code != 200:
            raise TransactionError(
                'Invalid transaction information (%s)' % response.status_code
            )
        response_data = response.json()[0]
        transaction.id = response_data['bill_id']
        transaction.meta = response_data
        return transaction
Exemple #19
0
def test_gateway():
    gateway = ParsianGateway(config=config)
    with domock(get_side_effect(returned_token="4444")):
        transaction = gateway.request_transaction(
            Transaction(amount=1000, order_id=1)
        )
        gateway.get_redirection(transaction)

        valid_transaction = gateway.validate_transaction(
            {"Token": "4444", "status": "0"}
        )
        assert valid_transaction.validate_status

        invalid_transaction = gateway.validate_transaction(
            {"Token": "4444", "status": "300"}
        )
        assert not invalid_transaction.validate_status

    # success verification
    with domock(get_side_effect(returned_status=0)):
        gateway.verify_transaction(
            transaction, dict(OrderId="44441", Token="44442")
        )

    # failed verification
    with domock(get_side_effect(returned_status=-100)):
        with pytest.raises(TransactionError):
            gateway.verify_transaction(
                transaction, dict(OrderId="44441", Token="44442")
            )

    # already verified
    with domock(get_side_effect(returned_status=-1533)):
        with pytest.raises(TransactionAlreadyPaidError):
            gateway.verify_transaction(
                transaction, dict(OrderId="44441", Token="44442")
            )

    # network error
    with domock(get_side_effect(raise_zeep_error=True)):
        with pytest.raises(GatewayNetworkError):
            gateway.verify_transaction(
                transaction, dict(OrderId="44441", Token="44442")
            )

    # no token
    with domock(get_side_effect(returned_token=None)):
        with pytest.raises(TransactionError):
            gateway.request_transaction(Transaction(amount=1000, order_id=1))

    # zeep fault
    with domock(get_side_effect(raise_zeep_fault=True)):
        with pytest.raises(TransactionError):
            gateway.request_transaction(Transaction(amount=1000, order_id=1))

    # network error
    with domock(get_side_effect(raise_zeep_error=True)):
        with pytest.raises(GatewayNetworkError):
            gateway.request_transaction(Transaction(amount=1000, order_id=1))
Exemple #20
0
def test_transaction():
    transaction = Transaction(
        amount=1000,
        order_id=1,
        meta=dict(card_number="xyz"),
    )
    transaction_dict = transaction.to_dict()
    assert transaction_dict["amount"] == transaction.amount
Exemple #21
0
 def validate_transaction(self, data: dict) -> Transaction:
     parsed_data = self._parse_callback_data(data)
     transaction = Transaction()
     transaction.id = parsed_data['ref_id']
     transaction.meta = parsed_data
     if int(parsed_data['res_code']) == 0:
         transaction.validate_status = True
     return transaction
Exemple #22
0
    def request_transaction(self, transaction: Transaction) -> Transaction:
        if int(transaction.amount) > self.maximum_amount:
            raise TransactionError('Amount is larger than %s' %
                                   self.maximum_amount)

        transaction.id = int(time.time())
        print('New transaction requested: \n%s' % transaction.__repr__())
        return transaction
Exemple #23
0
def test_gateway():
    gateway = IrankishGateway(config=config)
    with domock(get_side_effect()):
        transaction = gateway.request_transaction(
            Transaction(amount=1000, order_id=1))
        gateway.get_redirection(transaction).to_dict()

        valid_transaction = gateway.validate_transaction({
            "token": "RETURNED_TOKEN",
            "resultCode": "100"
        })
        assert valid_transaction.validate_status

        invalid_transaction = gateway.validate_transaction({
            "token": "RETURNED_TOKEN",
            "resultCode": "300"
        })
        assert not invalid_transaction.validate_status

    # success verification
    with domock(get_side_effect(verify_result=1000)):
        gateway.verify_transaction(transaction, dict())

    # failed transaction
    with domock(get_side_effect()):
        with pytest.raises(TransactionError):
            gateway.verify_transaction(transaction, dict())

    # unknown error
    with domock(get_side_effect(verify_result=-900)):
        with pytest.raises(TransactionError):
            gateway.verify_transaction(transaction, dict())

    # network error
    with domock(get_side_effect(raise_zeep_error=True)):
        with pytest.raises(GatewayNetworkError):
            gateway.request_transaction(Transaction(amount=1000, order_id=1))

        with pytest.raises(GatewayNetworkError):
            gateway.verify_transaction(transaction, dict())

    # already paid
    with domock(get_side_effect(verify_result=-90)):
        with pytest.raises(TransactionAlreadyPaidError):
            gateway.verify_transaction(transaction, dict())

    # no token
    with domock(get_side_effect(returned_token=None)):
        with pytest.raises(TransactionError):
            gateway.request_transaction(Transaction(amount=1000, order_id=1))

    # zeep fault
    with domock(get_side_effect(raise_zeep_fault=True)):
        with pytest.raises(TransactionError):
            gateway.request_transaction(Transaction(amount=1000, order_id=1))
Exemple #24
0
def test_gateway():
    with domock(get_side_effect()):
        gateway = ZarinpalGateway(config=config)
        transaction = gateway.request_transaction(
            Transaction(amount=1000, order_id=1))
        gateway.get_redirection(transaction)

        # validation
        valid_transaction = gateway.validate_transaction({
            "Authority": "RETURNED_TOKEN",
            "Status": "OK"
        })
        assert valid_transaction.validate_status

        invalid_transaction = gateway.validate_transaction({
            "Authority": "RETURNED_TOKEN",
            "Status": "NOK"
        })
        assert not invalid_transaction.validate_status

    # success verification
    with domock(get_side_effect(returned_status=100)):
        gateway.verify_transaction(transaction, dict())

    # verification fails
    with domock(get_side_effect(returned_status=300)):
        with pytest.raises(TransactionError):
            gateway.verify_transaction(transaction, dict())

    # verification already done
    with domock(get_side_effect(returned_status=101)):
        with pytest.raises(TransactionError):
            gateway.verify_transaction(transaction, dict())

    # verification network error
    with domock(get_side_effect(raise_zeep_error=True)):
        with pytest.raises(GatewayNetworkError):
            gateway.verify_transaction(transaction, dict())

    # no token
    with domock(get_side_effect(returned_token=None)):
        with pytest.raises(TransactionError):
            gateway.request_transaction(Transaction(amount=1000, order_id=1))

    # transation error
    with domock(get_side_effect(raise_zeep_fault=True)):
        with pytest.raises(TransactionError):
            gateway.request_transaction(Transaction(amount=1000, order_id=1))

    # gateway error
    with domock(get_side_effect(raise_zeep_error=True)):
        with pytest.raises(GatewayNetworkError):
            gateway.request_transaction(Transaction(amount=1000, order_id=1))
Exemple #25
0
def test_gateway():
    gateway = AqayepardakhtGateway(config=config)
    with domock(get_side_effect(returned_text="11-22-33")):
        transaction = gateway.request_transaction(
            Transaction(amount=1000, order_id=1))
        gateway.get_redirection(transaction)

        # with optional fields
        transaction = gateway.request_transaction(
            Transaction(amount=1000, order_id=1, meta=dict(invoice_id="112")))
        gateway.get_redirection(transaction)

        valid_transaction = gateway.validate_transaction({
            "transid": "RETURNED_TOKEN",
            "status": "1"
        })
        assert valid_transaction.validate_status

        invalid_transaction = gateway.validate_transaction({})
        assert not invalid_transaction.validate_status

    # success verification
    with domock(get_side_effect(returned_text="1")):
        gateway.verify_transaction(transaction, dict())

    # failed verification
    with domock(get_side_effect(returned_text="0")):
        with pytest.raises(TransactionError):
            gateway.verify_transaction(transaction, dict())

    # already paid
    with domock(get_side_effect(returned_text="2")):
        with pytest.raises(TransactionAlreadyPaidError):
            gateway.verify_transaction(transaction, dict())

    # invalid transaction
    with domock(get_side_effect(http_status_code=402)):
        with pytest.raises(TransactionError):
            gateway.request_transaction(Transaction(amount=1000))

        with pytest.raises(TransactionError):
            gateway.verify_transaction(transaction, dict())

    # network error
    with domock(get_side_effect(raise_url_error=True)):
        with pytest.raises(GatewayNetworkError):
            gateway.verify_transaction(transaction, dict())

        with pytest.raises(GatewayNetworkError):
            gateway.request_transaction(Transaction(amount=1000, order_id=1))
Exemple #26
0
    def request_transaction(self, transaction: Transaction) -> Transaction:
        client = Client(self._server_url_request)
        if 'proxies' in self.config:
            client.transport.session.proxies = self.config['proxies']
        try:
            params = {
                'merchantId': self.config['merchant'],
                'invoiceNo': transaction.order_id,
                'paymentId': transaction.order_id,
                'specialPaymentId': transaction.order_id,
                'amount': int(transaction.amount),
                'description': '',
                'revertURL': self.config['callback_url'],
            }
            result = client.service.MakeToken(**params)
            token = result.token
            if token:
                transaction.id = token
            else:
                raise TransactionError('Irankish: invalid information.')

        except zeep_exceptions.Fault:
            raise TransactionError('Irankish: invalid information.')

        except zeep_exceptions.Error:
            raise GatewayNetworkError

        return transaction
Exemple #27
0
    def verify_transaction(self, transaction: Transaction, data):
        url = 'https://pay.ir/payment/verify'
        data = {
            'api': self.config['pin'],
            'transId': transaction.id,
        }
        if self.testing:  # pragma: nocover
            url = 'https://pay.ir/payment/test/verify'
            data['api'] = 'test'

        try:
            req = request.Request(url, data=parse.urlencode(data).encode())
            resp = request.urlopen(req)
            resp = json.loads(resp.read().decode())
        except error.HTTPError as e:
            if e.code == 422:
                raise TransactionError('Invalid transaction id')
            raise TransactionError('Invalid transaction information')
        except error.URLError:
            raise GatewayNetworkError('Cannot connect to payline server.')

        if int(resp['status']) != 1:
            raise TransactionError('%s, code: %s' %
                                   (resp['errorMessage'], resp['errorCode']))

        if int(transaction.amount) != int(resp['amount']):
            raise TransactionError('Amount mismatch')

        transaction.pan = resp['cardNumber']
        return transaction
Exemple #28
0
    def request_transaction(self, transaction: Transaction) -> Transaction:
        url = 'https://pay.ir/payment/send'
        data = {
            'api': self.config['pin'],
            'amount': transaction.amount,
            'redirect': self.config['callback_url']
        }
        if self.testing:  # pragma: nocover
            url = 'https://pay.ir/payment/test/send'
            data['api'] = 'test'

        try:
            req = request.Request(url, data=parse.urlencode(data).encode())
            resp = request.urlopen(req)
            resp = json.loads(resp.read().decode())
        except error.URLError:
            raise GatewayNetworkError('Cannot connect to payline server.')

        if resp['status'] == 1 and resp['transId']:
            transaction.id = resp['transId']
        else:
            raise TransactionError('%s, code: %s' %
                                   (resp['errorMessage'], resp['errorCode']))

        return transaction
Exemple #29
0
    def request_transaction(self, transaction: Transaction) -> Transaction:
        client = Client(self._server_url_request)
        if "proxies" in self.config:
            client.transport.session.proxies = self.config["proxies"]
        try:
            data = {
                "LoginAccount": self.config["pin"],
                "OrderId": transaction.order_id,
                "Amount": int(transaction.amount),
                "CallBackUrl": self.config["callback_url"],
            }
            result = client.service.SalePaymentRequest(requestData=data)
            token = result.Token
            status = int(result.Status)
            if token and status == 0:
                transaction.id = str(token)

            else:
                raise TransactionError(
                    "Parsian: %s-%s"
                    % (status, self._response_message_map[str(status)])
                )

        except zeep_exceptions.Fault:
            raise TransactionError("Parsian: invalid information.")

        except zeep_exceptions.Error:
            raise GatewayNetworkError

        return transaction
Exemple #30
0
    def verify_transaction(self, transaction: Transaction, data):
        try:
            data = {
                "LoginAccount": self.config["pin"],
                "Token": transaction.id,
            }
            client = Client(self._server_url_verify)
            if "proxies" in self.config:
                client.transport.session.proxies = self.config["proxies"]

            result = client.service.ConfirmPayment(requestData=data)
            status = int(result.Status)
            if status == -1533:
                raise TransactionAlreadyPaidError(
                    "Parsian: Transaction already paid"
                )

            elif status != 0:
                raise TransactionError(
                    "Parsian: %s-%s"
                    % (status, self._response_message_map[str(status)])
                )

        except zeep_exceptions.Error:
            raise GatewayNetworkError

        transaction.pan = result.CardNumberMasked
        return transaction