5cbe093400
schedule job for updeing bank status and az iranian bank gateway admin style
142 lines
4.6 KiB
Python
142 lines
4.6 KiB
Python
import json
|
|
import logging
|
|
|
|
import requests
|
|
|
|
from azbankgateways.banks import BaseBank
|
|
from azbankgateways.exceptions import BankGatewayConnectionError, SettingDoesNotExist
|
|
from azbankgateways.exceptions.exceptions import BankGatewayRejectPayment
|
|
from azbankgateways.models import BankType, CurrencyEnum, PaymentStatus
|
|
from azbankgateways.utils import get_json, split_to_dict_querystring
|
|
|
|
|
|
class IDPay(BaseBank):
|
|
_merchant_code = None
|
|
_method = None
|
|
_x_sandbox = None
|
|
_payment_url = None
|
|
_params = {}
|
|
|
|
def __init__(self, **kwargs):
|
|
super(IDPay, self).__init__(**kwargs)
|
|
self.set_gateway_currency(CurrencyEnum.IRR)
|
|
self._token_api_url = "https://api.idpay.ir/v1.1/payment"
|
|
self._verify_api_url = "https://api.idpay.ir/v1.1/payment/verify"
|
|
|
|
def get_bank_type(self):
|
|
return BankType.IDPAY
|
|
|
|
def set_default_settings(self):
|
|
for item in ["MERCHANT_CODE", "METHOD", "X_SANDBOX"]:
|
|
if item not in self.default_setting_kwargs:
|
|
raise SettingDoesNotExist()
|
|
setattr(self, f"_{item.lower()}", self.default_setting_kwargs[item])
|
|
|
|
self._x_sandbox = str(self._x_sandbox)
|
|
|
|
"""
|
|
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 = {
|
|
"order_id": self.get_tracking_code(),
|
|
"amount": self.get_gateway_amount(),
|
|
"phone": self.get_mobile_number(),
|
|
"callback": self._get_gateway_callback_url(),
|
|
}
|
|
return data
|
|
|
|
def prepare_pay(self):
|
|
super(IDPay, self).prepare_pay()
|
|
|
|
def pay(self):
|
|
super(IDPay, self).pay()
|
|
data = self.get_pay_data()
|
|
response_json = self._send_data(self._token_api_url, data)
|
|
if "id" in response_json and "link" in response_json and response_json["link"] and response_json["id"]:
|
|
token = response_json["id"]
|
|
self._payment_url, self._params = split_to_dict_querystring(response_json["link"])
|
|
self._set_reference_number(token)
|
|
else:
|
|
logging.critical("IDPay gateway reject payment")
|
|
raise BankGatewayRejectPayment(self.get_transaction_status_text())
|
|
|
|
"""
|
|
verify gateway
|
|
"""
|
|
|
|
def prepare_verify_from_gateway(self):
|
|
super(IDPay, self).prepare_verify_from_gateway()
|
|
for method in ["GET", "POST", "data"]:
|
|
token = getattr(self.get_request(), method).get("id", None)
|
|
if token:
|
|
self._set_reference_number(token)
|
|
self._set_bank_record()
|
|
break
|
|
|
|
def verify_from_gateway(self, request):
|
|
super(IDPay, self).verify_from_gateway(request)
|
|
|
|
"""
|
|
verify
|
|
"""
|
|
|
|
def get_verify_data(self):
|
|
super(IDPay, self).get_verify_data()
|
|
data = {
|
|
"id": self.get_reference_number(),
|
|
"order_id": self.get_tracking_code(),
|
|
}
|
|
return data
|
|
|
|
def prepare_verify(self, tracking_code):
|
|
super(IDPay, self).prepare_verify(tracking_code)
|
|
|
|
def verify(self, transaction_code):
|
|
super(IDPay, self).verify(transaction_code)
|
|
data = self.get_verify_data()
|
|
response_json = self._send_data(self._verify_api_url, data, timeout=10)
|
|
if response_json.get("verify", {}).get("date", None):
|
|
self._set_payment_status(PaymentStatus.COMPLETE)
|
|
extra_information = json.dumps(response_json)
|
|
self._bank.extra_information = extra_information
|
|
self._bank.save()
|
|
else:
|
|
self._set_payment_status(PaymentStatus.CANCEL_BY_USER)
|
|
logging.debug("IDPay gateway unapprove payment")
|
|
|
|
def _send_data(self, api, data, timeout=5):
|
|
headers = {
|
|
"X-API-KEY": self._merchant_code,
|
|
"X-SANDBOX": self._x_sandbox,
|
|
}
|
|
try:
|
|
response = requests.post(api, headers=headers, json=data, timeout=timeout)
|
|
except requests.Timeout:
|
|
logging.exception("IDPay time out gateway {}".format(data))
|
|
raise BankGatewayConnectionError()
|
|
except requests.ConnectionError:
|
|
logging.exception("IDPay time out gateway {}".format(data))
|
|
raise BankGatewayConnectionError()
|
|
|
|
response_json = get_json(response)
|
|
if "error_message" in response_json:
|
|
self._set_transaction_status_text(response_json["error_message"])
|
|
return response_json
|