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 b1f87ef..3bae43e 100644 --- a/src/main/java/cl/transbank/webpay/example/controllers/BaseController.java +++ b/src/main/java/cl/transbank/webpay/example/controllers/BaseController.java @@ -7,9 +7,11 @@ public abstract class BaseController { protected static final String VIEW_ERROR = "error/error_page"; - protected static final String VIEW_ABORTED_ERROR = "error/aborted"; - protected static final String VIEW_FORM_ERROR = "error/form_error"; - protected static final String VIEW_TIMEOUT_ERROR = "error/timeout"; + protected static final String VIEW_ABORTED_ERROR = "error/webpay/aborted"; + protected static final String VIEW_FORM_ERROR = "error/webpay/form_error"; + protected static final String VIEW_TIMEOUT_ERROR = "error/webpay/timeout"; + protected static final String VIEW_RECOVER_ERROR = "error/oneclick/recover"; + protected static final String VIEW_REJECTED_ERROR = "error/oneclick/rejected"; public String toJson(Object obj) { return (new GsonBuilder().setPrettyPrinting().create()).toJson(obj); 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..66922c4 --- /dev/null +++ b/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallController.java @@ -0,0 +1,285 @@ +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 int AUTHORIZED = 0; + 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 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"; + 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_FINISH_RECOVER; + private static final Map NAV_FINISH_REJECTED; + 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_FINISH_RECOVER = new LinkedHashMap<>(); + NAV_FINISH_RECOVER.put("data", "Datos"); + + NAV_FINISH_REJECTED = new LinkedHashMap<>(); + NAV_FINISH_REJECTED.put("data", "Datos"); + NAV_FINISH_REJECTED.put("request", "Petición"); + NAV_FINISH_REJECTED.put("response", "Respuesta"); + + 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(MODEL_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(MODEL_RESPONSE, resp); + model.addAttribute(MODEL_RESPONSE_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 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); + addBreadcrumbs(model, "Finalizar inscripción", "#"); + + if (ordenCompra != null) { + model.addAttribute(MODEL_NAVIGATION, NAV_FINISH_RECOVER); + model.addAttribute("request_data_json", toJson(params)); + return VIEW_RECOVER_ERROR; + } + + String username = (String) req.getSession().getAttribute("username"); + + var resp = inscription.finish(token); + model.addAttribute(MODEL_RESPONSE, resp); + model.addAttribute(MODEL_RESPONSE_JSON, toJson(resp)); + + if (resp.getResponseCode() != AUTHORIZED) { + model.addAttribute(MODEL_NAVIGATION, NAV_FINISH_REJECTED); + model.addAttribute("request_data_json", toJson(params)); + return VIEW_REJECTED_ERROR; + } + + 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("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(MODEL_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(MODEL_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(MODEL_RESPONSE, resp); + model.addAttribute(MODEL_RESPONSE_JSON, toJson(resp)); + + return VIEW_AUTHORIZE; + } + + @GetMapping("/status") + public String status(@RequestParam("buy_order") String buyOrder, Model model) + throws IOException, TransactionStatusException { + + model.addAttribute(MODEL_NAVIGATION, NAV_STATUS); + addBreadcrumbs(model, "Consultar estado", "#"); + + var resp = transaction.status(buyOrder); + model.addAttribute(MODEL_RESPONSE_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(MODEL_NAVIGATION, NAV_REFUND); + addBreadcrumbs(model, "Reembolso", "#"); + + model.addAttribute("buy_order", buyOrder); + var resp = transaction.refund(buyOrder, childCommerceCode, childBuyOrder, amount); + model.addAttribute(MODEL_RESPONSE_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/java/cl/transbank/webpay/example/controllers/OneclickMallDeferredController.java b/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallDeferredController.java new file mode 100644 index 0000000..49d10a6 --- /dev/null +++ b/src/main/java/cl/transbank/webpay/example/controllers/OneclickMallDeferredController.java @@ -0,0 +1,305 @@ +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.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 +@RequestMapping("/oneclick-mall-deferred") +public class OneclickMallDeferredController extends BaseController { + + private static final int AUTHORIZED = 0; + 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 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_STATUS = TEMPLATE_FOLDER + "/status"; + private static final String VIEW_REFUND = TEMPLATE_FOLDER + "/refund"; + private static final String VIEW_CAPTURE = TEMPLATE_FOLDER + "/capture"; + private static final String VIEW_DELETE = TEMPLATE_FOLDER + "/delete"; + + private final Oneclick.MallInscription inscription; + private final Oneclick.MallTransaction transaction; + + private static final Map NAV_START; + private static final Map NAV_FINISH; + private static final Map NAV_FINISH_RECOVER; + private static final Map NAV_FINISH_REJECTED; + private static final Map NAV_DELETE; + private static final Map NAV_AUTHORIZE; + private static final Map NAV_STATUS; + private static final Map NAV_CAPTURE; + 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", "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_FINISH_RECOVER = new LinkedHashMap<>(); + NAV_FINISH_RECOVER.put("data", "Datos"); + + NAV_FINISH_REJECTED = new LinkedHashMap<>(); + NAV_FINISH_REJECTED.put("data", "Datos"); + NAV_FINISH_REJECTED.put("request", "Petición"); + NAV_FINISH_REJECTED.put("response", "Respuesta"); + + NAV_DELETE = new LinkedHashMap<>(); + NAV_DELETE.put("data", "Borrar usuario"); + + NAV_AUTHORIZE = new LinkedHashMap<>(); + NAV_AUTHORIZE.put("request", "Petición"); + NAV_AUTHORIZE.put("response", "Respuesta"); + NAV_AUTHORIZE.put("other", "Otras utilidades"); + + NAV_CAPTURE = NAV_AUTHORIZE; + + NAV_STATUS = new LinkedHashMap<>(); + NAV_STATUS.put("request", "Petición"); + NAV_STATUS.put("response", "Respuesta"); + + NAV_REFUND = NAV_STATUS; + } + + public OneclickMallDeferredController() { + var options = new WebpayOptions( + IntegrationCommerceCodes.ONECLICK_MALL_DEFERRED, + IntegrationApiKeys.WEBPAY, + IntegrationType.TEST + ); + inscription = new Oneclick.MallInscription(options); + 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 + "/"); + if (label != null) breadcrumbs.put(label, url); + model.addAttribute("product", PRODUCT); + model.addAttribute("breadcrumbs", breadcrumbs); + } + + @GetMapping("/") + public String start(HttpServletRequest req, Model model) + throws IOException, InscriptionStartException { + + model.addAttribute(MODEL_NAVIGATION, NAV_START); + addBreadcrumbs(model, "Iniciar inscripción", "#"); + + String username = "user_" + getRandomNumber(); + String email = "user." + getRandomNumber() + "@example.com"; + String returnUrl = req.getRequestURL().toString() + "finish"; + + var resp = inscription.start(username, email, returnUrl); + + model.addAttribute("request_data", Map.of( + "username", username, + "email", email, + "returnUrl", returnUrl + )); + model.addAttribute(MODEL_RESPONSE, resp); + model.addAttribute(MODEL_RESPONSE_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 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); + addBreadcrumbs(model, "Finalizar inscripción", "#"); + + if (ordenCompra != null) { + model.addAttribute(MODEL_NAVIGATION, NAV_FINISH_RECOVER); + model.addAttribute("request_data_json", toJson(params)); + return VIEW_RECOVER_ERROR; + } + + String username = (String) req.getSession().getAttribute("username"); + + var resp = inscription.finish(token); + model.addAttribute(MODEL_RESPONSE, resp); + model.addAttribute(MODEL_RESPONSE_JSON, toJson(resp)); + + if (resp.getResponseCode() != AUTHORIZED) { + model.addAttribute(MODEL_NAVIGATION, NAV_FINISH_REJECTED); + model.addAttribute("request_data_json", toJson(params)); + return VIEW_REJECTED_ERROR; + } + + 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("child_commerce_code1", IntegrationCommerceCodes.ONECLICK_MALL_DEFERRED_CHILD1); + model.addAttribute("child_commerce_code2", IntegrationCommerceCodes.ONECLICK_MALL_DEFERRED_CHILD2); + + return VIEW_FINISH; + } + + @GetMapping("/delete") + public String delete(@RequestParam String username, + @RequestParam("tbk_user") String tbkUser, + Model model) + throws IOException, InscriptionDeleteException { + + model.addAttribute(MODEL_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(MODEL_NAVIGATION, NAV_AUTHORIZE); + addBreadcrumbs(model, "Autorizar transacción", "#"); + + String buyOrder = "buyOrder_" + getRandomNumber(); + String childBuyOrder1 = "childOrder1_" + getRandomNumber(); + String childBuyOrder2 = "childOrder2_" + 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(MODEL_RESPONSE, resp); + model.addAttribute(MODEL_RESPONSE_JSON, toJson(resp)); + + return VIEW_AUTHORIZE; + } + + @GetMapping("/status") + public String status(@RequestParam("buy_order") String buyOrder, Model model) + throws IOException, TransactionStatusException { + + model.addAttribute(MODEL_NAVIGATION, NAV_STATUS); + addBreadcrumbs(model, "Consultar estado", "#"); + + var resp = transaction.status(buyOrder); + model.addAttribute(MODEL_RESPONSE_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(MODEL_NAVIGATION, NAV_REFUND); + addBreadcrumbs(model, "Reembolso", "#"); + + model.addAttribute("buy_order", buyOrder); + var resp = transaction.refund(buyOrder, childCommerceCode, childBuyOrder, amount); + model.addAttribute(MODEL_RESPONSE_JSON, toJson(resp)); + + return VIEW_REFUND; + } + + @GetMapping("/capture") + public String capture( + @RequestParam("buy_order") String buyOrder, + @RequestParam("child_commerce_code") String childCommerceCode, + @RequestParam("child_buy_order") String childBuyOrder, + @RequestParam("authorization_code") String authorizationCode, + @RequestParam double amount, + Model model) + throws IOException, TransactionCaptureException { + + model.addAttribute(MODEL_NAVIGATION, NAV_CAPTURE); + addBreadcrumbs(model, "Capturar", "#"); + + model.addAttribute("buy_order", buyOrder); + model.addAttribute("child_buy_order", childBuyOrder); + model.addAttribute("child_commerce_code", childCommerceCode); + + var resp = transaction.capture(childCommerceCode, childBuyOrder, authorizationCode, amount); + model.addAttribute(MODEL_RESPONSE, resp); + model.addAttribute(MODEL_RESPONSE_JSON, toJson(resp)); + + return VIEW_CAPTURE; + } + + @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/error/oneclick/recover.html b/src/main/resources/templates/error/oneclick/recover.html new file mode 100644 index 0000000..7ea527a --- /dev/null +++ b/src/main/resources/templates/error/oneclick/recover.html @@ -0,0 +1,19 @@ +
+
+

+

+ La inscripción ha sido anulada por el usuario. En esta instancia, la inscripción fue abandonada al seleccionar la opción 'Abandonar y volver al comercio'. +

+ +

Datos Recibidos:

+

+ Después de que el usuario anule la inscripción en el formulario de pago, recibirás un GET con la siguiente información: +

+ +
+ +

¡Se abandonó la inscripción!

+

Este mensaje indica que la inscripción ha sido cancelada por decisión del usuario. Si tienes alguna pregunta o necesitas asistencia, no dudes en contactarnos. Lamentamos cualquier inconveniente y agradecemos tu comprensión. +

+
+
diff --git a/src/main/resources/templates/error/oneclick/rejected.html b/src/main/resources/templates/error/oneclick/rejected.html new file mode 100644 index 0000000..d009262 --- /dev/null +++ b/src/main/resources/templates/error/oneclick/rejected.html @@ -0,0 +1,47 @@ +
+
+

+

+ En esta fase, pueden surgir inconvenientes, ya sea con el titular de la tarjeta o a nivel bancario, lo que + resulta en una inscripción fallida. +

+ +

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

+ +
+ +

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

Paso 3: Respuesta

+

+ Transbank responderá con la siguiente información. +

+ +
+ + +

Eso significa que la inscripción fue rechazada, por lo que se tiene que repetir el proceso.

+
+
diff --git a/src/main/resources/templates/error/aborted.html b/src/main/resources/templates/error/webpay/aborted.html similarity index 100% rename from src/main/resources/templates/error/aborted.html rename to src/main/resources/templates/error/webpay/aborted.html diff --git a/src/main/resources/templates/error/form_error.html b/src/main/resources/templates/error/webpay/form_error.html similarity index 100% rename from src/main/resources/templates/error/form_error.html rename to src/main/resources/templates/error/webpay/form_error.html diff --git a/src/main/resources/templates/error/timeout.html b/src/main/resources/templates/error/webpay/timeout.html similarity index 100% rename from src/main/resources/templates/error/timeout.html rename to src/main/resources/templates/error/webpay/timeout.html 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/oneclick_mall_deferred/authorize.html b/src/main/resources/templates/oneclick_mall_deferred/authorize.html new file mode 100644 index 0000000..e39a89c --- /dev/null +++ b/src/main/resources/templates/oneclick_mall_deferred/authorize.html @@ -0,0 +1,104 @@ +
+
+ +

Webpay Oneclick Mall Diferido - 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_DEFERRED,
+    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. +

+ +
+ +

¡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 + + +
+
diff --git a/src/main/resources/templates/oneclick_mall_deferred/capture.html b/src/main/resources/templates/oneclick_mall_deferred/capture.html new file mode 100644 index 0000000..7e35e19 --- /dev/null +++ b/src/main/resources/templates/oneclick_mall_deferred/capture.html @@ -0,0 +1,82 @@ +
+
+ +

Webpay Oneclick Mall Diferido - Capturar transacción diferida

+ +

+ En este paso debemos capturar la transacción para realmente capturar el dinero que había sido + previamente reservado al hacer la transacción. +

+ +

Paso 1: Petición

+ +

+ Para capturar una transacción necesitaremos el código de comercio de la tienda hija, la orden de compra + de la tienda hija, el código de autorización y el monto a capturar. Se hace de la siguiente manera: +

+ +

+var options = new WebpayOptions(
+    IntegrationCommerceCodes.ONECLICK_MALL_DEFERRED,
+    IntegrationApiKeys.WEBPAY,
+    IntegrationType.TEST
+);
+var transaction = new Oneclick.MallTransaction(options);
+var response = transaction.capture(childCommerceCode, childBuyOrder, authorizationCode, amount);
+    
+ +

Paso 2: Respuesta

+ +

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

+ +
+ +

¡Transacción Capturada!

+

+ Con la transacción capturada, 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 confirmar la transacción, considera las siguientes utilidades + adicionales: +

+

+ Reembolso: Evalúa la posibilidad de reversar o anular el pago según ciertas condiciones + comerciales. +

+

+ Consulta de Estado: Hasta 7 días después de la transacción, puedes consultar su estado para + obtener más detalles. +

+ +
+ + + + +
+
+ + +
+ +
+ + + CONSULTAR ESTADO + +
+
+
+ +
+
diff --git a/src/main/resources/templates/oneclick_mall_deferred/delete.html b/src/main/resources/templates/oneclick_mall_deferred/delete.html new file mode 100644 index 0000000..9ce8072 --- /dev/null +++ b/src/main/resources/templates/oneclick_mall_deferred/delete.html @@ -0,0 +1,56 @@ +
+
+ +

Webpay Oneclick Mall Diferido - 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_DEFERRED,
+                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_deferred/finish.html b/src/main/resources/templates/oneclick_mall_deferred/finish.html new file mode 100644 index 0000000..c30afa1 --- /dev/null +++ b/src/main/resources/templates/oneclick_mall_deferred/finish.html @@ -0,0 +1,109 @@ +
+
+ +

Webpay Oneclick Mall Diferido - 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_DEFERRED,
+                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_deferred/refund.html b/src/main/resources/templates/oneclick_mall_deferred/refund.html new file mode 100644 index 0000000..a405376 --- /dev/null +++ b/src/main/resources/templates/oneclick_mall_deferred/refund.html @@ -0,0 +1,68 @@ +
+
+ +

Webpay Oneclick Mall Diferido - 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_DEFERRED,
+    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_deferred/start.html b/src/main/resources/templates/oneclick_mall_deferred/start.html new file mode 100644 index 0000000..7f2705f --- /dev/null +++ b/src/main/resources/templates/oneclick_mall_deferred/start.html @@ -0,0 +1,95 @@ +
+
+ +

Webpay Oneclick Mall Diferido - 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_DEFERRED,
+                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_deferred/status.html b/src/main/resources/templates/oneclick_mall_deferred/status.html new file mode 100644 index 0000000..5718a29 --- /dev/null +++ b/src/main/resources/templates/oneclick_mall_deferred/status.html @@ -0,0 +1,39 @@ +
+
+

Webpay Oneclick Mall Diferido - 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_DEFERRED,
+    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..f197ba7 100644 --- a/src/main/resources/templates/partials/sidebar.html +++ b/src/main/resources/templates/partials/sidebar.html @@ -1,60 +1,105 @@