from typing import Union
import requests
from .dataclasses import (
APIResponse,
Credential,
IPNResponse,
IPNValidationStatus,
OrderValidationPostData,
OrderValidationResponse,
PaymentInitPostData,
PaymentInitResponse,
RefundInitiateResponse,
RefundRequestPostData,
RefundResponse,
TransactionBySessionResponse,
TransactionsByIDResponse,
)
[docs]
class SSLCommerzClient:
def __init__(self, store_id: str, store_passwd: str, sandbox: bool = False):
self.store_id = store_id
self.store_passwd = store_passwd
self.sandbox = sandbox
@property
def baseURL(self):
if self.sandbox:
return "https://sandbox.sslcommerz.com"
else:
return "https://securepay.sslcommerz.com"
@property
def credential(self):
return {
"store_id": self.store_id,
"store_passwd": self.store_passwd,
}
[docs]
def initiate_session(self, postData: Union[PaymentInitPostData, dict]):
"""Initiates an session."""
if not isinstance(postData, PaymentInitPostData):
postData = PaymentInitPostData(**postData)
url = self.baseURL + "/gwprocess/v4/api.php"
request_data = postData.model_dump(exclude_none=True)
request_data.update(self.credential)
resp = requests.post(url, request_data)
if resp:
return APIResponse(
raw_data=resp,
status_code=resp.status_code,
response=PaymentInitResponse(**resp.json()),
)
else:
return APIResponse(raw_data=resp, status_code=resp.status_code)
[docs]
def validate_IPN(self, data: dict):
"""Validate an IPN response."""
ipnResponse = IPNResponse(**data)
status = ipnResponse.validate_against_credential(
credential=Credential(**self.credential)
)
return IPNValidationStatus(status=status, response=ipnResponse)
[docs]
def get_order_validation_data(
self, data: Union[dict, OrderValidationPostData, IPNResponse]
):
"""Get Order validation data from API."""
if isinstance(data, IPNResponse):
data = OrderValidationPostData(val_id=data.val_id)
elif not isinstance(data, OrderValidationPostData):
data = OrderValidationPostData(**data)
url = self.baseURL + "/validator/api/validationserverAPI.php"
request_data = data.model_dump(exclude_none=True)
request_data.update(self.credential)
resp = requests.get(url, request_data)
if resp:
return APIResponse(
raw_data=resp,
status_code=resp.status_code,
response=OrderValidationResponse(**resp.json()),
)
else:
return APIResponse(raw_data=resp, status_code=resp.status_code)
[docs]
def initiate_refund(self, data: Union[dict, RefundRequestPostData]):
"""Initiate a refund."""
if not isinstance(data, RefundRequestPostData):
data = RefundRequestPostData(**data)
url = self.baseURL + "/validator/api/merchantTransIDvalidationAPI.php"
request_data = data.model_dump(exclude_none=True)
request_data.update(self.credential)
resp = requests.get(url, params=request_data)
if resp:
return APIResponse(
raw_data=resp,
status_code=resp.status_code,
response=RefundInitiateResponse(**resp.json()),
)
else:
return APIResponse(raw_data=resp, status_code=resp.status_code)
[docs]
def get_refund_data(self, refund_ref_id: str):
"""Get existing refund data."""
url = self.baseURL + "/validator/api/merchantTransIDvalidationAPI.php"
request_data = {"refund_ref_id": refund_ref_id, **self.credential}
resp = requests.get(url, request_data)
if resp:
return APIResponse(
raw_data=resp,
status_code=resp.status_code,
response=RefundResponse(**resp.json()),
)
else:
return APIResponse(raw_data=resp, status_code=resp.status_code)
[docs]
def get_transaction_by_session(self, sessionkey: str):
"""Get a transaction by sessionkey."""
url = self.baseURL + "/validator/api/merchantTransIDvalidationAPI.php"
request_data = {"sessionkey": sessionkey, **self.credential}
resp = requests.get(url, request_data)
if resp:
return APIResponse(
raw_data=resp,
status_code=resp.status_code,
response=TransactionBySessionResponse(**resp.json()),
)
else:
return APIResponse(raw_data=resp, status_code=resp.status_code)
[docs]
def get_transaction_by_id(self, tran_id: str):
"""Get transactions by transaction id."""
url = self.baseURL + "/validator/api/merchantTransIDvalidationAPI.php"
request_data = {"tran_id": tran_id, **self.credential}
resp = requests.get(url, request_data)
if resp:
return APIResponse(
raw_data=resp,
status_code=resp.status_code,
response=TransactionsByIDResponse(**resp.json()),
)
else:
return APIResponse(raw_data=resp, status_code=resp.status_code)