diff --git a/src/main/java/io/craftgate/adapter/MealVoucherCardTokenizationAdapter.java b/src/main/java/io/craftgate/adapter/MealVoucherCardTokenizationAdapter.java index 68325fb9..dc3c55dd 100644 --- a/src/main/java/io/craftgate/adapter/MealVoucherCardTokenizationAdapter.java +++ b/src/main/java/io/craftgate/adapter/MealVoucherCardTokenizationAdapter.java @@ -1,9 +1,13 @@ package io.craftgate.adapter; import io.craftgate.net.HttpClient; +import io.craftgate.request.MealVoucherCardTokenizationCompleteRequest; import io.craftgate.request.MealVoucherCardTokenizationInitRequest; +import io.craftgate.request.MealVoucherCardTokenizationRegenerateRequest; import io.craftgate.request.common.RequestOptions; +import io.craftgate.response.MealVoucherCardTokenizationCompleteResponse; import io.craftgate.response.MealVoucherCardTokenizationInitResponse; +import io.craftgate.response.MealVoucherCardTokenizationRegenerateResponse; public class MealVoucherCardTokenizationAdapter extends BaseAdapter { @@ -16,4 +20,16 @@ public MealVoucherCardTokenizationInitResponse cardTokenizationInit(MealVoucherC return HttpClient.post(requestOptions.getBaseUrl() + path, createHeaders(mealVoucherCardTokenizationInitRequest, path, requestOptions), mealVoucherCardTokenizationInitRequest, MealVoucherCardTokenizationInitResponse.class); } + + public MealVoucherCardTokenizationRegenerateResponse cardTokenizationRegenerate(String sessionId, MealVoucherCardTokenizationRegenerateRequest mealVoucherCardTokenizationRegenerateRequest) { + String path = "/payment/v1/meal-voucher/card-tokenizations/" + sessionId + "/regenerate"; + return HttpClient.post(requestOptions.getBaseUrl() + path, createHeaders(mealVoucherCardTokenizationRegenerateRequest, path, requestOptions), + mealVoucherCardTokenizationRegenerateRequest, MealVoucherCardTokenizationRegenerateResponse.class); + } + + public MealVoucherCardTokenizationCompleteResponse cardTokenizationComplete(String sessionId, MealVoucherCardTokenizationCompleteRequest request) { + String path = "/payment/v1/meal-voucher/card-tokenizations/" + sessionId + "/complete"; + return HttpClient.post(requestOptions.getBaseUrl() + path, createHeaders(request, path, requestOptions), + request, MealVoucherCardTokenizationCompleteResponse.class); + } } \ No newline at end of file diff --git a/src/main/java/io/craftgate/request/InitApmPaymentRequest.java b/src/main/java/io/craftgate/request/InitApmPaymentRequest.java index 9c5aa487..c6128f29 100644 --- a/src/main/java/io/craftgate/request/InitApmPaymentRequest.java +++ b/src/main/java/io/craftgate/request/InitApmPaymentRequest.java @@ -31,7 +31,7 @@ public class InitApmPaymentRequest extends BaseRequest { private String callbackUrl; private String apmOrderId; private String apmUserIdentity; - private Map additionalParams; + private Map additionalParams; private String clientIp; private List items; } \ No newline at end of file diff --git a/src/main/java/io/craftgate/request/InitBkmExpressRequest.java b/src/main/java/io/craftgate/request/InitBkmExpressRequest.java index b532076f..7a9fcc84 100644 --- a/src/main/java/io/craftgate/request/InitBkmExpressRequest.java +++ b/src/main/java/io/craftgate/request/InitBkmExpressRequest.java @@ -3,14 +3,14 @@ import io.craftgate.model.Currency; import io.craftgate.model.PaymentGroup; import io.craftgate.model.PaymentPhase; +import io.craftgate.request.common.BaseRequest; import io.craftgate.request.dto.PaymentItem; -import lombok.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.SuperBuilder; import java.math.BigDecimal; import java.util.List; -import lombok.experimental.SuperBuilder; -import lombok.EqualsAndHashCode; -import io.craftgate.request.common.BaseRequest; @Data @SuperBuilder diff --git a/src/main/java/io/craftgate/request/MealVoucherCardTokenizationCompleteRequest.java b/src/main/java/io/craftgate/request/MealVoucherCardTokenizationCompleteRequest.java new file mode 100644 index 00000000..4269c5b3 --- /dev/null +++ b/src/main/java/io/craftgate/request/MealVoucherCardTokenizationCompleteRequest.java @@ -0,0 +1,14 @@ +package io.craftgate.request; + +import io.craftgate.request.common.BaseRequest; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.SuperBuilder; + +@Data +@EqualsAndHashCode(callSuper = false) +@SuperBuilder +public class MealVoucherCardTokenizationCompleteRequest extends BaseRequest { + + private String validationCode; +} diff --git a/src/main/java/io/craftgate/request/MealVoucherCardTokenizationRegenerateRequest.java b/src/main/java/io/craftgate/request/MealVoucherCardTokenizationRegenerateRequest.java new file mode 100644 index 00000000..1c06fd5c --- /dev/null +++ b/src/main/java/io/craftgate/request/MealVoucherCardTokenizationRegenerateRequest.java @@ -0,0 +1,15 @@ +package io.craftgate.request; + +import io.craftgate.request.common.BaseRequest; +import io.craftgate.request.dto.MealVoucherCardTokenizationData; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.SuperBuilder; + +@Data +@EqualsAndHashCode(callSuper = false) +@SuperBuilder +public class MealVoucherCardTokenizationRegenerateRequest extends BaseRequest { + + private MealVoucherCardTokenizationData mealVoucherCardTokenizationData; +} diff --git a/src/main/java/io/craftgate/request/common/HashGenerator.java b/src/main/java/io/craftgate/request/common/HashGenerator.java index 63089681..435081bb 100644 --- a/src/main/java/io/craftgate/request/common/HashGenerator.java +++ b/src/main/java/io/craftgate/request/common/HashGenerator.java @@ -1,15 +1,12 @@ package io.craftgate.request.common; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonDeserializer; import io.craftgate.exception.CraftgateException; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.digest.DigestUtils; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; -import java.time.LocalDateTime; public final class HashGenerator { diff --git a/src/main/java/io/craftgate/request/dto/EncryptedCard.java b/src/main/java/io/craftgate/request/dto/EncryptedCard.java index 155ecd49..eaf19e65 100644 --- a/src/main/java/io/craftgate/request/dto/EncryptedCard.java +++ b/src/main/java/io/craftgate/request/dto/EncryptedCard.java @@ -1,10 +1,8 @@ package io.craftgate.request.dto; -import io.craftgate.model.TokenizedCardType; import lombok.Builder; import lombok.Data; -import java.util.Map; @Data @Builder public class EncryptedCard { diff --git a/src/main/java/io/craftgate/request/dto/MealVoucherCardTokenizationData.java b/src/main/java/io/craftgate/request/dto/MealVoucherCardTokenizationData.java index 9d190871..c1ab5f04 100644 --- a/src/main/java/io/craftgate/request/dto/MealVoucherCardTokenizationData.java +++ b/src/main/java/io/craftgate/request/dto/MealVoucherCardTokenizationData.java @@ -25,16 +25,43 @@ public static MealVoucherCardTokenizationData buildForMultinet(String userRefere .build(); } + public static MealVoucherCardTokenizationData buildForMultinet(String callbackUrl) { + return MealVoucherCardTokenizationData.builder() + .callbackUrl(callbackUrl) + .build(); + } + + public static MealVoucherCardTokenizationData buildForEdenred(String userReferenceNumber, String callbackUrl) { + return MealVoucherCardTokenizationData.builder() + .userReferenceNumber(userReferenceNumber) + .callbackUrl(callbackUrl) + .build(); + } + + public static MealVoucherCardTokenizationData buildForEdenred(String callbackUrl) { + return MealVoucherCardTokenizationData.builder() + .callbackUrl(callbackUrl) + .build(); + } + public static MealVoucherCardTokenizationData buildForSetcard(String callbackUrl){ return MealVoucherCardTokenizationData.builder() .callbackUrl(callbackUrl) .build(); } - public static MealVoucherCardTokenizationData buildForMetropol(String userReferenceNumber, String cardNumber ){ + public static MealVoucherCardTokenizationData buildForMetropol(String userReferenceNumber, String cardNumber, String gsmNumber){ return MealVoucherCardTokenizationData.builder() .userReferenceNumber(userReferenceNumber) .cardNumber(cardNumber) + .gsmNumber(gsmNumber) + .build(); + } + + public static MealVoucherCardTokenizationData buildForMetropol(String cardNumber, String gsmNumber) { + return MealVoucherCardTokenizationData.builder() + .cardNumber(cardNumber) + .gsmNumber(gsmNumber) .build(); } @@ -43,4 +70,11 @@ public static MealVoucherCardTokenizationData buildForPluxee(String callbackUrl) .callbackUrl(callbackUrl) .build(); } + + public static MealVoucherCardTokenizationData buildForTokenflex(String callbackUrl) { + return MealVoucherCardTokenizationData.builder() + .callbackUrl(callbackUrl) + .build(); + } + } \ No newline at end of file diff --git a/src/main/java/io/craftgate/response/MealVoucherCardTokenizationCompleteResponse.java b/src/main/java/io/craftgate/response/MealVoucherCardTokenizationCompleteResponse.java new file mode 100644 index 00000000..987cfe98 --- /dev/null +++ b/src/main/java/io/craftgate/response/MealVoucherCardTokenizationCompleteResponse.java @@ -0,0 +1,14 @@ +package io.craftgate.response; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class MealVoucherCardTokenizationCompleteResponse { + + private String sessionId; + private String maskedCardNumber; + private String fingerprint; + private BigDecimal balance; +} diff --git a/src/main/java/io/craftgate/response/MealVoucherCardTokenizationRegenerateResponse.java b/src/main/java/io/craftgate/response/MealVoucherCardTokenizationRegenerateResponse.java new file mode 100644 index 00000000..6282d5e3 --- /dev/null +++ b/src/main/java/io/craftgate/response/MealVoucherCardTokenizationRegenerateResponse.java @@ -0,0 +1,17 @@ +package io.craftgate.response; + +import io.craftgate.model.ApmAdditionalAction; +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class MealVoucherCardTokenizationRegenerateResponse { + + private ApmAdditionalAction additionalAction; + private String sessionId; + private String htmlContent; + private String redirectUrl; +} diff --git a/src/test/java/io/craftgate/sample/BnplPaymentSample.java b/src/test/java/io/craftgate/sample/BnplPaymentSample.java index c990894e..1952346a 100644 --- a/src/test/java/io/craftgate/sample/BnplPaymentSample.java +++ b/src/test/java/io/craftgate/sample/BnplPaymentSample.java @@ -146,7 +146,7 @@ void complete_bnpl_limit_inquiry() { void init_tom_finance_bnpl_payment() { BigDecimal price = new BigDecimal("100"); - Map additionalParams = new HashMap<>(); + Map additionalParams = new HashMap<>(); additionalParams.put("buyerName", "John Doe"); additionalParams.put("buyerPhoneNumber", "5551112233"); diff --git a/src/test/java/io/craftgate/sample/MealVoucherCardTokenizationSample.java b/src/test/java/io/craftgate/sample/MealVoucherCardTokenizationSample.java index 3b939484..32470ce5 100644 --- a/src/test/java/io/craftgate/sample/MealVoucherCardTokenizationSample.java +++ b/src/test/java/io/craftgate/sample/MealVoucherCardTokenizationSample.java @@ -3,9 +3,13 @@ import io.craftgate.Craftgate; import io.craftgate.model.ApmAdditionalAction; import io.craftgate.model.ApmType; +import io.craftgate.request.MealVoucherCardTokenizationCompleteRequest; import io.craftgate.request.MealVoucherCardTokenizationInitRequest; +import io.craftgate.request.MealVoucherCardTokenizationRegenerateRequest; import io.craftgate.request.dto.MealVoucherCardTokenizationData; +import io.craftgate.response.MealVoucherCardTokenizationCompleteResponse; import io.craftgate.response.MealVoucherCardTokenizationInitResponse; +import io.craftgate.response.MealVoucherCardTokenizationRegenerateResponse; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -28,4 +32,32 @@ void init_meal_voucher_card_tokenization() { assertNotNull(response.getSessionId()); assertEquals(ApmAdditionalAction.SHOW_HTML_CONTENT, response.getAdditionalAction()); } + + @Test + void regenerate_meal_voucher_card_tokenization() { + String sessionId = "session-id"; + MealVoucherCardTokenizationRegenerateRequest request = MealVoucherCardTokenizationRegenerateRequest.builder() + .mealVoucherCardTokenizationData(MealVoucherCardTokenizationData.buildForMetropol("6375780115068760", "5556667788")) + .build(); + + MealVoucherCardTokenizationRegenerateResponse response = craftgate.mealVoucherCardTokenizationAdapter().cardTokenizationRegenerate(sessionId, request); + + assertNotNull(response.getSessionId()); + assertEquals(ApmAdditionalAction.OTP_REQUIRED, response.getAdditionalAction()); + } + + @Test + void complete_meal_voucher_card_tokenization() { + String sessionId = "session-id"; + MealVoucherCardTokenizationCompleteRequest request = MealVoucherCardTokenizationCompleteRequest.builder() + .validationCode("123456") + .build(); + + MealVoucherCardTokenizationCompleteResponse response = craftgate.mealVoucherCardTokenizationAdapter().cardTokenizationComplete(sessionId, request); + + assertNotNull(response.getSessionId()); + assertNotNull(response.getMaskedCardNumber()); + assertNotNull(response.getFingerprint()); + assertNotNull(response.getBalance()); + } } diff --git a/src/test/java/io/craftgate/sample/PaymentSample.java b/src/test/java/io/craftgate/sample/PaymentSample.java index 32d1df09..c2e7f1dc 100644 --- a/src/test/java/io/craftgate/sample/PaymentSample.java +++ b/src/test/java/io/craftgate/sample/PaymentSample.java @@ -1105,7 +1105,7 @@ void init_sodexo_apm_payment() { .callbackUrl("https://www.your-website.com/craftgate-apm-callback") .apmUserIdentity("5555555555") .items(items) - .additionalParams(new HashMap() {{ + .additionalParams(new HashMap() {{ put("sodexoCode", "843195"); }}) .build(); @@ -1192,7 +1192,7 @@ void init_tokenflex_apm_payment() { .conversationId("456d1297-908e-4bd6-a13b-4be31a6e47d5") .externalId("optional-externalId") .callbackUrl("https://www.your-website.com/craftgate-apm-callback") - .additionalParams(new HashMap() {{ + .additionalParams(new HashMap() {{ put("paymentCode", "123456"); }}) .items(items) @@ -1244,7 +1244,7 @@ void init_tokenflex_gift_apm_payment() { .conversationId("456d1297-908e-4bd6-a13b-4be31a6e47d5") .externalId("optional-externalId") .callbackUrl("https://www.your-website.com/craftgate-apm-callback") - .additionalParams(new HashMap() {{ + .additionalParams(new HashMap() {{ put("paymentCode", "123456"); }}) .items(items) @@ -1331,7 +1331,7 @@ void init_iwallet_apm_payment() { .conversationId("456d1297-908e-4bd6-a13b-4be31a6e47d5") .externalId("optional-externalId") .callbackUrl("https://www.your-website.com/craftgate-apm-callback") - .additionalParams(new HashMap() {{ + .additionalParams(new HashMap() {{ put("cardNumber", "1111222233334444"); }}) .items(items) @@ -1374,7 +1374,7 @@ void init_klarna_apm_payment() { .price(BigDecimal.valueOf(0.40)) .build()); - Map additionalParams = new HashMap<>(); + Map additionalParams = new HashMap<>(); additionalParams.put("country", "de"); additionalParams.put("locale", "en-DE"); @@ -1452,7 +1452,7 @@ void init_metropol_apm_payment() { .conversationId("myConversationId") .externalId("optional-externalId") .items(items) - .additionalParams(new HashMap() {{ + .additionalParams(new HashMap() {{ put("cardNumber", "6375780115068760"); }}) .build(); @@ -1541,7 +1541,7 @@ void init_tompay_apm_payment() { .externalId("externalId") .callbackUrl("https://www.your-website.com/craftgate-apm-callback") .items(items) - .additionalParams(new HashMap() {{ + .additionalParams(new HashMap() {{ put("channel", "channel"); put("phone", "5001112233"); }}) @@ -1604,7 +1604,7 @@ void init_bizum_apm_payment() { .price(BigDecimal.valueOf(0.4)) .build()); - Map additionalParams = new HashMap<>(); + Map additionalParams = new HashMap<>(); additionalParams.put("buyerPhoneNumber", "34700000000"); InitApmPaymentRequest request = InitApmPaymentRequest.builder() @@ -1641,7 +1641,7 @@ void init_mbway_apm_payment() { .price(BigDecimal.valueOf(0.4)) .build()); - Map additionalParams = new HashMap<>(); + Map additionalParams = new HashMap<>(); additionalParams.put("buyerPhoneNumber", "34700000000"); InitApmPaymentRequest request = InitApmPaymentRequest.builder() @@ -1678,7 +1678,7 @@ void init_paycell_dcb_apm_payment() { .price(BigDecimal.valueOf(0.4)) .build()); - Map additionalParams = new HashMap<>(); + Map additionalParams = new HashMap<>(); additionalParams.put("paycellGsmNumber", "5305289290"); InitApmPaymentRequest request = InitApmPaymentRequest.builder() @@ -1721,7 +1721,7 @@ void init_paymob_apm_payment() { .externalId("externalId") .callbackUrl("https://www.your-website.com/craftgate-apm-callback") .items(items) - .additionalParams(new HashMap() {{ + .additionalParams(new HashMap() {{ put("integrationId", "11223344"); }}) .build(); @@ -1822,7 +1822,7 @@ void init_setcard_apm_payment() { .price(BigDecimal.valueOf(0.4)) .build()); - Map additionalParams = new HashMap<>(); + Map additionalParams = new HashMap<>(); additionalParams.put("cardNumber", "7599640961180814"); InitApmPaymentRequest request = InitApmPaymentRequest.builder()