From 8c3bf367755a675415b25391d85a8b4428705bf8 Mon Sep 17 00:00:00 2001 From: victor mendoza Date: Wed, 22 Apr 2026 16:35:49 -0300 Subject: [PATCH 1/6] feat: add PatpassComercioController and update application properties for header forwarding --- .../PatpassComercioController.java | 251 ++++++++++++++++++ src/main/resources/application.properties | 1 + 2 files changed, 252 insertions(+) create mode 100644 src/main/java/cl/transbank/webpay/example/controllers/PatpassComercioController.java diff --git a/src/main/java/cl/transbank/webpay/example/controllers/PatpassComercioController.java b/src/main/java/cl/transbank/webpay/example/controllers/PatpassComercioController.java new file mode 100644 index 0000000..931c66e --- /dev/null +++ b/src/main/java/cl/transbank/webpay/example/controllers/PatpassComercioController.java @@ -0,0 +1,251 @@ +package cl.transbank.webpay.example.controllers; + +import cl.transbank.common.IntegrationApiKeys; +import cl.transbank.common.IntegrationCommerceCodes; +import cl.transbank.patpass.PatpassComercio; +import cl.transbank.patpass.responses.PatpassComercioInscriptionStartResponse; +import cl.transbank.patpass.responses.PatpassComercioTransactionStatusResponse; +import cl.transbank.webpay.exception.InscriptionStartException; +import cl.transbank.webpay.exception.TransactionStatusException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +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.PostMapping; +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 +@RequestMapping("/patpass-comercio") +public class PatpassComercioController extends BaseController { + private static final String TEMPLATE_FOLDER = "patpass_comercio"; + private static final String BASE_URL = "/patpass-comercio"; + private static final String PRODUCT = "Patpass Comercio"; + private static final String SESSION_TOKEN_KEY = "patpass_j_token"; + private static final String DEFAULT_VOUCHER_URL = + "https://pagoautomaticocontarjetasint.transbank.cl/nuevo-ic-rest/tokenVoucherLogin"; + + private static final String COMMIT_PATH = "/commit"; + private static final String VOUCHER_PATH = "/voucher"; + private static final String NAVIGATION_ATTR = "navigation"; + private static final String VOUCHER_URL = "voucherUrl"; + private static final String ERROR_ATTR = "error"; + private static final String VIEW_START = TEMPLATE_FOLDER + "/start"; + private static final String VIEW_COMMIT = TEMPLATE_FOLDER + COMMIT_PATH; + private static final String VIEW_VOUCHER = TEMPLATE_FOLDER + VOUCHER_PATH; + + private static final Map NAV_START; + private static final Map NAV_COMMIT; + private static final Map NAV_VOUCHER; + + static { + NAV_START = new LinkedHashMap<>(); + NAV_START.put("request", "Petición"); + NAV_START.put("response", "Respuesta"); + NAV_START.put("form", "Formulario"); + NAV_START.put("example", "Ejemplo"); + + NAV_COMMIT = new LinkedHashMap<>(); + NAV_COMMIT.put("data", "Datos recibidos"); + NAV_COMMIT.put("request", "Petición"); + NAV_COMMIT.put("response", "Respuesta"); + NAV_COMMIT.put("form", "Formulario"); + + NAV_VOUCHER = new LinkedHashMap<>(); + NAV_VOUCHER.put("form", "voucher"); + } + + private final PatpassComercio.Inscription inscription; + + public PatpassComercioController() { + this.inscription = PatpassComercio.Inscription.buildForIntegration( + IntegrationCommerceCodes.PATPASS_COMERCIO, + IntegrationApiKeys.PATPASS_COMERCIO + ); + } + + 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); + } + model.addAttribute("product", PRODUCT); + model.addAttribute("breadcrumbs", breadcrumbs); + } + + @GetMapping({"", "/"}) + public String start(HttpServletRequest request, Model model) + throws IOException, InscriptionStartException { + model.addAttribute(NAVIGATION_ATTR, NAV_START); + addBreadcrumbs(model, null, null); + + String returnUrl = request.getRequestURL().toString().replaceAll("/?$", "") + COMMIT_PATH; + String finalUrl = request.getRequestURL().toString().replaceAll("/?$", "") + VOUCHER_PATH; + + Map requestData = new LinkedHashMap<>(); + requestData.put("serviceId", "Service-" + getRandomNumber()); + requestData.put("maxAmount", 100); + requestData.put("returnUrl", returnUrl); + requestData.put("finalUrl", finalUrl); + requestData.put("name", "Isaac"); + requestData.put("lastName", "Newton"); + requestData.put("secondLastName", "Gonzales"); + requestData.put("rut", "11111111-1"); + requestData.put("phone", "123456734"); + requestData.put("cellPhone", "123456723"); + requestData.put("patpassName", "Membresia de cable"); + requestData.put("personEmail", "developer@continuum.cl"); + requestData.put("commerceEmail", "developer@continuum.cl"); + requestData.put("address", "Satelite 101"); + requestData.put("city", "Santiago"); + + + PatpassComercioInscriptionStartResponse resp = this.inscription.start( + requestData.get("returnUrl").toString(), + requestData.get("name").toString(), + requestData.get("lastName").toString(), + requestData.get("secondLastName").toString(), + requestData.get("rut").toString(), + requestData.get("serviceId").toString(), + requestData.get("finalUrl").toString(), + Double.valueOf(requestData.get("maxAmount").toString()), + requestData.get("phone").toString(), + requestData.get("cellPhone").toString(), + requestData.get("patpassName").toString(), + requestData.get("personEmail").toString(), + requestData.get("commerceEmail").toString(), + requestData.get("address").toString(), + requestData.get("city").toString() + ); + + model.addAttribute("request_data", requestData); + model.addAttribute("response_data", resp); + model.addAttribute("response_data_json", toJson(resp)); + return VIEW_START; + } + + @PostMapping("/commit") + public String commitPost(@RequestParam(name = "j_token", required = false) String jTokenLower, + @RequestParam(name = "J_TOKEN", required = false) String jTokenUpper, + @RequestParam(name = "token", required = false) String token, + HttpServletRequest request, + Model model) { + String jToken = firstNonBlank(jTokenLower, jTokenUpper, token); + if (isBlank(jToken)) { + model.addAttribute(ERROR_ATTR, "No se recibió el token de inscripción (J_TOKEN)."); + return VIEW_ERROR; + } + + request.getSession().setAttribute(SESSION_TOKEN_KEY, jToken); + return "redirect:" + BASE_URL + COMMIT_PATH; + } + + @GetMapping(COMMIT_PATH) + public String commit(@RequestParam(name = "j_token", required = false) String jTokenLower, + @RequestParam(name = "J_TOKEN", required = false) String jTokenUpper, + @RequestParam(name = "token", required = false) String token, + HttpServletRequest request, + Model model) + throws IOException, TransactionStatusException { + String jToken = getIncomingToken(request.getSession(), jTokenLower, jTokenUpper, token); + if (isBlank(jToken)) { + model.addAttribute(ERROR_ATTR, "No se encontró el token de inscripción (J_TOKEN)."); + return VIEW_ERROR; + } + + model.addAttribute(NAVIGATION_ATTR, NAV_COMMIT); + addBreadcrumbs(model, "Confirmar registro", BASE_URL + COMMIT_PATH); + + PatpassComercioTransactionStatusResponse resp = inscription.status(jToken); + request.getSession().setAttribute(SESSION_TOKEN_KEY, jToken); + + model.addAttribute("token", jToken); + model.addAttribute("response_data", resp); + model.addAttribute("response_data_json", toJson(resp)); + model.addAttribute("response_payload_json", toJson(Map.of( + "authorized", resp.isAuthorized(), + VOUCHER_URL, resp.getVoucherUrl() + ))); + model.addAttribute(VOUCHER_URL, + isBlank(resp.getVoucherUrl()) ? DEFAULT_VOUCHER_URL : resp.getVoucherUrl()); + + return VIEW_COMMIT; + } + + @PostMapping(VOUCHER_PATH) + public String voucherPost(@RequestParam(name = "j_token", required = false) String jTokenLower, + @RequestParam(name = "J_TOKEN", required = false) String jTokenUpper, + @RequestParam(name = "tokenComercio", required = false) String tokenComercio, + @RequestParam(name = "token", required = false) String token, + HttpServletRequest request, + Model model) { + String jToken = firstNonBlank(jTokenLower, jTokenUpper, tokenComercio, token); + if (isBlank(jToken)) { + model.addAttribute(ERROR_ATTR, "No se recibió el token de inscripción (J_TOKEN)."); + return VIEW_ERROR; + } + + request.getSession().setAttribute(SESSION_TOKEN_KEY, jToken); + return "redirect:" + BASE_URL + VOUCHER_PATH; + } + + @GetMapping(VOUCHER_PATH) + public String voucher(@RequestParam(name = "j_token", required = false) String jTokenLower, + @RequestParam(name = "J_TOKEN", required = false) String jTokenUpper, + @RequestParam(name = "tokenComercio", required = false) String tokenComercio, + @RequestParam(name = "token", required = false) String token, + HttpServletRequest request, + Model model) { + String jToken = getIncomingToken(request.getSession(), jTokenLower, jTokenUpper, tokenComercio, token); + if (isBlank(jToken)) { + model.addAttribute(ERROR_ATTR, "No se encontró el token de inscripción (J_TOKEN)."); + return VIEW_ERROR; + } + + model.addAttribute(NAVIGATION_ATTR, NAV_VOUCHER); + addBreadcrumbs(model, "Voucher", BASE_URL + VOUCHER_PATH); + model.addAttribute("token", jToken); + model.addAttribute(VOUCHER_URL, DEFAULT_VOUCHER_URL); + + return VIEW_VOUCHER; + } + + private String getIncomingToken(HttpSession session, String... values) { + String token = firstNonBlank(values); + if (!isBlank(token)) { + return token; + } + Object sessionToken = session.getAttribute(SESSION_TOKEN_KEY); + return sessionToken == null ? null : sessionToken.toString(); + } + + private String firstNonBlank(String... values) { + for (String value : values) { + if (!isBlank(value)) { + return value; + } + } + return null; + } + + private boolean isBlank(String value) { + return value == null || value.isBlank(); + } + + @ExceptionHandler(Exception.class) + public String handleException(Exception e, Model model) { + log.error("Error inesperado", e); + model.addAttribute(ERROR_ATTR, e.getMessage()); + return VIEW_ERROR; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f3fc4f8..920a5fe 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,2 @@ spring.application.name=transbank-sdk-java-example +server.forward-headers-strategy=framework From 927bfe7deb4103cf0df49488de7135ec6fe342d8 Mon Sep 17 00:00:00 2001 From: victor mendoza Date: Wed, 22 Apr 2026 16:35:59 -0300 Subject: [PATCH 2/6] feat: add start.html template for Patpass Comercio transaction initiation --- .../templates/patpass_comercio/start.html | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/main/resources/templates/patpass_comercio/start.html diff --git a/src/main/resources/templates/patpass_comercio/start.html b/src/main/resources/templates/patpass_comercio/start.html new file mode 100644 index 0000000..1bae503 --- /dev/null +++ b/src/main/resources/templates/patpass_comercio/start.html @@ -0,0 +1,89 @@ +
+
+

Patpass Comercio - Iniciar Transacción

+

+ En este paso inicial, procederemos a inscribir una tarjeta con el objetivo de obtener un identificador único. + Esto nos permitirá redirigir al Tarjetahabiente hacia el formulario de inscripción en el siguiente paso. +

+ +

+ Todas las transacciones de este proyecto ejemplo son realizadas en ambiente de integración. +

+ +

Paso 1: Petición

+

+ Para comenzar, importa la librería PatpassComercio y luego inicia una inscripción. Tener en cuenta: + el ambiente de integración no admite direcciones locales en los atributos url y finalUrl. +

+ +

+import cl.transbank.common.IntegrationApiKeys;
+import cl.transbank.common.IntegrationCommerceCodes;
+import cl.transbank.patpass.PatpassComercio;
+
+var inscription = PatpassComercio.Inscription.buildForIntegration(
+    IntegrationCommerceCodes.PATPASS_COMERCIO,
+    IntegrationApiKeys.PATPASS_COMERCIO
+);
+
+var resp = inscription.start(
+    returnUrl,
+    name,
+    lastName,
+    secondLastName,
+    rut,
+    serviceId,
+    finalUrl,
+    maxAmount,
+    phone,
+    cellPhone,
+    patpassName,
+    personEmail,
+    commerceEmail,
+    address,
+    city
+);
+        
+ +

Paso 2: Respuesta

+

+ Una vez iniciada la inscripción, recibirás los siguientes datos de respuesta: +

+ +
+ +

Paso 3: Creación del formulario

+

+ Utiliza los datos obtenidos durante la inscripción para generar un formulario, proporcionando al + Tarjetahabiente una experiencia de inscripción fluida y segura. +

+ +

+
+ +

Ejemplo

+

+ Para poder iniciar la inscripción, se necesitan los siguientes datos: +

+ +
+ +
+
+ Formulario de redirección +
+ + + +
+ +
+
+
+
From f8680521fb34b556bd8cddc6468f0cb38606891a Mon Sep 17 00:00:00 2001 From: victor mendoza Date: Wed, 22 Apr 2026 16:36:07 -0300 Subject: [PATCH 3/6] feat: add commit.html template for Patpass Comercio registration confirmation --- .../templates/patpass_comercio/commit.html | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/main/resources/templates/patpass_comercio/commit.html diff --git a/src/main/resources/templates/patpass_comercio/commit.html b/src/main/resources/templates/patpass_comercio/commit.html new file mode 100644 index 0000000..f223e1f --- /dev/null +++ b/src/main/resources/templates/patpass_comercio/commit.html @@ -0,0 +1,55 @@ +
+
+

Patpass Comercio - Confirmar Registro

+

+ Es necesario confirmar el registro; este solo se puede hacer una sola vez o retornará error. +

+ +

Paso 1: Datos recibidos

+

+ Luego de que se termina el flujo en el formulario de inscripción recibirás un POST con la siguiente respuesta. +

+ +

+{
+  "J_TOKEN": ""
+}
+        
+ +

Paso 2: Petición

+

+ Usarás el token recibido para confirmar la inscripción usando el método status de PatpassComercio. +

+ +

+var response = inscription.status(token);
+        
+ +

Paso 3: Respuesta

+

+ Transbank contestará con lo siguiente. Debes guardar esta información; lo importante es validar que + el atributo authorized sea igual a true. +

+ +
+ +

¡Listo!

+

+ Una vez realizada la inscripción y confirmada, puedes visualizar el voucher. +

+ +
+ Formulario de redirección +
+ + +
+ +
+
+
From 490d091a6ff803c329cc203b00b9595afc9c3e37 Mon Sep 17 00:00:00 2001 From: victor mendoza Date: Wed, 22 Apr 2026 16:36:14 -0300 Subject: [PATCH 4/6] feat: add voucher.html template for Patpass Comercio voucher display --- .../templates/patpass_comercio/voucher.html | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/resources/templates/patpass_comercio/voucher.html diff --git a/src/main/resources/templates/patpass_comercio/voucher.html b/src/main/resources/templates/patpass_comercio/voucher.html new file mode 100644 index 0000000..ba320b8 --- /dev/null +++ b/src/main/resources/templates/patpass_comercio/voucher.html @@ -0,0 +1,22 @@ +
+
+

Patpass Comercio - Voucher

+

+ La inscripción ya se encuentra finalizada. Una vez finalizada la inscripción puedes seguir consultando por el voucher. +

+ +
+ Voucher +
+ + +
+ +
+
+
From 065f3757dcfce755d6f39b1de61d26ede3d85e51 Mon Sep 17 00:00:00 2001 From: victor mendoza Date: Thu, 23 Apr 2026 12:30:04 -0300 Subject: [PATCH 5/6] feat: improve error handling by providing user-friendly error messages --- .../webpay/example/controllers/BaseController.java | 14 ++++++++++++++ .../controllers/OneclickMallController.java | 2 +- .../OneclickMallDeferredController.java | 2 +- .../controllers/PatpassComercioController.java | 2 +- .../controllers/TransaccionCompletaController.java | 2 +- .../TransaccionCompletaDiferidaController.java | 2 +- .../TransaccionCompletaMallController.java | 2 +- .../TransaccionCompletaMallDiferidoController.java | 2 +- .../example/controllers/WebpayPlusController.java | 2 +- .../controllers/WebpayPlusDeferredController.java | 2 +- .../controllers/WebpayPlusMallController.java | 2 +- .../WebpayPlusMallDeferredController.java | 2 +- 12 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/main/java/cl/transbank/webpay/example/controllers/BaseController.java b/src/main/java/cl/transbank/webpay/example/controllers/BaseController.java index a228e22..2cb4300 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/BaseController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/BaseController.java @@ -1,5 +1,6 @@ package cl.transbank.webpay.example.controllers; +import cl.transbank.exception.TransbankException; import com.google.gson.GsonBuilder; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializer; @@ -8,6 +9,8 @@ import java.util.Random; public abstract class BaseController { + private static final String GENERIC_ERROR_MESSAGE = + "Ocurrió un error inesperado al procesar la operación."; protected static final String VIEW_ERROR = "error/error_page"; protected static final String VIEW_ABORTED_ERROR = "error/webpay/aborted"; @@ -35,4 +38,15 @@ public String toJson(Object obj) { protected String getRandomNumber() { return String.valueOf(new Random().nextInt(Integer.MAX_VALUE)); } + + protected String getDisplayableErrorMessage(Exception e) { + Throwable current = e; + while (current != null) { + if (current instanceof TransbankException && current.getMessage() != null && !current.getMessage().isBlank()) { + return current.getMessage(); + } + current = current.getCause(); + } + return GENERIC_ERROR_MESSAGE; + } } diff --git a/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallController.java b/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallController.java index 66922c4..dc98855 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallController.java @@ -279,7 +279,7 @@ public String refund(@RequestParam("buy_order") String buyOrder, @ExceptionHandler(Exception.class) public String handleException(Exception e, Model model) { log.error("Error inesperado", e); - model.addAttribute("error", e.getMessage()); + model.addAttribute("error", getDisplayableErrorMessage(e)); return VIEW_ERROR; } } 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 49d10a6..469a7ad 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallDeferredController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallDeferredController.java @@ -299,7 +299,7 @@ public String capture( @ExceptionHandler(Exception.class) public String handleException(Exception e, Model model) { log.error("Error inesperado", e); - model.addAttribute("error", e.getMessage()); + model.addAttribute("error", getDisplayableErrorMessage(e)); return VIEW_ERROR; } } diff --git a/src/main/java/cl/transbank/webpay/example/controllers/PatpassComercioController.java b/src/main/java/cl/transbank/webpay/example/controllers/PatpassComercioController.java index 931c66e..65df2d3 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/PatpassComercioController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/PatpassComercioController.java @@ -245,7 +245,7 @@ private boolean isBlank(String value) { @ExceptionHandler(Exception.class) public String handleException(Exception e, Model model) { log.error("Error inesperado", e); - model.addAttribute(ERROR_ATTR, e.getMessage()); + model.addAttribute(ERROR_ATTR, getDisplayableErrorMessage(e)); return VIEW_ERROR; } } diff --git a/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaController.java b/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaController.java index 312b717..231827c 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaController.java @@ -209,7 +209,7 @@ public String refund( @ExceptionHandler(Exception.class) public String handleException(Exception e, Model model) { log.error("Error inesperado", e); - model.addAttribute(ATTR_ERROR, e.getMessage()); + model.addAttribute(ATTR_ERROR, getDisplayableErrorMessage(e)); return VIEW_ERROR; } } diff --git a/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaDiferidaController.java b/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaDiferidaController.java index 5bc694e..56687e3 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaDiferidaController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaDiferidaController.java @@ -238,7 +238,7 @@ public String refund( @ExceptionHandler(Exception.class) public String handleException(Exception e, Model model) { log.error("Error inesperado", e); - model.addAttribute(ATTR_ERROR, e.getMessage()); + model.addAttribute(ATTR_ERROR, getDisplayableErrorMessage(e)); return VIEW_ERROR; } } diff --git a/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaMallController.java b/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaMallController.java index 789c700..57f03e2 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaMallController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaMallController.java @@ -276,7 +276,7 @@ private List getSessionDetails(HttpServletRequest req) { @ExceptionHandler(Exception.class) public String handleException(Exception e, Model model) { - model.addAttribute(ATTR_ERROR, e.getMessage()); + model.addAttribute(ATTR_ERROR, getDisplayableErrorMessage(e)); return VIEW_ERROR; } } diff --git a/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaMallDiferidoController.java b/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaMallDiferidoController.java index beae58a..578ae49 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaMallDiferidoController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/TransaccionCompletaMallDiferidoController.java @@ -302,7 +302,7 @@ private List getSessionDetails(HttpServletRequest req) { @ExceptionHandler(Exception.class) public String handleException(Exception e, Model model) { - model.addAttribute(ATTR_ERROR, e.getMessage()); + model.addAttribute(ATTR_ERROR, getDisplayableErrorMessage(e)); return VIEW_ERROR; } } diff --git a/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusController.java b/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusController.java index 841f617..facc093 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusController.java @@ -175,7 +175,7 @@ public String refund(@RequestParam("token_ws") String token, @ExceptionHandler(Exception.class) public String handleException(Exception e, Model model) { log.error("Error inesperado", e); - model.addAttribute("error", e.getMessage()); + model.addAttribute("error", getDisplayableErrorMessage(e)); return VIEW_ERROR; } diff --git a/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusDeferredController.java b/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusDeferredController.java index c69be62..e04cf48 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusDeferredController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusDeferredController.java @@ -195,7 +195,7 @@ public String refund(@RequestParam("token_ws") String token, @ExceptionHandler(Exception.class) public String handleException(Exception e, Model model) { log.error("Error inesperado", e); - model.addAttribute("error", e.getMessage()); + model.addAttribute("error", getDisplayableErrorMessage(e)); return VIEW_ERROR; } } diff --git a/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusMallController.java b/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusMallController.java index 2440b51..69d87d6 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusMallController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusMallController.java @@ -200,7 +200,7 @@ public String refund(@RequestParam("token") String token, @ExceptionHandler(Exception.class) public String handleException(Exception e, Model model) { log.error("Error inesperado", e); - model.addAttribute("error", e.getMessage()); + model.addAttribute("error", getDisplayableErrorMessage(e)); return VIEW_ERROR; } diff --git a/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusMallDeferredController.java b/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusMallDeferredController.java index bc81e94..46b152b 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusMallDeferredController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/WebpayPlusMallDeferredController.java @@ -233,7 +233,7 @@ public String capture( @ExceptionHandler(Exception.class) public String handleException(Exception e, Model model) { log.error("Error inesperado", e); - model.addAttribute("error", e.getMessage()); + model.addAttribute("error", getDisplayableErrorMessage(e)); return VIEW_ERROR; } From 9cd82e50a136765fe3c30c0499cf60f6af2a1d41 Mon Sep 17 00:00:00 2001 From: victor mendoza Date: Thu, 23 Apr 2026 13:51:33 -0300 Subject: [PATCH 6/6] feat: remove server.forward-headers-strategy property from application configuration --- src/main/resources/application.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 920a5fe..f3fc4f8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,2 +1 @@ spring.application.name=transbank-sdk-java-example -server.forward-headers-strategy=framework