From 5f80aec25a49748b4ef0996258e06742ab167583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mustafa=20=C3=96zcan?= Date: Thu, 19 Feb 2026 23:51:49 +0300 Subject: [PATCH] Init multi payment endpoint and samples added --- craftgate/adapter/payment_adapter.py | 13 ++++ .../request/init_multi_payment_request.py | 69 +++++++++++++++++++ .../response/init_multi_payment_response.py | 14 ++++ tests/test_payment_sample.py | 27 ++++++++ 4 files changed, 123 insertions(+) create mode 100644 craftgate/request/init_multi_payment_request.py create mode 100644 craftgate/response/init_multi_payment_response.py diff --git a/craftgate/adapter/payment_adapter.py b/craftgate/adapter/payment_adapter.py index 1d77a8a..de5fc15 100644 --- a/craftgate/adapter/payment_adapter.py +++ b/craftgate/adapter/payment_adapter.py @@ -19,6 +19,7 @@ from craftgate.request.init_checkout_card_verify_request import InitCheckoutCardVerifyRequest from craftgate.request.init_checkout_payment_request import InitCheckoutPaymentRequest from craftgate.request.init_garanti_pay_payment_request import InitGarantiPayPaymentRequest +from craftgate.request.init_multi_payment_request import InitMultiPaymentRequest from craftgate.request.init_pos_apm_payment_request import InitPosApmPaymentRequest from craftgate.request.init_three_ds_payment_request import InitThreeDSPaymentRequest from craftgate.request.post_auth_payment_request import PostAuthPaymentRequest @@ -45,6 +46,7 @@ from craftgate.response.init_checkout_card_verify_response import InitCheckoutCardVerifyResponse from craftgate.response.init_checkout_payment_response import InitCheckoutPaymentResponse from craftgate.response.init_garanti_pay_payment_response import InitGarantiPayPaymentResponse +from craftgate.response.init_multi_payment_response import InitMultiPaymentResponse 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 @@ -552,6 +554,17 @@ def retrieve_active_banks(self) -> InstantTransferBanksResponse: response_type=InstantTransferBanksResponse ) + def init_multi_payment(self, request: InitMultiPaymentRequest) -> InitMultiPaymentResponse: + path = "/payment/v1/multi-payments/init" + headers = self._create_headers(request, path) + return self._http_client.request( + method="POST", + url=self.request_options.base_url + path, + headers=headers, + body=request, + response_type=InitMultiPaymentResponse + ) + def retrieve_multi_payment(self, token: str) -> MultiPaymentResponse: path = "/payment/v1/multi-payments/{}".format(token) headers = self._create_headers(None, path) diff --git a/craftgate/request/init_multi_payment_request.py b/craftgate/request/init_multi_payment_request.py new file mode 100644 index 0000000..9013cd8 --- /dev/null +++ b/craftgate/request/init_multi_payment_request.py @@ -0,0 +1,69 @@ +from decimal import Decimal +from typing import Any, Dict, List, Optional + +from craftgate.model.payment_source import PaymentSource +from craftgate.model.currency import Currency +from craftgate.model.payment_group import PaymentGroup +from craftgate.model.payment_method import PaymentMethod +from craftgate.model.payment_phase import PaymentPhase +from craftgate.request.dto.payment_item import PaymentItem + + +class InitMultiPaymentRequest(object): + def __init__( + self, + price: Optional[Decimal] = None, + paid_price: Optional[Decimal] = None, + currency: Optional[Currency] = None, + payment_group: Optional[PaymentGroup] = None, + payment_source: Optional[PaymentSource] = None, + conversation_id: Optional[str] = None, + external_id: Optional[str] = None, + callback_url: Optional[str] = None, + payment_phase: PaymentPhase = PaymentPhase.AUTH, + payment_channel: Optional[str] = None, + enabled_payment_methods: Optional[List[PaymentMethod]] = None, + card_user_key: Optional[str] = None, + buyer_member_id: Optional[int] = None, + allow_only_credit_card: bool = False, + force_auth_for_non_credit_cards: bool = False, + allow_only_stored_cards: bool = False, + allow_installment_only_commercial_cards: bool = False, + always_store_card_after_payment: bool = False, + disable_store_card: bool = False, + force_three_ds: bool = False, + masterpass_gsm_number: Optional[str] = None, + masterpass_user_id: Optional[str] = None, + apm_user_identity: Optional[str] = None, + items: Optional[List[PaymentItem]] = None, + ttl: Optional[int] = None, + maximum_split_payment_count: Optional[int] = None, + additional_params: Optional[Dict[str, Any]] = None, + ) -> None: + self.price = price + self.paid_price = paid_price + self.currency = currency + self.payment_group = payment_group + self.payment_source = payment_source + self.conversation_id = conversation_id + self.external_id = external_id + self.callback_url = callback_url + self.payment_phase = payment_phase + self.payment_channel = payment_channel + self.enabled_payment_methods = enabled_payment_methods + self.masterpass_gsm_number = masterpass_gsm_number + self.masterpass_user_id = masterpass_user_id + self.apm_user_identity = apm_user_identity + self.card_user_key = card_user_key + self.buyer_member_id = buyer_member_id + self.always_store_card_after_payment = always_store_card_after_payment + self.disable_store_card = disable_store_card + self.allow_only_stored_cards = allow_only_stored_cards + self.allow_only_credit_card = allow_only_credit_card + self.allow_installment_only_commercial_cards = allow_installment_only_commercial_cards + self.force_three_ds = force_three_ds + self.force_auth_for_non_credit_cards = force_auth_for_non_credit_cards + self.ttl = ttl + self.maximum_split_payment_count = maximum_split_payment_count + self.items = items + self.additional_params = additional_params diff --git a/craftgate/response/init_multi_payment_response.py b/craftgate/response/init_multi_payment_response.py new file mode 100644 index 0000000..e281842 --- /dev/null +++ b/craftgate/response/init_multi_payment_response.py @@ -0,0 +1,14 @@ +from datetime import datetime +from typing import Optional + + +class InitMultiPaymentResponse(object): + def __init__( + self, + token: Optional[str] = None, + page_url: Optional[str] = None, + token_expire_date: Optional[datetime] = None + ) -> None: + self.token = token + self.page_url = page_url + self.token_expire_date = token_expire_date diff --git a/tests/test_payment_sample.py b/tests/test_payment_sample.py index 7850a7b..8b507a6 100644 --- a/tests/test_payment_sample.py +++ b/tests/test_payment_sample.py @@ -19,6 +19,7 @@ RefundPaymentTransactionMarkAsRefundedRequest, RefundPaymentTransactionRequest, RetrieveLoyaltiesRequest, \ RetrieveProviderCardRequest, SearchStoredCardsRequest, StoreCardRequest, UpdateCardRequest, \ UpdatePaymentTransactionRequest, VerifyCard, VerifyCardRequest +from craftgate.request.init_multi_payment_request import InitMultiPaymentRequest from craftgate.response import MultiPaymentResponse, PaymentTransactionApprovalListResponse, PaymentTransactionResponse, \ StoredCardListResponse @@ -1591,6 +1592,32 @@ def test_update_payment_transaction(self): self.assertEqual(req.sub_merchant_member_id, resp.sub_merchant_member_id) self.assertEqual(float(req.sub_merchant_member_price), float(resp.sub_merchant_member_price)) + def test_init_multi_payment(self): + items = [] + for name, price in [("item 1", "30"), ("item 2", "50"), ("item 3", "20")]: + pi = PaymentItem() + pi.name = name + pi.external_id = str(uuid.uuid4()) + pi.price = Decimal(price) + items.append(pi) + + req = InitMultiPaymentRequest() + req.price = Decimal("100") + req.paid_price = Decimal("100") + req.callback_url = "https://www.your-website.com/craftgate-checkout-callback" + req.currency = Currency.TRY + req.conversation_id = "456d1297-908e-4bd6-a13b-4be31a6e47d5" + req.external_id = "1001" + req.payment_group = PaymentGroup.LISTING_OR_SUBSCRIPTION + req.payment_phase = PaymentPhase.AUTH + req.items = items + + resp = self.payment.init_multi_payment(req) + print(resp) + self.assertIsNotNone(resp) + self.assertIsNotNone(getattr(resp, "page_url", None)) + self.assertIsNotNone(getattr(resp, "token", None)) + def test_retrieve_multi_payment(self): token = "6d7e66b5-9b1c-4c1d-879a-2557b651096e" resp: MultiPaymentResponse = self.payment.retrieve_multi_payment(token)