From 8aa7a170c387cbaabf9353b8223dc5556d0405ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ertu=C4=9Frul=20Berat=20ALLAHVERD=C4=B0?= Date: Wed, 20 May 2026 12:06:12 +0300 Subject: [PATCH] Added Retrieve Card from IVR --- craftgate/adapter/payment_adapter.py | 14 ++++++++++++++ .../request/retrieve_card_from_ivr_request.py | 10 ++++++++++ .../response/ivr_card_tokenization_response.py | 16 ++++++++++++++++ tests/test_payment_sample.py | 11 +++++++++++ 4 files changed, 51 insertions(+) create mode 100644 craftgate/request/retrieve_card_from_ivr_request.py create mode 100644 craftgate/response/ivr_card_tokenization_response.py diff --git a/craftgate/adapter/payment_adapter.py b/craftgate/adapter/payment_adapter.py index 4a478e6..429d93f 100644 --- a/craftgate/adapter/payment_adapter.py +++ b/craftgate/adapter/payment_adapter.py @@ -28,6 +28,7 @@ from craftgate.request.refund_payment_transaction_mark_as_refunded_request import \ RefundPaymentTransactionMarkAsRefundedRequest from craftgate.request.refund_payment_transaction_request import RefundPaymentTransactionRequest +from craftgate.request.retrieve_card_from_ivr_request import RetrieveCardFromIvrRequest from craftgate.request.retrieve_loyalties_request import RetrieveLoyaltiesRequest from craftgate.request.retrieve_provider_card_request import RetrieveProviderCardRequest from craftgate.request.search_stored_cards_request import SearchStoredCardsRequest @@ -52,6 +53,7 @@ from craftgate.response.init_pos_apm_payment_response import InitPosApmPaymentResponse from craftgate.response.init_three_ds_payment_response import InitThreeDSPaymentResponse from craftgate.response.instant_transfer_banks_response import InstantTransferBanksResponse +from craftgate.response.ivr_card_tokenization_response import IVRCardTokenizationResponse from craftgate.response.multi_payment_response import MultiPaymentResponse from craftgate.response.payment_refund_response import PaymentRefundResponse from craftgate.response.payment_response import PaymentResponse @@ -612,6 +614,18 @@ def retrieve_provider_cards(self, request: RetrieveProviderCardRequest) -> Store response_type=StoredCardListResponse ) + def retrieve_card_from_ivr(self, request: RetrieveCardFromIvrRequest) -> IVRCardTokenizationResponse: + query = RequestQueryParamsBuilder.build_query_params(request) + path = "/payment/v1/ivr-cards{}".format(query) + headers = self._create_headers(None, path) + return self._http_client.request( + method="GET", + url=self.request_options.base_url + path, + headers=headers, + body=None, + response_type=IVRCardTokenizationResponse + ) + def is_3d_secure_callback_verified(self, three_d_secure_callback_key: str, params: dict) -> bool: hash_val = params.get("hash") hash_string = "{}###{}###{}###{}###{}###{}###{}".format( diff --git a/craftgate/request/retrieve_card_from_ivr_request.py b/craftgate/request/retrieve_card_from_ivr_request.py new file mode 100644 index 0000000..b1771a2 --- /dev/null +++ b/craftgate/request/retrieve_card_from_ivr_request.py @@ -0,0 +1,10 @@ +from typing import Optional + +class RetrieveCardFromIvrRequest(object): + def __init__( + self, + card_user_key: Optional[str] = None, + call_token: Optional[str] = None, + ) -> None: + self.card_user_key = card_user_key + self.call_token = call_token diff --git a/craftgate/response/ivr_card_tokenization_response.py b/craftgate/response/ivr_card_tokenization_response.py new file mode 100644 index 0000000..4a9f3d8 --- /dev/null +++ b/craftgate/response/ivr_card_tokenization_response.py @@ -0,0 +1,16 @@ +from typing import Optional + +class IVRCardTokenizationResponse(object): + def __init__( + self, + bin_number: Optional[str] = None, + last_four_digits: Optional[str] = None, + card_user_key: Optional[str] = None, + card_token: Optional[str] = None, + secure_fields_token: Optional[str] = None + ) -> None: + self.bin_number = bin_number + self.last_four_digits = last_four_digits + self.card_user_key = card_user_key + self.card_token = card_token + self.secure_fields_token = secure_fields_token diff --git a/tests/test_payment_sample.py b/tests/test_payment_sample.py index 8b507a6..812d918 100644 --- a/tests/test_payment_sample.py +++ b/tests/test_payment_sample.py @@ -20,8 +20,10 @@ RetrieveProviderCardRequest, SearchStoredCardsRequest, StoreCardRequest, UpdateCardRequest, \ UpdatePaymentTransactionRequest, VerifyCard, VerifyCardRequest from craftgate.request.init_multi_payment_request import InitMultiPaymentRequest +from craftgate.request.retrieve_card_from_ivr_request import RetrieveCardFromIvrRequest from craftgate.response import MultiPaymentResponse, PaymentTransactionApprovalListResponse, PaymentTransactionResponse, \ StoredCardListResponse +from craftgate.response.ivr_card_tokenization_response import IVRCardTokenizationResponse class PaymentSample(unittest.TestCase): @@ -1635,6 +1637,15 @@ def test_retrieve_provider_card(self): print(resp) self.assertIsNotNone(resp) + def test_retrieve_card_from_ivr(self): + req = RetrieveCardFromIvrRequest() + req.card_user_key = "45f12c74-3000-465c-96dc-876850e7dd7a" + req.call_token = "0309ac2d-c5a5-4b4f-a91f-5c444ba07b24" + + resp: IVRCardTokenizationResponse = self.payment.retrieve_card_from_ivr(req) + print(resp) + self.assertIsNotNone(resp) + def test_should_validate_3d_secure_callback_verified(self): merchant_key = "merchantThreeDsCallbackKeySndbox" params = {