Skip to content

Commit c540a34

Browse files
authored
Init multi payment endpoint and samples added (#23)
1 parent ddee37b commit c540a34

4 files changed

Lines changed: 123 additions & 0 deletions

File tree

craftgate/adapter/payment_adapter.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from craftgate.request.init_checkout_card_verify_request import InitCheckoutCardVerifyRequest
2020
from craftgate.request.init_checkout_payment_request import InitCheckoutPaymentRequest
2121
from craftgate.request.init_garanti_pay_payment_request import InitGarantiPayPaymentRequest
22+
from craftgate.request.init_multi_payment_request import InitMultiPaymentRequest
2223
from craftgate.request.init_pos_apm_payment_request import InitPosApmPaymentRequest
2324
from craftgate.request.init_three_ds_payment_request import InitThreeDSPaymentRequest
2425
from craftgate.request.post_auth_payment_request import PostAuthPaymentRequest
@@ -45,6 +46,7 @@
4546
from craftgate.response.init_checkout_card_verify_response import InitCheckoutCardVerifyResponse
4647
from craftgate.response.init_checkout_payment_response import InitCheckoutPaymentResponse
4748
from craftgate.response.init_garanti_pay_payment_response import InitGarantiPayPaymentResponse
49+
from craftgate.response.init_multi_payment_response import InitMultiPaymentResponse
4850
from craftgate.response.init_pos_apm_payment_response import InitPosApmPaymentResponse
4951
from craftgate.response.init_three_ds_payment_response import InitThreeDSPaymentResponse
5052
from craftgate.response.instant_transfer_banks_response import InstantTransferBanksResponse
@@ -552,6 +554,17 @@ def retrieve_active_banks(self) -> InstantTransferBanksResponse:
552554
response_type=InstantTransferBanksResponse
553555
)
554556

557+
def init_multi_payment(self, request: InitMultiPaymentRequest) -> InitMultiPaymentResponse:
558+
path = "/payment/v1/multi-payments/init"
559+
headers = self._create_headers(request, path)
560+
return self._http_client.request(
561+
method="POST",
562+
url=self.request_options.base_url + path,
563+
headers=headers,
564+
body=request,
565+
response_type=InitMultiPaymentResponse
566+
)
567+
555568
def retrieve_multi_payment(self, token: str) -> MultiPaymentResponse:
556569
path = "/payment/v1/multi-payments/{}".format(token)
557570
headers = self._create_headers(None, path)
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from decimal import Decimal
2+
from typing import Any, Dict, List, Optional
3+
4+
from craftgate.model.payment_source import PaymentSource
5+
from craftgate.model.currency import Currency
6+
from craftgate.model.payment_group import PaymentGroup
7+
from craftgate.model.payment_method import PaymentMethod
8+
from craftgate.model.payment_phase import PaymentPhase
9+
from craftgate.request.dto.payment_item import PaymentItem
10+
11+
12+
class InitMultiPaymentRequest(object):
13+
def __init__(
14+
self,
15+
price: Optional[Decimal] = None,
16+
paid_price: Optional[Decimal] = None,
17+
currency: Optional[Currency] = None,
18+
payment_group: Optional[PaymentGroup] = None,
19+
payment_source: Optional[PaymentSource] = None,
20+
conversation_id: Optional[str] = None,
21+
external_id: Optional[str] = None,
22+
callback_url: Optional[str] = None,
23+
payment_phase: PaymentPhase = PaymentPhase.AUTH,
24+
payment_channel: Optional[str] = None,
25+
enabled_payment_methods: Optional[List[PaymentMethod]] = None,
26+
card_user_key: Optional[str] = None,
27+
buyer_member_id: Optional[int] = None,
28+
allow_only_credit_card: bool = False,
29+
force_auth_for_non_credit_cards: bool = False,
30+
allow_only_stored_cards: bool = False,
31+
allow_installment_only_commercial_cards: bool = False,
32+
always_store_card_after_payment: bool = False,
33+
disable_store_card: bool = False,
34+
force_three_ds: bool = False,
35+
masterpass_gsm_number: Optional[str] = None,
36+
masterpass_user_id: Optional[str] = None,
37+
apm_user_identity: Optional[str] = None,
38+
items: Optional[List[PaymentItem]] = None,
39+
ttl: Optional[int] = None,
40+
maximum_split_payment_count: Optional[int] = None,
41+
additional_params: Optional[Dict[str, Any]] = None,
42+
) -> None:
43+
self.price = price
44+
self.paid_price = paid_price
45+
self.currency = currency
46+
self.payment_group = payment_group
47+
self.payment_source = payment_source
48+
self.conversation_id = conversation_id
49+
self.external_id = external_id
50+
self.callback_url = callback_url
51+
self.payment_phase = payment_phase
52+
self.payment_channel = payment_channel
53+
self.enabled_payment_methods = enabled_payment_methods
54+
self.masterpass_gsm_number = masterpass_gsm_number
55+
self.masterpass_user_id = masterpass_user_id
56+
self.apm_user_identity = apm_user_identity
57+
self.card_user_key = card_user_key
58+
self.buyer_member_id = buyer_member_id
59+
self.always_store_card_after_payment = always_store_card_after_payment
60+
self.disable_store_card = disable_store_card
61+
self.allow_only_stored_cards = allow_only_stored_cards
62+
self.allow_only_credit_card = allow_only_credit_card
63+
self.allow_installment_only_commercial_cards = allow_installment_only_commercial_cards
64+
self.force_three_ds = force_three_ds
65+
self.force_auth_for_non_credit_cards = force_auth_for_non_credit_cards
66+
self.ttl = ttl
67+
self.maximum_split_payment_count = maximum_split_payment_count
68+
self.items = items
69+
self.additional_params = additional_params
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from datetime import datetime
2+
from typing import Optional
3+
4+
5+
class InitMultiPaymentResponse(object):
6+
def __init__(
7+
self,
8+
token: Optional[str] = None,
9+
page_url: Optional[str] = None,
10+
token_expire_date: Optional[datetime] = None
11+
) -> None:
12+
self.token = token
13+
self.page_url = page_url
14+
self.token_expire_date = token_expire_date

tests/test_payment_sample.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
RefundPaymentTransactionMarkAsRefundedRequest, RefundPaymentTransactionRequest, RetrieveLoyaltiesRequest, \
2020
RetrieveProviderCardRequest, SearchStoredCardsRequest, StoreCardRequest, UpdateCardRequest, \
2121
UpdatePaymentTransactionRequest, VerifyCard, VerifyCardRequest
22+
from craftgate.request.init_multi_payment_request import InitMultiPaymentRequest
2223
from craftgate.response import MultiPaymentResponse, PaymentTransactionApprovalListResponse, PaymentTransactionResponse, \
2324
StoredCardListResponse
2425

@@ -1591,6 +1592,32 @@ def test_update_payment_transaction(self):
15911592
self.assertEqual(req.sub_merchant_member_id, resp.sub_merchant_member_id)
15921593
self.assertEqual(float(req.sub_merchant_member_price), float(resp.sub_merchant_member_price))
15931594

1595+
def test_init_multi_payment(self):
1596+
items = []
1597+
for name, price in [("item 1", "30"), ("item 2", "50"), ("item 3", "20")]:
1598+
pi = PaymentItem()
1599+
pi.name = name
1600+
pi.external_id = str(uuid.uuid4())
1601+
pi.price = Decimal(price)
1602+
items.append(pi)
1603+
1604+
req = InitMultiPaymentRequest()
1605+
req.price = Decimal("100")
1606+
req.paid_price = Decimal("100")
1607+
req.callback_url = "https://www.your-website.com/craftgate-checkout-callback"
1608+
req.currency = Currency.TRY
1609+
req.conversation_id = "456d1297-908e-4bd6-a13b-4be31a6e47d5"
1610+
req.external_id = "1001"
1611+
req.payment_group = PaymentGroup.LISTING_OR_SUBSCRIPTION
1612+
req.payment_phase = PaymentPhase.AUTH
1613+
req.items = items
1614+
1615+
resp = self.payment.init_multi_payment(req)
1616+
print(resp)
1617+
self.assertIsNotNone(resp)
1618+
self.assertIsNotNone(getattr(resp, "page_url", None))
1619+
self.assertIsNotNone(getattr(resp, "token", None))
1620+
15941621
def test_retrieve_multi_payment(self):
15951622
token = "6d7e66b5-9b1c-4c1d-879a-2557b651096e"
15961623
resp: MultiPaymentResponse = self.payment.retrieve_multi_payment(token)

0 commit comments

Comments
 (0)