From 353a4453aaf39034c0ede330fc9f15c0035e52a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Y=C4=B1ld=C4=B1z?= Date: Wed, 4 Feb 2026 15:37:54 +0300 Subject: [PATCH 1/3] Add card verification endpoints --- .../io/craftgate/adapter/PaymentAdapter.java | 12 +++++ .../model/CardVerificationAuthType.java | 8 ++++ .../io/craftgate/model/CardVerifyStatus.java | 8 ++++ .../InitCheckoutCardVerifyRequest.java | 22 +++++++++ .../craftgate/request/VerifyCardRequest.java | 23 ++++++++++ .../craftgate/request/dto/VerifyCardDto.java | 16 +++++++ .../InitCheckoutCardVerifyResponse.java | 13 ++++++ .../response/VerifyCardResponse.java | 20 ++++++++ .../io/craftgate/sample/PaymentSample.java | 46 +++++++++++++++++++ 9 files changed, 168 insertions(+) create mode 100644 src/main/java/io/craftgate/model/CardVerificationAuthType.java create mode 100644 src/main/java/io/craftgate/model/CardVerifyStatus.java create mode 100644 src/main/java/io/craftgate/request/InitCheckoutCardVerifyRequest.java create mode 100644 src/main/java/io/craftgate/request/VerifyCardRequest.java create mode 100644 src/main/java/io/craftgate/request/dto/VerifyCardDto.java create mode 100644 src/main/java/io/craftgate/response/InitCheckoutCardVerifyResponse.java create mode 100644 src/main/java/io/craftgate/response/VerifyCardResponse.java diff --git a/src/main/java/io/craftgate/adapter/PaymentAdapter.java b/src/main/java/io/craftgate/adapter/PaymentAdapter.java index 4c1f68d..304eeee 100644 --- a/src/main/java/io/craftgate/adapter/PaymentAdapter.java +++ b/src/main/java/io/craftgate/adapter/PaymentAdapter.java @@ -50,6 +50,12 @@ public InitCheckoutPaymentResponse initCheckoutPayment(InitCheckoutPaymentReques initCheckoutPaymentRequest, InitCheckoutPaymentResponse.class); } + public InitCheckoutCardVerifyResponse initCheckoutCardVerify(InitCheckoutCardVerifyRequest initCheckoutCardVerifyRequest) { + String path = "/payment/v1/checkout-card-verify/init"; + return HttpClient.post(requestOptions.getBaseUrl() + path, createHeaders(initCheckoutCardVerifyRequest, path, requestOptions), + initCheckoutCardVerifyRequest, InitCheckoutCardVerifyResponse.class); + } + public PaymentResponse retrieveCheckoutPayment(String token) { String path = "/payment/v1/checkout-payments/" + token; return HttpClient.get(requestOptions.getBaseUrl() + path, createHeaders(path, requestOptions), PaymentResponse.class); @@ -201,6 +207,12 @@ public void deleteStoredCard(DeleteStoredCardRequest deleteStoredCardRequest) { deleteStoredCardRequest, Void.class); } + public VerifyCardResponse verifyCard(VerifyCardRequest verifyCardRequest) { + String path = "/payment/v1/cards/verify"; + return HttpClient.post(requestOptions.getBaseUrl() + path, createHeaders(verifyCardRequest, path, requestOptions), + verifyCardRequest, VerifyCardResponse.class); + } + public PaymentTransactionApprovalListResponse approvePaymentTransactions(ApprovePaymentTransactionsRequest approvePaymentTransactionsRequest) { String path = "/payment/v1/payment-transactions/approve"; return HttpClient.post(requestOptions.getBaseUrl() + path, createHeaders(approvePaymentTransactionsRequest, path, requestOptions), diff --git a/src/main/java/io/craftgate/model/CardVerificationAuthType.java b/src/main/java/io/craftgate/model/CardVerificationAuthType.java new file mode 100644 index 0000000..a72af95 --- /dev/null +++ b/src/main/java/io/craftgate/model/CardVerificationAuthType.java @@ -0,0 +1,8 @@ +package io.craftgate.model; + +public enum CardVerificationAuthType { + + NON_THREE_DS, + THREE_DS, + NONE +} diff --git a/src/main/java/io/craftgate/model/CardVerifyStatus.java b/src/main/java/io/craftgate/model/CardVerifyStatus.java new file mode 100644 index 0000000..b1a2583 --- /dev/null +++ b/src/main/java/io/craftgate/model/CardVerifyStatus.java @@ -0,0 +1,8 @@ +package io.craftgate.model; + +public enum CardVerifyStatus { + + SUCCESS, + FAILURE, + THREE_DS_PENDING +} diff --git a/src/main/java/io/craftgate/request/InitCheckoutCardVerifyRequest.java b/src/main/java/io/craftgate/request/InitCheckoutCardVerifyRequest.java new file mode 100644 index 0000000..d75b197 --- /dev/null +++ b/src/main/java/io/craftgate/request/InitCheckoutCardVerifyRequest.java @@ -0,0 +1,22 @@ +package io.craftgate.request; + +import io.craftgate.model.CardVerificationAuthType; +import io.craftgate.model.Currency; +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Builder +public class InitCheckoutCardVerifyRequest { + + protected BigDecimal verificationPrice; + protected Currency currency; + protected String conversationId; + protected String callbackUrl; + protected String cardUserKey; + protected CardVerificationAuthType paymentAuthenticationType; + protected Long ttl; + +} \ No newline at end of file diff --git a/src/main/java/io/craftgate/request/VerifyCardRequest.java b/src/main/java/io/craftgate/request/VerifyCardRequest.java new file mode 100644 index 0000000..460c4f3 --- /dev/null +++ b/src/main/java/io/craftgate/request/VerifyCardRequest.java @@ -0,0 +1,23 @@ +package io.craftgate.request; + +import io.craftgate.model.CardVerificationAuthType; +import io.craftgate.model.Currency; +import io.craftgate.request.dto.VerifyCardDto; +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Builder +public class VerifyCardRequest { + + private VerifyCardDto card; + private CardVerificationAuthType paymentAuthenticationType; + private BigDecimal verificationPrice; + private Currency currency; + private String clientIp; + private String conversationId; + private String callbackUrl; + private String checkoutCardVerifyToken; +} diff --git a/src/main/java/io/craftgate/request/dto/VerifyCardDto.java b/src/main/java/io/craftgate/request/dto/VerifyCardDto.java new file mode 100644 index 0000000..9c18e69 --- /dev/null +++ b/src/main/java/io/craftgate/request/dto/VerifyCardDto.java @@ -0,0 +1,16 @@ +package io.craftgate.request.dto; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class VerifyCardDto { + private String cardHolderName; + private String cardNumber; + private String expireYear; + private String expireMonth; + private String cvc; + private String cardAlias; + private String cardUserKey; +} diff --git a/src/main/java/io/craftgate/response/InitCheckoutCardVerifyResponse.java b/src/main/java/io/craftgate/response/InitCheckoutCardVerifyResponse.java new file mode 100644 index 0000000..3dc3360 --- /dev/null +++ b/src/main/java/io/craftgate/response/InitCheckoutCardVerifyResponse.java @@ -0,0 +1,13 @@ +package io.craftgate.response; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class InitCheckoutCardVerifyResponse { + + protected String token; + protected String pageUrl; + protected LocalDateTime tokenExpireDate; +} diff --git a/src/main/java/io/craftgate/response/VerifyCardResponse.java b/src/main/java/io/craftgate/response/VerifyCardResponse.java new file mode 100644 index 0000000..72f9661 --- /dev/null +++ b/src/main/java/io/craftgate/response/VerifyCardResponse.java @@ -0,0 +1,20 @@ +package io.craftgate.response; + +import io.craftgate.model.CardVerifyStatus; +import io.craftgate.model.RefundStatus; +import lombok.Data; + +@Data +public class VerifyCardResponse { + + + private String cardUserKey; + private String cardToken; + private String htmlContent; + private String redirectUrl; + private String merchantCallbackUrl; + private RefundStatus refundStatus; + private CardVerifyStatus cardVerifyStatus; + + +} diff --git a/src/test/java/io/craftgate/sample/PaymentSample.java b/src/test/java/io/craftgate/sample/PaymentSample.java index 9f95c00..a2178ac 100644 --- a/src/test/java/io/craftgate/sample/PaymentSample.java +++ b/src/test/java/io/craftgate/sample/PaymentSample.java @@ -7,6 +7,7 @@ import io.craftgate.request.dto.Card; import io.craftgate.request.dto.GarantiPayInstallment; import io.craftgate.request.dto.PaymentItem; +import io.craftgate.request.dto.VerifyCardDto; import io.craftgate.response.*; import org.junit.jupiter.api.Test; @@ -2256,4 +2257,49 @@ void should_not_validate_3D_secure_callback_when_hashes_are_not_equal() { //then assertFalse(isVerified); } + + @Test + void init_checkout_card_verify_with_non_3ds_auth_type() { + InitCheckoutCardVerifyRequest request = InitCheckoutCardVerifyRequest.builder() + .callbackUrl("https://www.your-website.com/craftgate-checkout-card-verify-callback") + .conversationId("456d1297-908e-4bd6-a13b-4be31a6e47d5") + .paymentAuthenticationType(CardVerificationAuthType.NON_THREE_DS) + .verificationPrice(BigDecimal.TEN) + .currency(Currency.TRY) + .build(); + + InitCheckoutCardVerifyResponse response = craftgate.payment().initCheckoutCardVerify(request); + + assertNotNull(response); + assertNotNull(response.getPageUrl()); + assertNotNull(response.getToken()); + assertNotNull(response.getTokenExpireDate()); + } + + @Test + void verify_card_with_3ds() { + VerifyCardRequest request = VerifyCardRequest.builder() + .card(VerifyCardDto.builder() + .cardHolderName("Haluk Demir") + .cardNumber("5258640000000001") + .expireYear("2044") + .expireMonth("07") + .cvc("000") + .cardAlias("My YKB Card") + .build()) + + .paymentAuthenticationType(CardVerificationAuthType.THREE_DS) + .callbackUrl("https://www.your-website.com/craftgate-3DSecure-card-verify-callback") + .conversationId("456d1297-908e-4bd6-a13b-4be31a6e47d5") + .verificationPrice(BigDecimal.TEN) + .currency(Currency.TRY) + .clientIp("127.0.0.1") + .build(); + + VerifyCardResponse response = craftgate.payment().verifyCard(request); + + assertNotNull(response); + assertEquals(CardVerifyStatus.THREE_DS_PENDING, response.getCardVerifyStatus()); + assertNotNull(response.getHtmlContent()); + } } From edd9276990b653e1d35cc01533b074dc54331e17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Y=C4=B1ld=C4=B1z?= Date: Wed, 4 Feb 2026 15:43:27 +0300 Subject: [PATCH 2/3] Update card verification endpoints --- .../request/InitCheckoutCardVerifyRequest.java | 14 +++++++------- .../io/craftgate/request/VerifyCardRequest.java | 5 ++--- .../dto/{VerifyCardDto.java => VerifyCard.java} | 2 +- .../java/io/craftgate/sample/PaymentSample.java | 4 ++-- 4 files changed, 12 insertions(+), 13 deletions(-) rename src/main/java/io/craftgate/request/dto/{VerifyCardDto.java => VerifyCard.java} (91%) diff --git a/src/main/java/io/craftgate/request/InitCheckoutCardVerifyRequest.java b/src/main/java/io/craftgate/request/InitCheckoutCardVerifyRequest.java index d75b197..b36fcb0 100644 --- a/src/main/java/io/craftgate/request/InitCheckoutCardVerifyRequest.java +++ b/src/main/java/io/craftgate/request/InitCheckoutCardVerifyRequest.java @@ -11,12 +11,12 @@ @Builder public class InitCheckoutCardVerifyRequest { - protected BigDecimal verificationPrice; - protected Currency currency; - protected String conversationId; - protected String callbackUrl; - protected String cardUserKey; - protected CardVerificationAuthType paymentAuthenticationType; - protected Long ttl; + private BigDecimal verificationPrice; + private Currency currency; + private String conversationId; + private String callbackUrl; + private String cardUserKey; + private CardVerificationAuthType paymentAuthenticationType; + private Long ttl; } \ No newline at end of file diff --git a/src/main/java/io/craftgate/request/VerifyCardRequest.java b/src/main/java/io/craftgate/request/VerifyCardRequest.java index 460c4f3..0909d97 100644 --- a/src/main/java/io/craftgate/request/VerifyCardRequest.java +++ b/src/main/java/io/craftgate/request/VerifyCardRequest.java @@ -2,7 +2,7 @@ import io.craftgate.model.CardVerificationAuthType; import io.craftgate.model.Currency; -import io.craftgate.request.dto.VerifyCardDto; +import io.craftgate.request.dto.VerifyCard; import lombok.Builder; import lombok.Data; @@ -12,12 +12,11 @@ @Builder public class VerifyCardRequest { - private VerifyCardDto card; + private VerifyCard card; private CardVerificationAuthType paymentAuthenticationType; private BigDecimal verificationPrice; private Currency currency; private String clientIp; private String conversationId; private String callbackUrl; - private String checkoutCardVerifyToken; } diff --git a/src/main/java/io/craftgate/request/dto/VerifyCardDto.java b/src/main/java/io/craftgate/request/dto/VerifyCard.java similarity index 91% rename from src/main/java/io/craftgate/request/dto/VerifyCardDto.java rename to src/main/java/io/craftgate/request/dto/VerifyCard.java index 9c18e69..3aab8c5 100644 --- a/src/main/java/io/craftgate/request/dto/VerifyCardDto.java +++ b/src/main/java/io/craftgate/request/dto/VerifyCard.java @@ -5,7 +5,7 @@ @Data @Builder -public class VerifyCardDto { +public class VerifyCard { private String cardHolderName; private String cardNumber; private String expireYear; diff --git a/src/test/java/io/craftgate/sample/PaymentSample.java b/src/test/java/io/craftgate/sample/PaymentSample.java index a2178ac..5e42b4f 100644 --- a/src/test/java/io/craftgate/sample/PaymentSample.java +++ b/src/test/java/io/craftgate/sample/PaymentSample.java @@ -7,7 +7,7 @@ import io.craftgate.request.dto.Card; import io.craftgate.request.dto.GarantiPayInstallment; import io.craftgate.request.dto.PaymentItem; -import io.craftgate.request.dto.VerifyCardDto; +import io.craftgate.request.dto.VerifyCard; import io.craftgate.response.*; import org.junit.jupiter.api.Test; @@ -2279,7 +2279,7 @@ void init_checkout_card_verify_with_non_3ds_auth_type() { @Test void verify_card_with_3ds() { VerifyCardRequest request = VerifyCardRequest.builder() - .card(VerifyCardDto.builder() + .card(VerifyCard.builder() .cardHolderName("Haluk Demir") .cardNumber("5258640000000001") .expireYear("2044") From 2b6875da87ee5c7afa85aaa6c525fbaf2b4b1036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Y=C4=B1ld=C4=B1z?= Date: Wed, 4 Feb 2026 15:44:52 +0300 Subject: [PATCH 3/3] Update card verification endpoints --- .../craftgate/response/InitCheckoutCardVerifyResponse.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/craftgate/response/InitCheckoutCardVerifyResponse.java b/src/main/java/io/craftgate/response/InitCheckoutCardVerifyResponse.java index 3dc3360..f8f76b8 100644 --- a/src/main/java/io/craftgate/response/InitCheckoutCardVerifyResponse.java +++ b/src/main/java/io/craftgate/response/InitCheckoutCardVerifyResponse.java @@ -7,7 +7,7 @@ @Data public class InitCheckoutCardVerifyResponse { - protected String token; - protected String pageUrl; - protected LocalDateTime tokenExpireDate; + private String token; + private String pageUrl; + private LocalDateTime tokenExpireDate; }