From e8fba1bf9024822c5ac29024c1a285d67fb8b32d Mon Sep 17 00:00:00 2001 From: deepu105 Date: Fri, 2 Apr 2021 16:16:58 +0200 Subject: [PATCH] update to latest libs --- build.gradle | 4 +- .../Main.java => checkout/Application.java} | 147 +++++++----------- .../CheckoutService.java} | 64 +++++--- src/main/java/controller/FrontendParser.java | 27 ---- src/main/java/model/PaymentMethods.java | 24 --- src/main/java/model/PaymentsDetails.java | 19 --- src/main/resources/templates/component.html | 14 +- 7 files changed, 109 insertions(+), 190 deletions(-) rename src/main/java/{controller/Main.java => checkout/Application.java} (64%) rename src/main/java/{model/Payments.java => checkout/CheckoutService.java} (64%) delete mode 100644 src/main/java/controller/FrontendParser.java delete mode 100644 src/main/java/model/PaymentMethods.java delete mode 100644 src/main/java/model/PaymentsDetails.java diff --git a/build.gradle b/build.gradle index 810ae56..69b4a32 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ Project name: ${project.name} """ application { - mainClassName = 'controller.Main' + mainClassName = 'checkout.Application' } repositories { @@ -24,5 +24,5 @@ dependencies { implementation 'org.slf4j:slf4j-simple:1.7.25' implementation 'com.sparkjava:spark-template-jinjava:2.7.1' implementation 'org.apache.httpcomponents:httpclient:4.5.11' - implementation 'com.adyen:adyen-java-api-library:11.0.1' + implementation 'com.adyen:adyen-java-api-library:13.0.0' } diff --git a/src/main/java/controller/Main.java b/src/main/java/checkout/Application.java similarity index 64% rename from src/main/java/controller/Main.java rename to src/main/java/checkout/Application.java index 30b14b7..fcfff1e 100644 --- a/src/main/java/controller/Main.java +++ b/src/main/java/checkout/Application.java @@ -1,25 +1,15 @@ -package controller; +package checkout; import java.io.BufferedInputStream; -import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Properties; -import com.adyen.Client; -import com.adyen.enums.Environment; -import com.adyen.model.checkout.PaymentMethodsResponse; -import com.adyen.model.checkout.PaymentsDetailsRequest; -import com.adyen.model.checkout.PaymentsRequest; -import com.adyen.model.checkout.PaymentsResponse; -import com.adyen.service.Checkout; +import com.adyen.model.checkout.*; import com.google.gson.Gson; -import model.PaymentMethods; -import model.Payments; -import model.PaymentsDetails; import spark.QueryParamsMap; import spark.Response; import view.RenderUtil; @@ -31,25 +21,20 @@ import static spark.Spark.post; import static spark.Spark.staticFiles; -public class Main { +public class Application { - private static final File FAVICON_PATH = new File("src/main/resources/static/img/favicon.ico"); - private static final String configFile = "config.properties"; + private static final String CONFIG_FILE = "config.properties"; private static final Gson gson = new Gson(); - private static String apiKey = ""; - private static String clientKey = ""; - - public static String merchantAccount = ""; - public static Checkout checkout; - public static Map paymentDataStore = new HashMap<>(); - public static void main(String[] args) { port(8080); staticFiles.location("/static"); - readConfigFile(); - checkout = new Checkout(new Client(apiKey, Environment.TEST)); + Properties prop = readConfigFile(); + String clientKey = prop.getProperty("clientKey"); + CheckoutService checkoutService = new CheckoutService(prop); + // Routes + get("/", (req, res) -> { Map context = new HashMap<>(); return RenderUtil.render(context, "templates/home.html"); @@ -74,66 +59,6 @@ public class Main { return RenderUtil.render(context, "templates/component.html"); }); - post("/api/getPaymentMethods", (req, res) -> { - PaymentMethodsResponse response = PaymentMethods.getPaymentMethods(""); - return gson.toJson(response); - }); - - post("/api/initiatePayment", (req, res) -> { - System.out.println("Response received from client:\n" + req.body()); - PaymentsRequest request = gson.fromJson(req.body(), PaymentsRequest.class); - PaymentsResponse response = Payments.makePayment(request); - return gson.toJson(response); - - }); - - post("/api/submitAdditionalDetails", (req, res) -> { - PaymentsDetailsRequest details = gson.fromJson(req.body(), PaymentsDetailsRequest.class); - PaymentsResponse paymentsDetails = PaymentsDetails.getPaymentsDetails(details); - return gson.toJson(paymentsDetails); - }); - - get("/api/handleShopperRedirect", (req, res) -> { - System.out.println("GET redirect handler"); - - PaymentsDetailsRequest detailsRequest = new PaymentsDetailsRequest(); - QueryParamsMap queryMap = req.queryMap(); - - if (queryMap.hasKey("redirectResult")) { - detailsRequest.setDetails(Collections.singletonMap("redirectResult", queryMap.value("redirectResult"))); - - } else if (queryMap.hasKey("payload")) { - detailsRequest.setDetails(Collections.singletonMap("payload", queryMap.value("payload"))); - } - detailsRequest.setPaymentData(paymentDataStore.get(queryMap.value("orderRef"))); - - PaymentsResponse response = PaymentsDetails.getPaymentsDetails(detailsRequest); - PaymentsResponse.ResultCodeEnum result = response.getResultCode(); - - setRedirect(result, res); - return res; - }); - - - post("/api/handleShopperRedirect", (req, res) -> { - System.out.println("POST redirect handler"); - QueryParamsMap queryMap = req.queryMap(); - - PaymentsDetailsRequest detailsRequest = new PaymentsDetailsRequest(); - HashMap details = new HashMap<>(); - details.put("MD", queryMap.value("MD")); - details.put("PaRes", queryMap.value("PaRes")); - detailsRequest.setDetails(details); - detailsRequest.setPaymentData(paymentDataStore.get(queryMap.value("orderRef"))); - - PaymentsResponse response = PaymentsDetails.getPaymentsDetails(detailsRequest); - PaymentsResponse.ResultCodeEnum result = response.getResultCode(); - - setRedirect(result, res); - return res; - }); - - path("/result", () -> { get("/success", (req, res) -> { Map context = new HashMap<>(); @@ -156,6 +81,51 @@ public class Main { }); }); + // APIs + + post("/api/getPaymentMethods", (req, res) -> { + PaymentMethodsResponse response = checkoutService.getPaymentMethods(); + return gson.toJson(response); + }); + + post("/api/initiatePayment", (req, res) -> { + System.out.println("Response received from client:\n" + req.body()); + PaymentsRequest request = gson.fromJson(req.body(), PaymentsRequest.class); + PaymentsResponse response = checkoutService.makePayment(request); + return gson.toJson(response); + + }); + + post("/api/submitAdditionalDetails", (req, res) -> { + PaymentsDetailsRequest details = gson.fromJson(req.body(), PaymentsDetailsRequest.class); + PaymentsDetailsResponse paymentsDetails = checkoutService.submitPaymentsDetails(details); + return gson.toJson(paymentsDetails); + }); + + get("/api/handleShopperRedirect", (req, res) -> { + System.out.println("GET redirect handler"); + + PaymentsDetailsRequest detailsRequest = new PaymentsDetailsRequest(); + QueryParamsMap queryMap = req.queryMap(); + + if (queryMap.hasKey("redirectResult")) { + detailsRequest.setDetails(Collections.singletonMap("redirectResult", queryMap.value("redirectResult"))); + + } else if (queryMap.hasKey("payload")) { + detailsRequest.setDetails(Collections.singletonMap("payload", queryMap.value("payload"))); + } + + PaymentsDetailsResponse response = checkoutService.submitPaymentsDetails(detailsRequest); + PaymentsResponse.ResultCodeEnum result = response.getResultCode(); + + setRedirect(result, res); + return res; + }); + + System.out.println("\n----------------------------------------------------------\n\t" + + "Application is running! Access URLs:\n\t" + + "Local: \t\thttp://localhost:8080\n\t" + + "\n----------------------------------------------------------"); } private static void setRedirect(PaymentsResponse.ResultCodeEnum result, Response res) { @@ -172,18 +142,15 @@ public class Main { } } - private static void readConfigFile() { + private static Properties readConfigFile() { Properties prop = new Properties(); - try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(configFile));) { + try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(CONFIG_FILE))) { prop.load(in); } catch (IOException e) { e.printStackTrace(); } - - merchantAccount = prop.getProperty("merchantAccount"); - apiKey = prop.getProperty("apiKey"); - clientKey = prop.getProperty("clientKey"); + return prop; } } diff --git a/src/main/java/model/Payments.java b/src/main/java/checkout/CheckoutService.java similarity index 64% rename from src/main/java/model/Payments.java rename to src/main/java/checkout/CheckoutService.java index 420002f..a43dadf 100644 --- a/src/main/java/model/Payments.java +++ b/src/main/java/checkout/CheckoutService.java @@ -1,25 +1,46 @@ -package model; +package checkout; import java.io.IOException; +import java.util.Properties; import java.util.UUID; +import com.adyen.Client; +import com.adyen.enums.Environment; import com.adyen.model.Amount; -import com.adyen.model.checkout.LineItem; -import com.adyen.model.checkout.PaymentsRequest; -import com.adyen.model.checkout.PaymentsResponse; +import com.adyen.model.checkout.*; +import com.adyen.service.Checkout; import com.adyen.service.exception.ApiException; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import controller.FrontendParser; -import controller.Main; +public class CheckoutService { -public class Payments { - public static PaymentsResponse makePayment(PaymentsRequest paymentsRequest) throws IOException, ApiException { + private final Checkout checkout; + private final String merchantAccount; + + public CheckoutService(final Properties prop) { + merchantAccount = prop.getProperty("merchantAccount"); + checkout = new Checkout(new Client(prop.getProperty("apiKey"), Environment.TEST)); + } + + public PaymentMethodsResponse getPaymentMethods() throws IOException, ApiException { + PaymentMethodsRequest paymentMethodsRequest = new PaymentMethodsRequest(); + paymentMethodsRequest.setMerchantAccount(merchantAccount); + + paymentMethodsRequest.setChannel(PaymentMethodsRequest.ChannelEnum.WEB); + paymentMethodsRequest.setShopperReference("SparkJava Checkout Shopper"); + System.out.println("/paymentMethods context:\n" + paymentMethodsRequest.toString()); + + PaymentMethodsResponse response = checkout.paymentMethods(paymentMethodsRequest); + System.out.println("/paymentMethods response:\n" + response); + return response; + } + + public PaymentsResponse makePayment(PaymentsRequest paymentsRequest) throws IOException, ApiException { String type = paymentsRequest.getPaymentMethod().getType(); - setAmount(paymentsRequest, type); + paymentsRequest.setAmount(getAmount(type)); paymentsRequest.setChannel(PaymentsRequest.ChannelEnum.WEB); - paymentsRequest.setMerchantAccount(Main.merchantAccount); + paymentsRequest.setMerchantAccount(merchantAccount); String orderRef = UUID.randomUUID().toString(); paymentsRequest.setReference(orderRef); @@ -56,21 +77,21 @@ public class Payments { System.out.println("/payments request:\n" + paymentsRequest.toString()); - PaymentsResponse response = Main.checkout.payments(paymentsRequest); - PaymentsResponse formattedResponse = FrontendParser.formatResponseForFrontend(response); + PaymentsResponse response = checkout.payments(paymentsRequest); - if (response.getAction() != null && !response.getAction().getPaymentData().isEmpty()) { - // Set paymentData in local store for /details call after redirect - Main.paymentDataStore.put(orderRef, response.getAction().getPaymentData()); - } + System.out.println("/payments response:\n" + response); + return response; + } - System.out.println("/payments response:\n" + formattedResponse); - return formattedResponse; + public PaymentsDetailsResponse submitPaymentsDetails(PaymentsDetailsRequest paymentsDetailsRequest) throws IOException, ApiException { + System.out.println("/paymentsDetails request:" + paymentsDetailsRequest.toString()); + PaymentsDetailsResponse paymentsDetailsResponse = checkout.paymentsDetails(paymentsDetailsRequest); + System.out.println("paymentsDetails response:\n" + paymentsDetailsResponse.toString()); + return paymentsDetailsResponse; } - private static void setAmount(PaymentsRequest paymentsRequest, String type) { - Amount amount = new Amount(); + private Amount getAmount(String type) { String currency; @@ -91,10 +112,11 @@ public class Payments { default: currency = "EUR"; } + Amount amount = new Amount(); amount.setCurrency(currency); amount.setValue(1000L); - paymentsRequest.setAmount(amount); + return amount; } private static void addLineItems(PaymentsRequest paymentsRequest) { diff --git a/src/main/java/controller/FrontendParser.java b/src/main/java/controller/FrontendParser.java deleted file mode 100644 index 8125a98..0000000 --- a/src/main/java/controller/FrontendParser.java +++ /dev/null @@ -1,27 +0,0 @@ -package controller; - -import java.io.IOException; -import com.adyen.model.checkout.CheckoutPaymentsAction; -import com.adyen.model.checkout.PaymentsResponse; - -public class FrontendParser { - - // Format response being passed back to frontend. Only leave resultCode and action. Don't need to pass back - // The rest of the information - public static PaymentsResponse formatResponseForFrontend(PaymentsResponse unformattedResponse) throws IOException { - - PaymentsResponse.ResultCodeEnum resultCode = unformattedResponse.getResultCode(); - if (resultCode != null) { - PaymentsResponse newPaymentsResponse = new PaymentsResponse(); - newPaymentsResponse.setResultCode(resultCode); - - CheckoutPaymentsAction action = unformattedResponse.getAction(); - if (action != null) { - newPaymentsResponse.setAction(action); - } - return newPaymentsResponse; - } else { - throw new IOException(); - } - } -} diff --git a/src/main/java/model/PaymentMethods.java b/src/main/java/model/PaymentMethods.java deleted file mode 100644 index c3ce14d..0000000 --- a/src/main/java/model/PaymentMethods.java +++ /dev/null @@ -1,24 +0,0 @@ -package model; - -import java.io.IOException; -import com.adyen.model.checkout.PaymentMethodsRequest; -import com.adyen.model.checkout.PaymentMethodsResponse; -import com.adyen.service.exception.ApiException; - -import controller.Main; - -public class PaymentMethods { - - public static PaymentMethodsResponse getPaymentMethods(String type) throws IOException, ApiException { - PaymentMethodsRequest paymentMethodsRequest = new PaymentMethodsRequest(); - paymentMethodsRequest.setMerchantAccount(Main.merchantAccount); - - paymentMethodsRequest.setChannel(PaymentMethodsRequest.ChannelEnum.WEB); - paymentMethodsRequest.setShopperReference("SparkJava Checkout Shopper"); - System.out.println("/paymentMethods context:\n" + paymentMethodsRequest.toString()); - - PaymentMethodsResponse response = Main.checkout.paymentMethods(paymentMethodsRequest); - System.out.println("/paymentMethods response:\n" + response); - return response; - } -} diff --git a/src/main/java/model/PaymentsDetails.java b/src/main/java/model/PaymentsDetails.java deleted file mode 100644 index 9ab6350..0000000 --- a/src/main/java/model/PaymentsDetails.java +++ /dev/null @@ -1,19 +0,0 @@ -package model; - -import java.io.IOException; -import com.adyen.model.checkout.PaymentsDetailsRequest; -import com.adyen.model.checkout.PaymentsResponse; -import com.adyen.service.exception.ApiException; - -import controller.Main; - -public class PaymentsDetails { - - public static PaymentsResponse getPaymentsDetails(PaymentsDetailsRequest paymentsDetailsRequest) throws IOException, ApiException { - System.out.println("/paymentsDetails request:" + paymentsDetailsRequest.toString()); - PaymentsResponse paymentsDetailsResponse = null; - paymentsDetailsResponse = Main.checkout.paymentsDetails(paymentsDetailsRequest); - System.out.println("paymentsDetails response:\n" + paymentsDetailsResponse.toString()); - return paymentsDetailsResponse; - } -} diff --git a/src/main/resources/templates/component.html b/src/main/resources/templates/component.html index dc07a8c..ba3adee 100644 --- a/src/main/resources/templates/component.html +++ b/src/main/resources/templates/component.html @@ -3,9 +3,10 @@ - +
@@ -19,10 +20,9 @@
- - +