import logging import requests from azbankgateways.banks import BaseBank from azbankgateways.exceptions import SettingDoesNotExist from azbankgateways.exceptions.exceptions import ( BankGatewayConnectionError, BankGatewayRejectPayment, ) from azbankgateways.models import BankType, CurrencyEnum, PaymentStatus from azbankgateways.utils import get_json class IranDargah(BaseBank): _merchant_code = None _sandbox = False def __init__(self, **kwargs): kwargs.setdefault("SANDBOX", 0) super().__init__(**kwargs) self.set_gateway_currency(CurrencyEnum.IRR) self._sandbox = kwargs.get("SANDBOX", 0) == 1 base_url = "https://dargaah.ir" if self._sandbox: base_url += "/sandbox" self._payment_url = f"{base_url}/payment" self._startpay_url = f"{base_url}/ird/startpay/" self._verify_url = f"{base_url}/verification" def get_bank_type(self): return BankType.IRANDARGAH def set_default_settings(self): for item in ["MERCHANT_CODE"]: if item not in self.default_setting_kwargs: raise SettingDoesNotExist(f"{item} not in settings") setattr(self, f"_{item.lower()}", self.default_setting_kwargs[item]) def _get_gateway_payment_url_parameter(self): return f"{self._startpay_url}{self.get_reference_number()}" def _get_gateway_payment_parameter(self): return {} def _get_gateway_payment_method_parameter(self): return "GET" def get_pay_data(self): return { "merchantID": self._merchant_code, "amount": self.get_gateway_amount(), "callbackURL": self._get_gateway_callback_url(), "orderId": str(self.get_tracking_code()), **self.get_custom_data(), } def prepare_pay(self): super().prepare_pay() def pay(self): super().pay() data = self.get_pay_data() result = self._send_data(api=self._payment_url, data=data) if result["status"] == 200: self._set_reference_number(result["authority"]) else: logging.critical("IranDargah reject payment: %s", result.get("message")) raise BankGatewayRejectPayment(self.get_transaction_status_text()) def prepare_verify_from_gateway(self): super().prepare_verify_from_gateway() authority = self.get_request().POST.get("authority") self._set_reference_number(authority) self._set_bank_record() def verify_from_gateway(self, request): super().verify_from_gateway(request) def get_verify_data(self): return { "merchantID": self._merchant_code, "authority": self.get_reference_number(), "amount": self.get_gateway_amount(), "orderId": str(self.get_tracking_code()), } def prepare_verify(self, tracking_code): super().prepare_verify(tracking_code) def verify(self, transaction_code): super().verify(transaction_code) data = self.get_verify_data() result = self._send_data(api=self._verify_url, data=data) if result.get("status") in [100, 101]: self._set_payment_status(PaymentStatus.COMPLETE) else: self._set_payment_status(PaymentStatus.CANCEL_BY_USER) logging.debug("IranDargah verify failed: %s", result.get("message")) def _send_data(self, api, data): try: response = requests.post(api, json=data, timeout=self.get_timeout()) response.raise_for_status() except requests.RequestException as e: logging.exception("IranDargah connection error: %s", e) raise BankGatewayConnectionError() result = get_json(response) msg = result.get("message", "no message") self._set_transaction_status_text(msg) return result