From 058621fec8467ff44ddff6dce1d22e0e397ee011 Mon Sep 17 00:00:00 2001 From: victor mendoza Date: Thu, 12 Mar 2026 14:33:32 -0300 Subject: [PATCH 1/2] feat: improve amount formatting in authorization forms and enhance error handling --- .../example/controllers/BaseController.java | 13 +- .../templates/oneclick_mall/authorize.html | 2 +- .../oneclick_mall_deferred/authorize.html | 176 ++++++++++-------- 3 files changed, 116 insertions(+), 75 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 3bae43e..70ed48c 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/BaseController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/BaseController.java @@ -1,7 +1,10 @@ package cl.transbank.webpay.example.controllers; import com.google.gson.GsonBuilder; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializer; +import java.math.BigDecimal; import java.util.Random; public abstract class BaseController { @@ -13,8 +16,16 @@ public abstract class BaseController { protected static final String VIEW_RECOVER_ERROR = "error/oneclick/recover"; protected static final String VIEW_REJECTED_ERROR = "error/oneclick/rejected"; + private static final JsonSerializer DOUBLE_SERIALIZER = (value, type, ctx) -> + new JsonPrimitive(new BigDecimal(value.toString()).stripTrailingZeros().toPlainString()); + public String toJson(Object obj) { - return (new GsonBuilder().setPrettyPrinting().create()).toJson(obj); + return new GsonBuilder() + .setPrettyPrinting() + .registerTypeAdapter(Double.class, DOUBLE_SERIALIZER) + .registerTypeAdapter(double.class, DOUBLE_SERIALIZER) + .create() + .toJson(obj); } protected String getRandomNumber() { diff --git a/src/main/resources/templates/oneclick_mall/authorize.html b/src/main/resources/templates/oneclick_mall/authorize.html index 9a0f752..9575bc9 100644 --- a/src/main/resources/templates/oneclick_mall/authorize.html +++ b/src/main/resources/templates/oneclick_mall/authorize.html @@ -120,7 +120,7 @@

Otras utilidades

class="tbk-input-text" type="text" name="amount" - th:value="${detail.amount}" + th:value="${T(java.math.BigDecimal).valueOf(detail.amount).stripTrailingZeros().toPlainString()}" /> diff --git a/src/main/resources/templates/oneclick_mall_deferred/authorize.html b/src/main/resources/templates/oneclick_mall_deferred/authorize.html index e39a89c..221dc6b 100644 --- a/src/main/resources/templates/oneclick_mall_deferred/authorize.html +++ b/src/main/resources/templates/oneclick_mall_deferred/authorize.html @@ -1,21 +1,21 @@
-
+
+

Webpay Oneclick Mall Diferido - Autorizar pago

-

Webpay Oneclick Mall Diferido - Autorizar pago

+

+ En este primer paso, procederemos a autorizar una transacción en la + tarjeta que ha sido previamente inscrita. +

-

- En este primer paso, procederemos a autorizar una transacción en la tarjeta que ha sido previamente - inscrita. -

+

Paso 1: Petición

-

Paso 1: Petición

+

+ Ahora que contamos con el username y el tbkUser obtenidos + durante la inscripción, estamos listos para autorizar transacciones en la + tarjeta inscrita. +

-

- Ahora que contamos con el username y el tbkUser obtenidos durante la inscripción, - estamos listos para autorizar transacciones en la tarjeta inscrita. -

- -

+    

 var options = new WebpayOptions(
     IntegrationCommerceCodes.ONECLICK_MALL_DEFERRED,
     IntegrationApiKeys.WEBPAY,
@@ -39,66 +39,96 @@ 

Paso 1: Petición

var resp = transaction.authorize(username, tbkUser, buyOrder, details);
-

Paso 2: Respuesta

- -

- Una vez que la transacción ha sido autorizada, Transbank proporcionará la siguiente información. - Es fundamental conservar esta respuesta y verificar que el campo responseCode tenga un valor de - 0 y que el campo status sea AUTHORIZED. -

- -
- -

¡Casi listo!

- -

- Ya puedes mostrar al usuario una página de éxito de la transacción. - Debes tener en cuenta que la transacción aún no ha sido capturada, solo se ha retenido el saldo en la - tarjeta del Tarjetahabiente. -

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

Paso 2: Respuesta

+ +

+ Una vez que la transacción ha sido autorizada, Transbank proporcionará la + siguiente información. Es fundamental conservar esta respuesta y verificar + que el campo responseCode tenga un valor de 0 y que el campo + status sea AUTHORIZED. +

+ +
+ +

¡Casi listo!

+ +

+ Ya puedes mostrar al usuario una página de éxito de la transacción. Debes + tener en cuenta que la transacción aún no ha sido capturada, solo se ha + retenido el saldo en la tarjeta del Tarjetahabiente. +

+ +
+
+ + +
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
- - - CONSULTAR ESTADO - - +
+ + + CONSULTAR ESTADO + +
From 70f0e17f7fe3b4cf7f7a909a65b6b4edb7dc8dc2 Mon Sep 17 00:00:00 2001 From: victor mendoza Date: Thu, 12 Mar 2026 16:05:21 -0300 Subject: [PATCH 2/2] feat: enhance DOUBLE_SERIALIZER to handle NaN and infinite values --- .../webpay/example/controllers/BaseController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 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 70ed48c..a228e22 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/BaseController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/BaseController.java @@ -16,8 +16,12 @@ public abstract class BaseController { protected static final String VIEW_RECOVER_ERROR = "error/oneclick/recover"; protected static final String VIEW_REJECTED_ERROR = "error/oneclick/rejected"; - private static final JsonSerializer DOUBLE_SERIALIZER = (value, type, ctx) -> - new JsonPrimitive(new BigDecimal(value.toString()).stripTrailingZeros().toPlainString()); + private static final JsonSerializer DOUBLE_SERIALIZER = (value, type, ctx) -> { + if (value.isNaN() || value.isInfinite()) { + return new JsonPrimitive(value); + } + return new JsonPrimitive(new BigDecimal(value.toString()).stripTrailingZeros().toPlainString()); + }; public String toJson(Object obj) { return new GsonBuilder()