Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -13,8 +16,20 @@ 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> 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().setPrettyPrinting().create()).toJson(obj);
return new GsonBuilder()
.setPrettyPrinting()
.registerTypeAdapter(Double.class, DOUBLE_SERIALIZER)
.registerTypeAdapter(double.class, DOUBLE_SERIALIZER)
.create()
.toJson(obj);
}

protected String getRandomNumber() {
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/templates/oneclick_mall/authorize.html
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ <h2>Otras utilidades</h2>
class="tbk-input-text"
type="text"
name="amount"
th:value="${detail.amount}"
th:value="${T(java.math.BigDecimal).valueOf(detail.amount).stripTrailingZeros().toPlainString()}"
/>
</div>
</div>
Expand Down
176 changes: 103 additions & 73 deletions src/main/resources/templates/oneclick_mall_deferred/authorize.html
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
<div th:replace="~{layout :: layout(~{::content})}">
<div th:fragment="content">
<div th:fragment="content">
<h1>Webpay Oneclick Mall Diferido - Autorizar pago</h1>

<h1>Webpay Oneclick Mall Diferido - Autorizar pago</h1>
<p class="mb-32">
En este primer paso, procederemos a autorizar una transacción en la
tarjeta que ha sido previamente inscrita.
</p>

<p class="mb-32">
En este primer paso, procederemos a autorizar una transacción en la tarjeta que ha sido previamente
inscrita.
</p>
<h2 id="request">Paso 1: Petición</h2>

<h2 id="request">Paso 1: Petición</h2>
<p class="mb-32">
Ahora que contamos con el <b>username</b> y el <b>tbkUser</b> obtenidos
durante la inscripción, estamos listos para autorizar transacciones en la
tarjeta inscrita.
</p>

<p class="mb-32">
Ahora que contamos con el <b>username</b> y el <b>tbkUser</b> obtenidos durante la inscripción,
estamos listos para autorizar transacciones en la tarjeta inscrita.
</p>

<pre><code class="language-java">
<pre><code class="language-java">
var options = new WebpayOptions(
IntegrationCommerceCodes.ONECLICK_MALL_DEFERRED,
IntegrationApiKeys.WEBPAY,
Expand All @@ -39,66 +39,96 @@ <h2 id="request">Paso 1: Petición</h2>
var resp = transaction.authorize(username, tbkUser, buyOrder, details);
</code></pre>

<h2 class="mt-32" id="response">Paso 2: Respuesta</h2>

<p class="mb-32">
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 <b>responseCode</b> tenga un valor de
0 y que el campo <b>status</b> sea AUTHORIZED.
</p>

<pre><code class="language-json mb-32" th:text="${response_data_json}"></code></pre>

<h2 id="other">¡Casi listo!</h2>

<p class="mb-32">
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.
</p>

<div th:each="detail : ${response_data.details}">
<form th:action="@{/oneclick-mall-deferred/capture}" method="get">
<input type="hidden" name="buy_order" th:value="${response_data.buyOrder}"/>

<div class="tbk-card">
<div class="card-multi-field">
<div class="input-container">
<label class="tbk-label" for="child_commerce_code">Código de comercio (tienda hija):</label>
<input class="tbk-input-text" type="text" name="child_commerce_code"
th:value="${detail.commerceCode}"/>
</div>

<div class="input-container">
<label class="tbk-label" for="child_buy_order">Orden de compra (tienda hija):</label>
<input class="tbk-input-text" type="text" name="child_buy_order"
th:value="${detail.buyOrder}"/>
</div>

<div class="input-container">
<label class="tbk-label" for="authorization_code">Código de autorización (tienda
hija):</label>
<input class="tbk-input-text" type="text" name="authorization_code"
th:value="${detail.authorizationCode}"/>
</div>

<div class="input-container">
<label class="tbk-label" for="amount">Monto a capturar (tienda hija):</label>
<input class="tbk-input-text" type="text" name="amount" th:value="${detail.amount}"/>
</div>
</div>

<div class="tbk-card-footer">
<button type="submit" class="tbk-button primary">CAPTURAR</button>
</div>
</div>
</form>
<h2 class="mt-32" id="response">Paso 2: Respuesta</h2>

<p class="mb-32">
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 <b>responseCode</b> tenga un valor de 0 y que el campo
<b>status</b> sea AUTHORIZED.
</p>

<pre><code class="language-json mb-32" th:text="${response_data_json}"></code></pre>

<h2 id="other">¡Casi listo!</h2>

<p class="mb-32">
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.
</p>

<div th:each="detail : ${response_data.details}">
<form th:action="@{/oneclick-mall-deferred/capture}" method="get">
<input
type="hidden"
name="buy_order"
th:value="${response_data.buyOrder}"
/>

<div class="tbk-card">
<div class="card-multi-field">
<div class="input-container">
<label class="tbk-label" for="child_commerce_code"
>Código de comercio (tienda hija):</label
>
<input
class="tbk-input-text"
type="text"
name="child_commerce_code"
th:value="${detail.commerceCode}"
/>
</div>

<div class="input-container">
<label class="tbk-label" for="child_buy_order"
>Orden de compra (tienda hija):</label
>
<input
class="tbk-input-text"
type="text"
name="child_buy_order"
th:value="${detail.buyOrder}"
/>
</div>

<div class="input-container">
<label class="tbk-label" for="authorization_code"
>Código de autorización (tienda hija):</label
>
<input
class="tbk-input-text"
type="text"
name="authorization_code"
th:value="${detail.authorizationCode}"
/>
</div>

<div class="input-container">
<label class="tbk-label" for="amount"
>Monto a capturar (tienda hija):</label
>
<input
class="tbk-input-text"
type="text"
name="amount"
th:value="${T(java.math.BigDecimal).valueOf(detail.amount).stripTrailingZeros().toPlainString()}"
/>
</div>
</div>

<div class="tbk-card-footer">
<button type="submit" class="tbk-button primary">CAPTURAR</button>
</div>
</div>

<a class="tbk-button primary mb-32"
th:href="@{/oneclick-mall-deferred/status(buy_order=${response_data.buyOrder})}">
CONSULTAR ESTADO
</a>

</form>
</div>

<a
class="tbk-button primary mb-32"
th:href="@{/oneclick-mall-deferred/status(buy_order=${response_data.buyOrder})}"
>
CONSULTAR ESTADO
</a>
</div>
</div>
Loading