feat: added tpv app

This commit is contained in:
Pablo Moreno
2024-03-22 00:44:49 +01:00
parent a13eb6c9d9
commit b8562b3d7b
27 changed files with 1153 additions and 7 deletions
+105
View File
@@ -0,0 +1,105 @@
import base64
import json
from django.conf import settings
from django.urls import reverse
from tpv.models import PaymentTPV
from tpv.utils import compute_signature
class TransactionTypes:
AUTHORIZATION = 0
PREAUTHORIZATION = 1
REPLACEMENT_PREAUTHORIZATION = 11
CONFIRMATION = 2
REFUND = 3
SEPARATED_CONFIRMATION = 8
CANCELED = 9
PAYGOLD = 15
PUCE_AUTHENTICATION = 17
REFUND_WITHOUT_ORIGINAL = 34
BET_PRICE = 37
PAYMENT_CANCELED = 45
REFUND_CANCELED = 46
SEPARATED_CONFIRMATION_CANCELED = 47
LINK_EXPIRATION_CHANGED_FOR_PAYGOLD = 51
class RedsysClient:
DEBUG_ENVIRONMENT_URL = "https://sis-t.redsys.es:25443/sis/realizarPago"
PROD_ENVIRONMENT_URL = ""
def get_target_url(self):
if settings.DEBUG:
return self.DEBUG_ENVIRONMENT_URL
return self.PROD_ENVIRONMENT_URL
def get_merchant_code(self) -> str:
return settings.REDSYS_MERCHANT_CODE
def get_terminal(self) -> str:
return settings.REDSYS_TERMINAL
def get_currency_code(self) -> str:
return settings.REDSYS_CURRENCY_CODE
def get_merchant_url_ok_for_order(self, order: PaymentTPV) -> str:
path = reverse("tpv:ok", kwargs={"order": order.hash})
return f"{settings.REDSYS_TPV_DOMAIN}{path}"
def get_merchant_url_ko_for_order(self, order: PaymentTPV) -> str:
path = reverse("tpv:ko", kwargs={"order": order.hash})
return f"{settings.REDSYS_TPV_DOMAIN}{path}"
def get_webhook_url_for_order(self, order: PaymentTPV) -> str:
path = reverse("tpv:webhook", kwargs={"order": order.hash})
return f"{settings.REDSYS_TPV_DOMAIN}{path}"
def get_shared_secret(self) -> str:
return settings.REDSYS_SHARED_SECRET
def get_signature(self, hash, payload: str):
key = self.get_shared_secret()
return compute_signature(str(hash), payload, key).decode()
def get_merchant_parameters_for_order(
self, order: PaymentTPV, transaction_type: int = TransactionTypes.AUTHORIZATION
) -> dict:
merchant_code = self.get_merchant_code()
return {
"DS_MERCHANT_AMOUNT": str(order.amount_integer),
"DS_MERCHANT_CURRENCY": self.get_currency_code(),
"DS_MERCHANT_MERCHANTCODE": merchant_code,
"DS_MERCHANT_MERCHANTURL": self.get_webhook_url_for_order(order), # Webhook
"DS_MERCHANT_ORDER": order.hash.hex,
"DS_MERCHANT_TERMINAL": self.get_terminal(),
"DS_MERCHANT_TRANSACTIONTYPE": transaction_type,
"DS_MERCHANT_URLKO": self.get_merchant_url_ko_for_order(
order
), # Página informativa al usuario - Pago erróneo
"DS_MERCHANT_URLOK": self.get_merchant_url_ok_for_order(
order
), # Página informativa al usuario - Pago confirmado
}
def get_encoded_merchant_parameters_for_order(
self, order: PaymentTPV, transaction_type: int = TransactionTypes.AUTHORIZATION
) -> str:
body = self.get_merchant_parameters_for_order(order, transaction_type)
stringified_body = json.dumps(body)
return base64.b64encode(stringified_body.encode()).decode("utf-8")
def get_body_for_order(
self, order: PaymentTPV, transaction_type: int = TransactionTypes.AUTHORIZATION
) -> dict:
merchant_parameters = self.get_encoded_merchant_parameters_for_order(
order, transaction_type
)
signature = self.get_signature(order.hash.hex, merchant_parameters)
return {
"Ds_MerchantParameters": merchant_parameters,
"Ds_SignatureVersion": "HMAC_SHA256_V1",
"Ds_Signature": signature,
}