diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b163064..4b396df 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -11,7 +11,6 @@ ], "remoteUser": "vscode", "mounts": [ - "source=transbank-maven-cache,target=/home/vscode/.m2,type=volume", "source=${localEnv:HOME}/.ssh,target=/home/vscode/.ssh,type=bind,consistency=cached" ], "features": { diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bb6b6f..472a0e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,15 @@ Toda la historia de cambios de este proyecto será documentada en este archivo. El formato está basado en [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.1.0] - 08-09-2026 + +Esta versión agrega soporte para el producto Oneclick Mall. + +### Agrega + +- Se agrega el producto Webpay Oneclick Mall en su modalidad sincrónica. +- Se agrega el producto Webpay Oneclick Mall en su modalidad diferida. + ## [1.0.1] - 03-10-2025 Pequeñas correcciones aplicadas. diff --git a/pom.xml b/pom.xml index 84611fa..3f0ada2 100644 --- a/pom.xml +++ b/pom.xml @@ -1,30 +1,31 @@ - + 4.0.0 org.springframework.boot spring-boot-starter-parent 3.5.5 - + cl.transbank.webpay transbank-sdk-java-example - 1.0.0 + 1.1.0 transbank-sdk-java-example Proyecto de Ejemplo SDK JAVA - + - + - + - - - - + + + + 17 diff --git a/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallDeferredController.java b/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallDeferredController.java index 469a7ad..32a29a8 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallDeferredController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallDeferredController.java @@ -1,24 +1,31 @@ package cl.transbank.webpay.example.controllers; +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + import cl.transbank.common.IntegrationApiKeys; import cl.transbank.common.IntegrationCommerceCodes; import cl.transbank.common.IntegrationType; import cl.transbank.webpay.common.WebpayOptions; -import cl.transbank.webpay.exception.*; +import cl.transbank.webpay.exception.InscriptionDeleteException; +import cl.transbank.webpay.exception.InscriptionFinishException; +import cl.transbank.webpay.exception.InscriptionStartException; +import cl.transbank.webpay.exception.TransactionAuthorizeException; +import cl.transbank.webpay.exception.TransactionCaptureException; +import cl.transbank.webpay.exception.TransactionRefundException; +import cl.transbank.webpay.exception.TransactionStatusException; import cl.transbank.webpay.oneclick.Oneclick; import cl.transbank.webpay.oneclick.model.MallTransactionCreateDetails; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.log4j.Log4j2; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import java.io.IOException; -import java.util.LinkedHashMap; -import java.util.Map; @Log4j2 @Controller @@ -29,9 +36,9 @@ public class OneclickMallDeferredController extends BaseController { private static final String TEMPLATE_FOLDER = "oneclick_mall_deferred"; private static final String BASE_URL = "/oneclick-mall-deferred"; private static final String PRODUCT = "Webpay Oneclick Mall Diferido"; - private static final String MODEL_NAVIGATION = "navigation"; - private static final String MODEL_RESPONSE = "response_data"; - private static final String MODEL_RESPONSE_JSON = "response_data_json"; + private static final String MODEL_NAVIGATION = "navigation"; + private static final String MODEL_RESPONSE = "response_data"; + private static final String MODEL_RESPONSE_JSON = "response_data_json"; private static final String VIEW_START = TEMPLATE_FOLDER + "/start"; private static final String VIEW_FINISH = TEMPLATE_FOLDER + "/finish"; @@ -96,8 +103,7 @@ public OneclickMallDeferredController() { var options = new WebpayOptions( IntegrationCommerceCodes.ONECLICK_MALL_DEFERRED, IntegrationApiKeys.WEBPAY, - IntegrationType.TEST - ); + IntegrationType.TEST); inscription = new Oneclick.MallInscription(options); transaction = new Oneclick.MallTransaction(options); } @@ -106,12 +112,13 @@ private void addBreadcrumbs(Model model, String label, String url) { Map breadcrumbs = new LinkedHashMap<>(); breadcrumbs.put("Inicio", "/"); breadcrumbs.put(PRODUCT, BASE_URL + "/"); - if (label != null) breadcrumbs.put(label, url); + if (label != null) + breadcrumbs.put(label, url); model.addAttribute("product", PRODUCT); model.addAttribute("breadcrumbs", breadcrumbs); } - @GetMapping("/") + @GetMapping({ "/start" }) public String start(HttpServletRequest req, Model model) throws IOException, InscriptionStartException { @@ -120,15 +127,14 @@ public String start(HttpServletRequest req, Model model) String username = "user_" + getRandomNumber(); String email = "user." + getRandomNumber() + "@example.com"; - String returnUrl = req.getRequestURL().toString() + "finish"; + String returnUrl = req.getRequestURL().toString().replace("start", "finish"); var resp = inscription.start(username, email, returnUrl); model.addAttribute("request_data", Map.of( "username", username, "email", email, - "returnUrl", returnUrl - )); + "returnUrl", returnUrl)); model.addAttribute(MODEL_RESPONSE, resp); model.addAttribute(MODEL_RESPONSE_JSON, toJson(resp)); model.addAttribute("url", resp.getUrlWebpay()); @@ -142,17 +148,17 @@ public String start(HttpServletRequest req, Model model) @GetMapping("/finish") public String finish(HttpServletRequest req, - @RequestParam Map params, - @RequestParam(name = "TBK_TOKEN", required = false) String token, - @RequestParam(name = "TBK_ORDEN_COMPRA", required = false) String ordenCompra, - Model model) + @RequestParam Map params, + @RequestParam(name = "TBK_TOKEN", required = false) String token, + @RequestParam(name = "TBK_ORDEN_COMPRA", required = false) String ordenCompra, + Model model) throws IOException, InscriptionFinishException { - model.addAttribute(MODEL_NAVIGATION, NAV_FINISH); + model.addAttribute(MODEL_NAVIGATION, NAV_FINISH); addBreadcrumbs(model, "Finalizar inscripción", "#"); if (ordenCompra != null) { - model.addAttribute(MODEL_NAVIGATION, NAV_FINISH_RECOVER); + model.addAttribute(MODEL_NAVIGATION, NAV_FINISH_RECOVER); model.addAttribute("request_data_json", toJson(params)); return VIEW_RECOVER_ERROR; } @@ -172,8 +178,7 @@ public String finish(HttpServletRequest req, req.getSession().setAttribute("tbkUser", resp.getTbkUser()); model.addAttribute("request_data", Map.of( "username", username, - "tbkUser", resp.getTbkUser() - )); + "tbkUser", resp.getTbkUser())); model.addAttribute("token", token); model.addAttribute("username", username); model.addAttribute("tbk_user", resp.getTbkUser()); @@ -185,11 +190,11 @@ public String finish(HttpServletRequest req, @GetMapping("/delete") public String delete(@RequestParam String username, - @RequestParam("tbk_user") String tbkUser, - Model model) + @RequestParam("tbk_user") String tbkUser, + Model model) throws IOException, InscriptionDeleteException { - model.addAttribute(MODEL_NAVIGATION, NAV_DELETE); + model.addAttribute(MODEL_NAVIGATION, NAV_DELETE); addBreadcrumbs(model, "Eliminar inscripción", "#"); inscription.delete(tbkUser, username); @@ -211,7 +216,7 @@ public String authorize( Model model) throws IOException, TransactionAuthorizeException { - model.addAttribute(MODEL_NAVIGATION, NAV_AUTHORIZE); + model.addAttribute(MODEL_NAVIGATION, NAV_AUTHORIZE); addBreadcrumbs(model, "Autorizar transacción", "#"); String buyOrder = "buyOrder_" + getRandomNumber(); @@ -224,14 +229,12 @@ public String authorize( amount1, childCode1, childBuyOrder1, - (byte) installments1 - ) + (byte) installments1) .add( amount2, childCode2, childBuyOrder2, - (byte) installments2 - ); + (byte) installments2); var resp = transaction.authorize(username, tbkUser, buyOrder, details); @@ -244,8 +247,8 @@ public String authorize( @GetMapping("/status") public String status(@RequestParam("buy_order") String buyOrder, Model model) throws IOException, TransactionStatusException { - - model.addAttribute(MODEL_NAVIGATION, NAV_STATUS); + + model.addAttribute(MODEL_NAVIGATION, NAV_STATUS); addBreadcrumbs(model, "Consultar estado", "#"); var resp = transaction.status(buyOrder); @@ -256,13 +259,13 @@ public String status(@RequestParam("buy_order") String buyOrder, Model model) @GetMapping("/refund") public String refund(@RequestParam("buy_order") String buyOrder, - @RequestParam("child_buy_order") String childBuyOrder, - @RequestParam("child_commerce_code") String childCommerceCode, - @RequestParam double amount, - Model model) + @RequestParam("child_buy_order") String childBuyOrder, + @RequestParam("child_commerce_code") String childCommerceCode, + @RequestParam double amount, + Model model) throws IOException, TransactionRefundException { - model.addAttribute(MODEL_NAVIGATION, NAV_REFUND); + model.addAttribute(MODEL_NAVIGATION, NAV_REFUND); addBreadcrumbs(model, "Reembolso", "#"); model.addAttribute("buy_order", buyOrder); @@ -282,7 +285,7 @@ public String capture( Model model) throws IOException, TransactionCaptureException { - model.addAttribute(MODEL_NAVIGATION, NAV_CAPTURE); + model.addAttribute(MODEL_NAVIGATION, NAV_CAPTURE); addBreadcrumbs(model, "Capturar", "#"); model.addAttribute("buy_order", buyOrder); diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 4bdc054..e4b7040 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -1,89 +1,85 @@ - - Transbank Sdk Java Example - - - - - + + Transbank Sdk Java Example + + + - + + - + - - - - gtag("config", "G-6CW8MF50ZX"); - - - -
-
-
-
-

Proyectos de Ejemplo del SDK para Java

-
- JavaLogo -

- Este proyecto te brinda la oportunidad de experimentar con las - diversas modalidades de productos que Transbank ofrece a través de - su SDK compatible con Java. Conoce de manera práctica las - soluciones y servicios que Transbank pone a tu disposición, - permitiéndote comprender cómo integrar estas herramientas - tecnológicas en tus proyectos y aplicaciones. ¡Explora las - opciones disponibles y descubre cómo aprovechar al máximo estas - capacidades! -

-
+ + + + -
+ +
+
+
+
+

Proyectos de Ejemplo del SDK para Java

+
+ JavaLogo +

+ Este proyecto te brinda la oportunidad de experimentar con las + diversas modalidades de productos que Transbank ofrece a través de + su SDK compatible con Java. Conoce de manera práctica las + soluciones y servicios que Transbank pone a tu disposición, + permitiéndote comprender cómo integrar estas herramientas + tecnológicas en tus proyectos y aplicaciones. ¡Explora las + opciones disponibles y descubre cómo aprovechar al máximo estas + capacidades! +

+
-
-
-
- webpay -

- El producto más usado para realizar un pago online. Se genera - un único cobro para todos los productos o servicios adquiridos - por el tarjetahabiente (carro de compras). -

-
- Ver ejemplos y modalidades +
+ +
+
+
+ webpay +

+ El producto más usado para realizar un pago online. Se genera + un único cobro para todos los productos o servicios adquiridos + por el tarjetahabiente (carro de compras). +

+ Ver ejemplos y modalidades
+
+
+ oneclick +

+ Permite realizar pagos con un solo clic en un comercio habitual para el tarjetahabiente, una vez que + este haya registrado su tarjeta en el comercio. +

+
+ Ver ejemplos y modalidades +
+
-
+
-
-
+
-
- +
+
+ + diff --git a/src/main/resources/templates/partials/sidebar.html b/src/main/resources/templates/partials/sidebar.html index 3596791..f85f616 100644 --- a/src/main/resources/templates/partials/sidebar.html +++ b/src/main/resources/templates/partials/sidebar.html @@ -10,13 +10,7 @@
  • + +

    Webpay Oneclick

    +
      +
    • + + +
    • + +
    • + +
        +
      • + Flujo Completo
      • diff --git a/src/main/resources/templates/partials/sidebar_mobile.html b/src/main/resources/templates/partials/sidebar_mobile.html index 918ecbe..05f9f02 100644 --- a/src/main/resources/templates/partials/sidebar_mobile.html +++ b/src/main/resources/templates/partials/sidebar_mobile.html @@ -16,7 +16,53 @@ + + +
      • + + +
      • +
      + + +

      Webpay Oneclick

      +