105 lines
3.1 KiB
Python
105 lines
3.1 KiB
Python
# Copyright (C) 2024 by Animath
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
from django.conf import settings
|
|
import requests
|
|
|
|
_access_token = None
|
|
_refresh_token = None
|
|
_expires_at = None
|
|
|
|
|
|
def _get_hello_asso_api_base_url():
|
|
if settings.HELLOASSO_TEST_ENDPOINT:
|
|
return f"{settings.HELLOASSO_TEST_ENDPOINT_URL}/helloasso-test/api"
|
|
elif not settings.DEBUG:
|
|
return "https://api.helloasso.com"
|
|
else:
|
|
return "https://api.helloasso-sandbox.com"
|
|
|
|
|
|
def get_hello_asso_access_token():
|
|
global _access_token, _refresh_token, _expires_at
|
|
|
|
base_url = _get_hello_asso_api_base_url()
|
|
|
|
now = datetime.now()
|
|
if _access_token is None:
|
|
response = requests.post(
|
|
f"{base_url}/oauth2/token",
|
|
data={
|
|
"grant_type": "client_credentials",
|
|
"client_id": settings.HELLOASSO_CLIENT_ID,
|
|
"client_secret": settings.HELLOASSO_CLIENT_SECRET,
|
|
},
|
|
)
|
|
elif now >= _expires_at:
|
|
response = requests.post(
|
|
f"{base_url}/oauth2/token",
|
|
data={
|
|
"grant_type": "refresh_token",
|
|
"refresh_token": _refresh_token,
|
|
},
|
|
)
|
|
else:
|
|
return _access_token
|
|
|
|
if response.status_code == 400:
|
|
raise ValueError(str(response.json()))
|
|
response.raise_for_status()
|
|
|
|
data = response.json()
|
|
_access_token = data["access_token"]
|
|
_refresh_token = data["refresh_token"]
|
|
_expires_at = now + timedelta(seconds=data["expires_in"])
|
|
|
|
return _access_token
|
|
|
|
|
|
def get_checkout_intent(checkout_id, none_if_link_disabled=False):
|
|
base_url = _get_hello_asso_api_base_url()
|
|
token = get_hello_asso_access_token()
|
|
|
|
response = requests.get(
|
|
f"{base_url}/v5/organizations/animath/checkout-intents/{checkout_id}",
|
|
headers={"Authorization": f"Bearer {token}"},
|
|
)
|
|
if response.status_code == 404:
|
|
return None
|
|
elif response.status_code == 400:
|
|
raise ValueError(str(response.json()['errors']))
|
|
response.raise_for_status()
|
|
|
|
checkout_intent = response.json()
|
|
if none_if_link_disabled and requests.head(checkout_intent["redirectUrl"]).status_code == 404:
|
|
return None
|
|
|
|
return checkout_intent
|
|
|
|
|
|
def create_checkout_intent(amount, name, back_url, error_url, return_url, contains_donation=False, metadata=None):
|
|
base_url = _get_hello_asso_api_base_url()
|
|
token = get_hello_asso_access_token()
|
|
|
|
metadata = metadata or {}
|
|
response = requests.post(
|
|
f"{base_url}/v5/organizations/animath/checkout-intents/",
|
|
headers={"Authorization": f"Bearer {token}"},
|
|
json={
|
|
"totalAmount": amount,
|
|
"initialAmount": amount,
|
|
"itemName": name,
|
|
"backUrl": back_url,
|
|
"errorUrl": error_url,
|
|
"returnUrl": return_url,
|
|
"containsDonation": contains_donation,
|
|
"metadata": metadata,
|
|
},
|
|
)
|
|
if response.status_code == 400:
|
|
raise ValueError(str(response.json()['errors']))
|
|
response.raise_for_status()
|
|
return response.json()
|