Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions craftgate/adapter/payment_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand Down
69 changes: 69 additions & 0 deletions craftgate/request/init_multi_payment_request.py
Original file line number Diff line number Diff line change
@@ -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
14 changes: 14 additions & 0 deletions craftgate/response/init_multi_payment_response.py
Original file line number Diff line number Diff line change
@@ -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
27 changes: 27 additions & 0 deletions tests/test_payment_sample.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down