38146-vm/core/thawani.py
2026-02-04 16:21:56 +00:00

77 lines
2.4 KiB
Python

import httpx
from core.models import ThawaniConfiguration
from django.conf import settings
class ThawaniClient:
def __init__(self):
config = ThawaniConfiguration.objects.first()
if not config:
# Fallback or error if not configured
self.api_key = None
self.publishable_key = None
self.is_sandbox = True
else:
self.api_key = config.api_key
self.publishable_key = config.publishable_key
self.is_sandbox = config.is_sandbox
if self.is_sandbox:
self.base_url = "https://uat-checkout.thawani.om/api/v1"
else:
self.base_url = "https://checkout.thawani.om/api/v1"
def create_checkout_session(self, product, user, success_url, cancel_url):
if not self.api_key:
raise Exception("Thawani API Key is not configured.")
url = f"{self.base_url}/checkout/session"
headers = {
"thawani-api-key": self.api_key,
"Content-Type": "application/json"
}
# Thawani expects amount in Baisa (1 OMR = 1000 Baisa)
amount_baisa = int(product.price * 1000)
metadata = {
"user_id": str(user.id)
}
# Handle Subject or Package
# Package has 'subjects' ManyToMany field
if hasattr(product, 'subjects'):
metadata["package_id"] = str(product.id)
else:
metadata["subject_id"] = str(product.id)
payload = {
"client_reference_id": str(user.id),
"mode": "payment",
"products": [
{
"name": product.name_en,
"quantity": 1,
"unit_amount": amount_baisa
}
],
"success_url": success_url,
"cancel_url": cancel_url,
"metadata": metadata
}
response = httpx.post(url, json=payload, headers=headers)
response.raise_for_status()
return response.json()
def get_checkout_session(self, session_id):
if not self.api_key:
raise Exception("Thawani API Key is not configured.")
url = f"{self.base_url}/checkout/session/{session_id}"
headers = {
"thawani-api-key": self.api_key
}
response = httpx.get(url, headers=headers)
response.raise_for_status()
return response.json()