update bank gateway

This commit is contained in:
Parsa Nazer
2026-05-22 20:11:17 +03:30
parent e56df858fd
commit 6ed95784a3
22 changed files with 574 additions and 415 deletions
+115
View File
@@ -0,0 +1,115 @@
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