From 6c7c44c6a352249b00e8728ac37dd0973443e9be Mon Sep 17 00:00:00 2001 From: deryacakmak <97deryacakmak@gmail.com> Date: Wed, 24 Jun 2026 16:47:48 +0300 Subject: [PATCH 1/3] Add `generate_token` method for BKM Express token generation --- craftgate/adapter/bkm_express_payment_adapter.py | 13 +++++++++++++ craftgate/request/generate_bkm_express_token.py | 11 +++++++++++ .../generate_bkm_express_token_response.py | 16 ++++++++++++++++ tests/test_bkm_express_payment_sample.py | 11 +++++++++++ 4 files changed, 51 insertions(+) create mode 100644 craftgate/request/generate_bkm_express_token.py create mode 100644 craftgate/response/generate_bkm_express_token_response.py diff --git a/craftgate/adapter/bkm_express_payment_adapter.py b/craftgate/adapter/bkm_express_payment_adapter.py index a6ae47b..7fc5a2b 100644 --- a/craftgate/adapter/bkm_express_payment_adapter.py +++ b/craftgate/adapter/bkm_express_payment_adapter.py @@ -1,8 +1,10 @@ from craftgate.adapter.base_adapter import BaseAdapter from craftgate.net.base_http_client import BaseHttpClient from craftgate.request.complete_bkm_express_request import CompleteBkmExpressRequest +from craftgate.request.generate_bkm_express_token import BkmExpressGenerateTokenRequest from craftgate.request.init_bkm_express_request import InitBkmExpressRequest from craftgate.request_options import RequestOptions +from craftgate.response.generate_bkm_express_token_response import BkmExpressGenerateTokenResponse from craftgate.response.init_bkm_express_response import InitBkmExpressResponse from craftgate.response.payment_response import PaymentResponse @@ -44,3 +46,14 @@ def retrieve_payment_by_token(self, token: str) -> PaymentResponse: body=None, response_type=PaymentResponse ) + + def generate_token(self, request: BkmExpressGenerateTokenRequest) -> BkmExpressGenerateTokenResponse: + path = "/payment/v2/bkm-express/generate-token" + 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=BkmExpressGenerateTokenResponse + ) diff --git a/craftgate/request/generate_bkm_express_token.py b/craftgate/request/generate_bkm_express_token.py new file mode 100644 index 0000000..e742b53 --- /dev/null +++ b/craftgate/request/generate_bkm_express_token.py @@ -0,0 +1,11 @@ + +from typing import Optional + +class BkmExpressGenerateTokenRequest: + def __init__( + self, + gsm_number: Optional[str] = None, + user_id: Optional[str] = None + ) -> None: + self.gsm_number = gsm_number + self.user_id = user_id diff --git a/craftgate/response/generate_bkm_express_token_response.py b/craftgate/response/generate_bkm_express_token_response.py new file mode 100644 index 0000000..e4bd7f4 --- /dev/null +++ b/craftgate/response/generate_bkm_express_token_response.py @@ -0,0 +1,16 @@ +from typing import Optional + + +def __init__( + self, + token: Optional[str] = None, + error_message: Optional[str] = None, + error_code: Optional[str] = None +) -> None: + self.token = token + self.error_message = error_message + self.error_code = error_code + + +class BkmExpressGenerateTokenResponse: + pass diff --git a/tests/test_bkm_express_payment_sample.py b/tests/test_bkm_express_payment_sample.py index db73f00..499425e 100644 --- a/tests/test_bkm_express_payment_sample.py +++ b/tests/test_bkm_express_payment_sample.py @@ -7,6 +7,7 @@ from craftgate.model import Currency, PaymentGroup from craftgate.request import CompleteBkmExpressRequest, InitBkmExpressRequest from craftgate.request.dto import PaymentItem +from craftgate.request.generate_bkm_express_token import BkmExpressGenerateTokenRequest class BkmExpressPaymentSample(unittest.TestCase): @@ -68,6 +69,16 @@ def test_retrieve_payment_by_token(self): print(response) self.assertIsNotNone(response) + def test_generate_token(self): + request = BkmExpressGenerateTokenRequest( + gsm_number="5350000000", + user_id="1234567890" + ) + + response = self.bkm_express_payment.generate_token(request) + print(response) + self.assertIsNotNone(response) + if __name__ == "__main__": unittest.main() From 2e571e3ffe7796e078d3cb442cf596008ad47947 Mon Sep 17 00:00:00 2001 From: deryacakmak <97deryacakmak@gmail.com> Date: Tue, 6 Oct 2026 01:33:55 +0300 Subject: [PATCH 2/3] Add BKM Express support to payment initialization and tokenized card type --- craftgate/model/tokenized_card_type.py | 1 + craftgate/request/init_checkout_payment_request.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/craftgate/model/tokenized_card_type.py b/craftgate/model/tokenized_card_type.py index bedd1c5..486dd6d 100644 --- a/craftgate/model/tokenized_card_type.py +++ b/craftgate/model/tokenized_card_type.py @@ -3,3 +3,4 @@ class TokenizedCardType(str, Enum): APPLE_PAY = "APPLE_PAY" + BKM_EXPRESS = "BKM_EXPRESS" diff --git a/craftgate/request/init_checkout_payment_request.py b/craftgate/request/init_checkout_payment_request.py index 56d7c35..bbcdcfc 100644 --- a/craftgate/request/init_checkout_payment_request.py +++ b/craftgate/request/init_checkout_payment_request.py @@ -28,6 +28,8 @@ def __init__( enabled_payment_methods: Optional[List[PaymentMethod]] = None, masterpass_gsm_number: Optional[str] = None, masterpass_user_id: Optional[str] = None, + bex_gsm_number: Optional[str] = None, + bex_user_id: Optional[str] = None, card_user_key: Optional[str] = None, buyer_member_id: Optional[int] = None, enabled_installments: Optional[List[int]] = None, @@ -63,6 +65,8 @@ def __init__( self.enabled_payment_methods = enabled_payment_methods self.masterpass_gsm_number = masterpass_gsm_number self.masterpass_user_id = masterpass_user_id + self.bex_gsm_number = bex_gsm_number + self.bex_user_id = bex_user_id self.card_user_key = card_user_key self.buyer_member_id = buyer_member_id self.enabled_installments = enabled_installments From b2876d38ab310eea1cd6f0de73d7ce5331e4afb7 Mon Sep 17 00:00:00 2001 From: deryacakmak <97deryacakmak@gmail.com> Date: Wed, 7 Oct 2026 11:17:31 +0300 Subject: [PATCH 3/3] Remove unused error fields from BKM Express token response initialization --- craftgate/response/generate_bkm_express_token_response.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/craftgate/response/generate_bkm_express_token_response.py b/craftgate/response/generate_bkm_express_token_response.py index e4bd7f4..1783b8b 100644 --- a/craftgate/response/generate_bkm_express_token_response.py +++ b/craftgate/response/generate_bkm_express_token_response.py @@ -4,12 +4,8 @@ def __init__( self, token: Optional[str] = None, - error_message: Optional[str] = None, - error_code: Optional[str] = None ) -> None: self.token = token - self.error_message = error_message - self.error_code = error_code class BkmExpressGenerateTokenResponse: