Files
hossein-por-shop/backend/azbankgateways/banks/bahamta.py
T
2026-05-22 20:11:17 +03:30

138 lines
4.6 KiB
Python

import json
import logging
import requests
from azbankgateways.exceptions import BankGatewayConnectionError, SettingDoesNotExist
from azbankgateways.exceptions.exceptions import BankGatewayRejectPayment
from azbankgateways.models import BankType, CurrencyEnum, PaymentStatus
from azbankgateways.utils import append_querystring, get_json, split_to_dict_querystring
from .banks import BaseBank
class Bahamta(BaseBank):
_merchant_code = None
_params = {}
def __init__(self, **kwargs):
super(Bahamta, self).__init__(**kwargs)
self.set_gateway_currency(CurrencyEnum.IRR)
self._token_api_url = "https://webpay.bahamta.com/api/create_request"
self._payment_url = None
self._verify_api_url = "https://webpay.bahamta.com/api/confirm_payment"
def get_bank_type(self):
return BankType.BAHAMTA
def set_default_settings(self):
for item in ["MERCHANT_CODE"]:
if item not in self.default_setting_kwargs:
raise SettingDoesNotExist()
setattr(self, f"_{item.lower()}", self.default_setting_kwargs[item])
"""
Gateway
"""
def _get_gateway_payment_url_parameter(self):
return self._payment_url
def _get_gateway_payment_parameter(self):
params = {}
params.update(self._params)
return params
def _get_gateway_payment_method_parameter(self):
return "GET"
"""
pay
"""
def get_pay_data(self):
data = {
"api_key": self._merchant_code,
"reference": self.get_tracking_code(),
"amount_irr": self.get_gateway_amount(),
"payer_mobile": self.get_mobile_number(),
"callback_url": self._get_gateway_callback_url(),
}
data.update(self.get_custom_data())
return data
def prepare_pay(self):
super(Bahamta, self).prepare_pay()
def pay(self):
super(Bahamta, self).pay()
data = self.get_pay_data()
response_json = self._send_data(self._token_api_url, data)
if response_json["ok"]:
# در این سیستم رفرنس برای ذخیره سازی بر نمی گردد!
token = self.get_tracking_code()
self._payment_url, self._params = split_to_dict_querystring(
response_json["result"]["payment_url"]
)
self._set_reference_number(token)
else:
logging.critical("Bahamta gateway reject payment")
raise BankGatewayRejectPayment(self.get_transaction_status_text())
"""
verify gateway
"""
def prepare_verify_from_gateway(self):
super(Bahamta, self).prepare_verify_from_gateway()
token = self.get_request().GET.get("reference")
self._set_reference_number(token)
self._set_bank_record()
def verify_from_gateway(self, request):
super(Bahamta, self).verify_from_gateway(request)
"""
verify
"""
def get_verify_data(self):
super(Bahamta, self).get_verify_data()
data = {
"api_key": self._merchant_code,
"reference": self.get_reference_number(),
"amount_irr": self.get_gateway_amount(),
}
return data
def prepare_verify(self, tracking_code):
super(Bahamta, self).prepare_verify(tracking_code)
def verify(self, transaction_code):
super(Bahamta, self).verify(transaction_code)
data = self.get_verify_data()
response_json = self._send_data(self._verify_api_url, data)
if response_json.get("ok", False) and response_json.get("result", {}).get("state") == "paid":
self._set_payment_status(PaymentStatus.COMPLETE)
extra_information = json.dumps(response_json.get("result", {}))
self._bank.extra_information = extra_information
self._bank.save()
else:
self._set_payment_status(PaymentStatus.CANCEL_BY_USER)
logging.debug("Bahamta gateway unapprove payment")
def _send_data(self, api, data):
try:
url = append_querystring(api, data)
response = requests.get(url, timeout=self.get_timeout())
except requests.Timeout:
logging.exception("Bahamta time out gateway {}".format(data))
raise BankGatewayConnectionError()
except requests.ConnectionError:
logging.exception("Bahamta time out gateway {}".format(data))
raise BankGatewayConnectionError()
response_json = get_json(response)
self._set_transaction_status_text(response_json.get("error"))
return response_json