diff --git a/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallController.java b/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallController.java new file mode 100644 index 0000000..8e935b3 --- /dev/null +++ b/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallController.java @@ -0,0 +1,256 @@ +package cl.transbank.webpay.example.controllers; + +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.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.*; + +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.Map; + +@Log4j2 +@Controller +@RequestMapping("/oneclick-mall") +public class OneclickMallController extends BaseController { + private static final String TEMPLATE_FOLDER = "oneclick_mall"; + private static final String BASE_URL = "/oneclick-mall"; + private static final String PRODUCT = "Webpay Oneclick Mall"; + + private static final String VIEW_START = TEMPLATE_FOLDER + "/start"; + private static final String VIEW_FINISH = TEMPLATE_FOLDER + "/finish"; + private static final String VIEW_AUTHORIZE = TEMPLATE_FOLDER + "/authorize"; + private static final String VIEW_DELETE = TEMPLATE_FOLDER + "/delete"; + private static final String VIEW_STATUS = TEMPLATE_FOLDER + "/status"; + private static final String VIEW_REFUND = TEMPLATE_FOLDER + "/refund"; + private static final String VIEW_ERROR = "error/error_page"; + + private static final Map NAV_START; + private static final Map NAV_FINISH; + private static final Map NAV_AUTHORIZE; + private static final Map NAV_DELETE; + private static final Map NAV_STATUS; + private static final Map NAV_REFUND; + + + + + static { + NAV_START = new LinkedHashMap<>(); + NAV_START.put("request", "Petición"); + NAV_START.put("response", "Respuesta"); + NAV_START.put("form", "Creación del formulario"); + NAV_START.put("example", "Ejemplo"); + + NAV_FINISH = new LinkedHashMap<>(); + NAV_FINISH.put("data", "Datos"); + NAV_FINISH.put("request", "Petición"); + NAV_FINISH.put("response", "Respuesta"); + NAV_FINISH.put("authorize", "Autorizar una transacción"); + + NAV_AUTHORIZE = new LinkedHashMap<>(); + NAV_AUTHORIZE.put("request", "Petición"); + NAV_AUTHORIZE.put("response", "Respuesta"); + NAV_AUTHORIZE.put("done", "listo"); + + NAV_STATUS = new LinkedHashMap<>(); + NAV_STATUS.put("request", "Petición"); + NAV_STATUS.put("response", "Respuesta"); + + NAV_DELETE = new LinkedHashMap<>(); + NAV_DELETE.put("data", "Borrar usuario"); + + NAV_REFUND = NAV_STATUS; + + } + + private final Oneclick.MallInscription inscription; + private final Oneclick.MallTransaction transaction; + + public OneclickMallController() { + WebpayOptions options = new WebpayOptions( + IntegrationCommerceCodes.ONECLICK_MALL, + IntegrationApiKeys.WEBPAY, + IntegrationType.TEST + ); + this.inscription = new Oneclick.MallInscription(options); + this.transaction = new Oneclick.MallTransaction(options); + } + + private void addBreadcrumbs(Model model, String label, String url) { + Map breadcrumbs = new LinkedHashMap<>(); + breadcrumbs.put("Inicio", "/"); + breadcrumbs.put(PRODUCT, BASE_URL + "/start"); + if (label != null) breadcrumbs.put(label, url); + model.addAttribute("product", PRODUCT); + model.addAttribute("breadcrumbs", breadcrumbs); + } + + @GetMapping("/start") + public String start(HttpServletRequest req, Model model) + throws IOException, InscriptionStartException { + model.addAttribute("navigation", NAV_START); + addBreadcrumbs(model, "Iniciar inscripción", "#"); + + String username = "user_" + getRandomNumber(); + String email = "user." + getRandomNumber() + "@example.com"; + 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 + )); + model.addAttribute("request_data_json", toJson(Map.of( + "username", username, + "email", email, + "returnUrl", returnUrl + ))); + model.addAttribute("response_data", resp); + model.addAttribute("response_data_json", toJson(resp)); + model.addAttribute("url", resp.getUrlWebpay()); + model.addAttribute("token", resp.getToken()); + + req.getSession().setAttribute("username", username); + req.getSession().setAttribute("email", email); + + return VIEW_START; + } + + @GetMapping("/finish") + public String finish(HttpServletRequest req, + @RequestParam(name = "TBK_TOKEN", required = false) String token, + Model model) + throws IOException, InscriptionFinishException { + + model.addAttribute("navigation", NAV_FINISH); + addBreadcrumbs(model, "Finalizar inscripción", "#"); + + String username = (String) req.getSession().getAttribute("username"); + + var resp = inscription.finish(token); + + req.getSession().setAttribute("tbkUser", resp.getTbkUser()); + + model.addAttribute("request_data", Map.of( + "username", username, + "tbkUser", resp.getTbkUser() + )); + + model.addAttribute("token", token); + model.addAttribute("username", username); + model.addAttribute("tbk_user", resp.getTbkUser()); + model.addAttribute("response_data", resp); + model.addAttribute("response_data_json", toJson(resp)); + + model.addAttribute("child_commerce_code1", IntegrationCommerceCodes.ONECLICK_MALL_CHILD1); + model.addAttribute("child_commerce_code2", IntegrationCommerceCodes.ONECLICK_MALL_CHILD2); + + return VIEW_FINISH; + } + + @GetMapping("/delete") + public String delete(@RequestParam String username, + @RequestParam("tbk_user") String tbkUser, + Model model) + throws IOException, InscriptionDeleteException { + + model.addAttribute("navigation", NAV_DELETE); + addBreadcrumbs(model, "Eliminar inscripción", "#"); + + inscription.delete(tbkUser, username); + model.addAttribute("message", "Inscripción eliminada exitosamente."); + + return VIEW_DELETE; + } + + @GetMapping("/authorize") + public String authorize( + @RequestParam String username, + @RequestParam("tbk_user") String tbkUser, + @RequestParam("child_commerce_code1") String childCode1, + @RequestParam("child_commerce_code2") String childCode2, + @RequestParam("child_commerce_amount1") double amount1, + @RequestParam("child_commerce_amount2") double amount2, + @RequestParam("child_commerce_installments1") int installments1, + @RequestParam("child_commerce_installments2") int installments2, + Model model) + throws IOException, TransactionAuthorizeException { + + model.addAttribute("navigation", NAV_AUTHORIZE); + addBreadcrumbs(model, "Autorizar transacción", "#"); + + String buyOrder = "Order" + getRandomNumber(); + String childBuyOrder1 = "Order1_" + getRandomNumber(); + String childBuyOrder2 = "Order2_" + getRandomNumber(); + + var details = MallTransactionCreateDetails + .build() + .add( + amount1, + childCode1, + childBuyOrder1, + (byte) installments1 + ) + .add( + amount2, + childCode2, + childBuyOrder2, + (byte) installments2 + ); + + var resp = transaction.authorize(username, tbkUser, buyOrder, details); + + model.addAttribute("response_data", resp); + model.addAttribute("response_data_json", toJson(resp)); + + return VIEW_AUTHORIZE; + } + + @GetMapping("/status") + public String status(@RequestParam("buy_order") String buyOrder, Model model) + throws IOException, TransactionStatusException { + + model.addAttribute("navigation", NAV_STATUS); + addBreadcrumbs(model, "Consultar estado", "#"); + + var resp = transaction.status(buyOrder); + model.addAttribute("response_data_json", toJson(resp)); + + return VIEW_STATUS; + } + + @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) + throws IOException, TransactionRefundException { + model.addAttribute("navigation", NAV_REFUND); + addBreadcrumbs(model, "Reembolso", "#"); + + model.addAttribute("buy_order", buyOrder); + var resp = transaction.refund(buyOrder, childCommerceCode, childBuyOrder, amount); + model.addAttribute("response_data_json", toJson(resp)); + + return VIEW_REFUND; + } + + @ExceptionHandler(Exception.class) + public String handleException(Exception e, Model model) { + log.error("Error inesperado", e); + model.addAttribute("error", e.getMessage()); + return VIEW_ERROR; + } +} diff --git a/src/main/resources/static/css/styles.css b/src/main/resources/static/css/styles.css index 6a827fb..001d2e2 100644 --- a/src/main/resources/static/css/styles.css +++ b/src/main/resources/static/css/styles.css @@ -86,12 +86,18 @@ --tbk-table-header: hsl(329.58deg 100% 41.76% / 5%); --bg-hover: #343a46; --tbk-white-red: #f9f6f6; + --header-h: 80px; } * { box-sizing: border-box; } +html { + scroll-padding-top: var(--header-h); + scroll-behavior: smooth; +} + body { background-color: var(--background); font-family: "Open Sans", sans-serif; @@ -511,7 +517,7 @@ code { padding-left: 160px; padding-right: 160px; width: 100%; - height: 80px; + height: var(--header-h); box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.08); background-color: var(--elevation); position: sticky; diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index dedf0e3..3f271e9 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -1,100 +1,109 @@ - - Transbank Sdk Java Example - - - + + Transbank Sdk Java Example + + + - - + + - + - + - - - + - - -
-
-
-
-

- 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! -

-
+ 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! +

+
-
+
-
-
-
- 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 +

+ 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
-
+
+ +
+ +
- +
+
+
+ diff --git a/src/main/resources/templates/oneclick_mall/authorize.html b/src/main/resources/templates/oneclick_mall/authorize.html new file mode 100644 index 0000000..9a0f752 --- /dev/null +++ b/src/main/resources/templates/oneclick_mall/authorize.html @@ -0,0 +1,142 @@ +
+
+

Webpay Oneclick Mall - Autorizar pago

+ +

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

+ +

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. +

+ +

+var options = new WebpayOptions(
+    IntegrationCommerceCodes.ONECLICK_MALL
+    IntegrationApiKeys.WEBPAY,
+    IntegrationType.TEST
+);
+var transaction = new Oneclick.MallTransaction(options);
+var details = MallTransactionCreateDetails
+    .build()
+    .add(
+            amount1,
+            childCode1,
+            childBuyOrder1,
+            (byte) installments1
+    )
+    .add(
+            amount2,
+            childCode2,
+            childBuyOrder2,
+            (byte) installments2
+    );
+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. +

+ +
+ +

¡Listo!

+ +

+ Con la autorización exitosa, puedes mostrar al usuario una página de éxito + de la transacción, proporcionándole la confirmación de que el proceso se + ha completado con éxito. +

+ +
+

Otras utilidades

+

+ Después de autorizar la transacción, considera las siguientes utilidades + adicionales: +

+
    +
  • + Reembolsar: Puedes reversar o anular el pago según ciertas + condiciones comerciales. +
  • +
  • + Consultar Estado: Hasta 7 días después de realizada la + transacción, podrás consultar el estado de la transacción. +
  • +
+
+ +
+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+
+
+ + + CONSULTAR ESTADO + +
+
diff --git a/src/main/resources/templates/oneclick_mall/delete.html b/src/main/resources/templates/oneclick_mall/delete.html new file mode 100644 index 0000000..fbcfab1 --- /dev/null +++ b/src/main/resources/templates/oneclick_mall/delete.html @@ -0,0 +1,55 @@ +
+
+

Webpay Oneclick Mall - Borrar usuario

+ +

+ En este paso fundamental, procederemos a eliminar la inscripción del + usuario y su medio de pago. +

+ +

Paso 1: Petición

+

+ Para llevar a cabo la eliminación, necesitas el "username" (Nombre de + Usuario) y el "tbkUser". Realiza la llamada a MallInscription utilizando + el siguiente código: +

+ +
+      
+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.oneclick.Oneclick;
+
+var options = new WebpayOptions(
+                IntegrationCommerceCodes.ONECLICK_MALL,
+                IntegrationApiKeys.WEBPAY,
+                IntegrationType.TEST
+        );
+var inscription = new Oneclick.MallInscription(options);
+      inscription.delete(tbkUser, username);
+      
+    
+ +

Paso 2: Respuesta

+

+ En caso de éxito, Transbank responderá con un status code 204 (No + Content), y el SDK no retornará ningún valor. La eliminación de la + inscripción se ha realizado de manera exitosa. +

+ +

+ En el caso de que no se encuentre el "username" o el "tbkUser", Transbank + responderá con un status code 404 (Not Found), y el SDK lanzará una + excepción del tipo TransbankException. +

+ +

+ Este proceso garantiza una eliminación segura y eficiente de la + inscripción del usuario y su medio de pago asociado. ¡Gracias por confiar + en Transbank para tus operaciones seguras! Si tienes alguna pregunta, + estamos aquí para ayudarte. +

+
+
diff --git a/src/main/resources/templates/oneclick_mall/finish.html b/src/main/resources/templates/oneclick_mall/finish.html new file mode 100644 index 0000000..0934eb5 --- /dev/null +++ b/src/main/resources/templates/oneclick_mall/finish.html @@ -0,0 +1,147 @@ +
+
+

Webpay Oneclick Mall - Finalizar inscripción

+

+ En esta fase, completaremos el proceso de inscripción, permitiéndonos + posteriormente realizar cargos a la tarjeta que el Tarjetahabiente haya + inscrito. +

+ +

Paso 1: Datos recibidos

+

+ Después de finalizar el flujo en el formulario de inscripción, recibirás + un GET con la siguiente información: +

+ +

+{
+  "TBK_TOKEN": ""
+}
+    
+ +

Paso 2: Petición de autorización

+

+ Utiliza el token recibido para finalizar la inscripción mediante una nueva + llamada a Oneclick. +

+ +

+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.oneclick.Oneclick;
+
+var options = new WebpayOptions(
+                IntegrationCommerceCodes.ONECLICK_MALL,
+                IntegrationApiKeys.WEBPAY,
+                IntegrationType.TEST
+        );
+var inscription = new Oneclick.MallInscription(options);
+var response = inscription.finish(token);
+    
+ +

Paso 3: Respuesta

+

+ Transbank responderá con información crucial. Guarda estos detalles, ya + que serán necesarios para autorizar transacciones futuras. +

+ +
+ +

¡La tarjeta ya está inscrita!

+

+ Con la inscripción exitosa se pueden autorizar transacciones. +

+ +

Autorizar una transacción

+

+ Asegúrate de guardar los datos de la respuesta obtenidos durante la + inscripción. Estos serán esenciales para llevar a cabo transacciones de + manera efectiva. +

+ +
+ +

+ Después de una inscripción exitosa, tienes dos opciones: autorizar un pago + o borrar al usuario que se acaba de inscribir. +

+ +
+ + + + + +
+

Tienda 1

+
+
+ + +
+
+ + +
+
+ +

Tienda 2

+
+
+ + +
+
+ + +
+
+ + +
+
+ + + BORRAR USUARIO + +
+
diff --git a/src/main/resources/templates/oneclick_mall/refund.html b/src/main/resources/templates/oneclick_mall/refund.html new file mode 100644 index 0000000..36da17f --- /dev/null +++ b/src/main/resources/templates/oneclick_mall/refund.html @@ -0,0 +1,77 @@ +
+
+

Webpay Oneclick Mall - Reembolsar

+ +

+ En esta etapa, tienes la opción de solicitar el reembolso del monto al + titular de la tarjeta. Dependiendo del monto y el tiempo transcurrido + desde la autorización, este proceso podría resultar en una + Reversa o Anulación, dependiendo de ciertas condiciones (Reversa + en las primeras 3 horas de la autorización, Anulación posterior a + eso), o una Anulación parcial si el monto es menor al total. Las + anulaciones parciales para tarjetas débito y prepago no están soportadas. +

+ +

Paso 1 - Petición

+ +

+ Para llevar a cabo el reembolso, necesitas proporcionar la orden de compra + de la transacción, el código de comercio de la tienda, la orden de compra + del detalle de la transacción y el monto que deseas reversar. Si anulas el + monto total, podría ser una Reversa o Anulación, dependiendo + de ciertas condiciones (Reversa en las primeras 3 horas de la + autorización, Anulación posterior a eso), o una + Anulación Parcial si el monto es menor al total. +

+ +

Algunas consideraciones a tener en cuenta:

+
    +
  • No es posible realizar Anulaciones Parciales en pagos con cuotas.
  • +
+ +

+ En + + este link + + podrás ver mayor información sobre las condiciones y casos para anular o + reversar transacciones. +

+ +

+var options = new WebpayOptions(
+    IntegrationCommerceCodes.ONECLICK_MALL,
+    IntegrationApiKeys.WEBPAY,
+    IntegrationType.TEST
+);
+var transaction = new Oneclick.MallTransaction(options);
+var resp = transaction.refund(buyOrder, childCommerceCode, childBuyOrder, amount);
+    
+ +

Paso 2: Respuesta

+ +

+ Transbank responderá con el resultado del proceso de reembolso, indicando + si se ha realizado una Reversa, Anulación o + Anulación Parcial. +

+ +
+ + + CONSULTAR ESTADO + +
+
diff --git a/src/main/resources/templates/oneclick_mall/start.html b/src/main/resources/templates/oneclick_mall/start.html new file mode 100644 index 0000000..40160ee --- /dev/null +++ b/src/main/resources/templates/oneclick_mall/start.html @@ -0,0 +1,104 @@ +
+
+

Webpay Oneclick Mall - Creación de Inscripción

+

+ En esta etapa comienza el proceso de inscripción del medio de pago. Este + paso inicial es fundamental para dirigir al Tarjetahabiente al formulario + de inscripción. +

+ +

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

+ +

Paso 1: Petición

+
    +
  1. Comienza por importar la librería Oneclick en tu proyecto.
  2. +
  3. + Luego, inicia una inscripción utilizando las funciones proporcionadas + mediante el SDK. +
  4. +
+ +

+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.oneclick.Oneclick;
+
+var options = new WebpayOptions(
+                IntegrationCommerceCodes.ONECLICK_MALL,
+                IntegrationApiKeys.WEBPAY,
+                IntegrationType.TEST
+        );
+var inscription = new Oneclick.MallInscription(options);
+var resp = inscription.start(username, email, responseUrl);
+    
+ +

Paso 2: Respuesta

+

+ Una vez que hayas iniciado la inscripción, aquí encontrarás los datos de + respuesta generados por el proceso. +

+ +
+ +

Paso 3: Creación del formulario

+

+ Utiliza estos datos de respuesta para redireccionar al usuario al + formulario de inscripción del Tarjetahabiente. Este formulario será la + interfaz a través de la cual el usuario completará su inscripción. +

+ +

+
+ +

Ejemplo

+

+ Para llevar a cabo una inscripción en nuestro sistema, primero debemos + crearla. Utilizaremos los siguientes datos para configurar la inscripción: +

+ +
+ +

+ Por último, con la respuesta del servicio que confirma la creación de la + inscripción, procedemos a crear el formulario de redirección. Para fines + de este ejemplo, haremos visible el campo "TBK_TOKEN", el cual es esencial + para completar el proceso de inscripción de manera exitosa. +

+ + + Antes de continuar al formulario de Webpay, asegúrate de contar con los + datos de las tarjetas de prueba que están en la + documentación + + +
+
+ Formulario de redirección + + + +
+
+
+
diff --git a/src/main/resources/templates/oneclick_mall/status.html b/src/main/resources/templates/oneclick_mall/status.html new file mode 100644 index 0000000..d7a9f69 --- /dev/null +++ b/src/main/resources/templates/oneclick_mall/status.html @@ -0,0 +1,39 @@ +
+
+

Webpay Oneclick Mall - Consultar estado de transacción

+ +

+ Puedes solicitar el estado de una transacción hasta 7 días después de su + realización. No hay límite de solicitudes durante ese período. Sin + embargo, una vez pasados los 7 días, ya no podrás revisar su estado. +

+ +

Paso 1 - Petición:

+

+ Para realizar la consulta, necesitarás el buyOrder de la + transacción de interés. Utiliza este identificador para efectuar una + llamada a MallTransaction. +

+ +
+  
+var options = new WebpayOptions(
+    IntegrationCommerceCodes.ONECLICK_MALL,
+    IntegrationApiKeys.WEBPAY,
+    IntegrationType.TEST
+);
+var transaction = new Oneclick.MallTransaction(options);
+  var response = transaction.status(buyOrder);
+  
+
+ +

Paso 2: Respuesta

+

+ Transbank responderá con la siguiente información. Asegúrate de guardar + esta respuesta, y la única validación necesaria es que el campo + responseCode sea igual a 0. +

+ +
+
+
diff --git a/src/main/resources/templates/partials/sidebar.html b/src/main/resources/templates/partials/sidebar.html index 96b2a1e..dba7996 100644 --- a/src/main/resources/templates/partials/sidebar.html +++ b/src/main/resources/templates/partials/sidebar.html @@ -1,60 +1,83 @@