Skip to content

Commit

Permalink
Merge pull request #5 from TransbankDevelopers/feat/webpay-deferred
Browse files Browse the repository at this point in the history
Feat: webpay deferred
  • Loading branch information
victormendoza96 authored Jul 30, 2024
2 parents becaa06 + 8b798c0 commit 2968c28
Show file tree
Hide file tree
Showing 16 changed files with 391 additions and 12 deletions.
95 changes: 95 additions & 0 deletions app/Http/Controllers/WebpayPlusDeferredController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Transbank\Webpay\WebpayPlus\Transaction;
use Transbank\Webpay\Options;

class WebpayPlusDeferredController extends Controller
{
const COMMERCE_CODE = "597055555540";
const API_KEY = "579B532A7440BB0C9079DED94D31EA1615BACEB56610332264630D42D0A36B1C";
private Transaction $transaction;

public function __construct()
{
$option = new Options(self::API_KEY, self::COMMERCE_CODE, Options::ENVIRONMENT_INTEGRATION);
$this->transaction = new Transaction($option);
}

public function create()
{

$createTx = [
'buyOrder' => "O-" . rand(1, 10000),
"sessionId" => "S-" . (string)(rand(1, 10000)),
'returnUrl' => url('/') . '/webpay-plus-diferido/commit',
'amount' => rand(1000, 2000)
];


$resp = $this->transaction->create($createTx['buyOrder'], $createTx['sessionId'], $createTx['amount'], $createTx['returnUrl']);
return view('webpay-deferred.create', ["request" => $createTx, "respond" => $resp]);
}
public function commit(Request $request)
{
//Timeout
$view = 'webpay-deferred.timeout';
$data = ["request" => $request];

//flujo error
if ($request->exists("TBK_TOKEN") && $request->exists("token_ws")) {
$view = 'webpay-deferred.error';
}
//Pago abortado
elseif ($request->exists("TBK_TOKEN")) {
$view = 'webpay-deferred.error';
}
//Flujo normal
elseif ($request->exists("token_ws")) {
$resp = $this->transaction->commit($request["token_ws"]);
$view = 'webpay-deferred.commit';
$data = ["resp" => $resp, "token" => $request["token_ws"]];
}

return view($view, $data);
}

public function capture(Request $request)
{
try {
$req = $request->except('_token');
$resp = $this->transaction->capture($req["token"], $req["buyOrder"], $req["authorizationCode"], $req["amount"]);
} catch (\Exception $e) {
$resp = array(
'msg' => $e->getMessage(),
'code' => $e->getCode()
);
return view('webpay-deferred.capture', ["resp" => $resp, "token" => $req["token"]]);
}
return view('webpay-deferred.capture', ["resp" => $resp, "token" => $req["token"]]);
}

public function refund(Request $request)
{
try {
$req = $request->except('_token');
$resp = $this->transaction->refund($req["token"], $req["amount"]);
} catch (\Exception $e) {
$resp = array(
'msg' => $e->getMessage(),
'code' => $e->getCode()
);
return view('webpay-deferred.refund', ["resp" => $resp]);
}
return view('webpay-deferred.refund', ["resp" => $resp]);
}

public function status(Request $request)
{
$token = $request["token"];
$resp = $this->transaction->status($token);
return view('webpay-deferred.status', ["resp" => $resp, "req" => $request]);
}
}
8 changes: 4 additions & 4 deletions resources/views/components/menu.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
<div class="tbk-menu-item-container">
<span class="tbk-menu-item-text">Webpay Plus</span>
@foreach ([
'Wepbay Plus' => route('webpay.create'),
'Wepbay Plus Diferido' => route('webpay.create'),
'Wepbay Mall' => route('webpay-mall.create'),
'Wepbay Mall Diferido' => route('webpay.create'),
'Webpay Plus' => route('webpay.create'),
'Webpay Plus Diferido' => route('webpay-deferred.create'),
'Webpay Mall' => route('webpay-mall.create'),
'Webpay Mall Diferido' => route('webpay.create'),
] as $menuItemName => $url)
<a href="{{ $url }}" class="tbk-menu-item {{ $activeLink == $menuItemName ? 'active' : '' }}">
{{ $menuItemName }}
Expand Down
59 changes: 59 additions & 0 deletions resources/views/webpay-deferred/capture.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
@php
$navigation = ['create' => 'Crear transacción', 'example' => 'Ejemplo'];
@endphp

<x-layout active-link="Webpay Plus Diferido" :navigation="$navigation">
<h1 id="create">Webpay Plus Diferido - Creación de transacción</h1>
<p class="mb-32">
En este paso debemos capturar la transacción para realmente capturar el dinero que habia sido previamente
reservado al hacer la transacción
</p>

<h2>Paso 1: Petición</h2>
<p class="mb-32">
Para capturar una transacción necesitaremos el Token, Orden de compra, Código de autorización y monto a
capturar. Se hace de la siguiente manera.
</p>
<x-snippet>
$resp = $transaction->capture($token, $buyOrder, $authorizationCode, $amount);
</x-snippet>

<h2>Paso 2: Respuesta</h2>
<p class="mb-32">
Transbank contestará con lo siguiente. Debes guardar esta información, lo único que debes validar
es que response_code sea igual a cero.
</p>

<x-snippet :content="$resp" />

<h2 id="example">
Otras utilidades
</h2>
<p class="mb-32">
Luego de capturada la transacción puedes Reembolsar (reversar o anular) el pago dependiendo de
ciertas condiciones comerciales. También puedes consultar el estado de la transacción hasta 7 días después de
realizada.
</p>

<p class="mb-32">
Por último, con la respuesta del servicio que confirma la creación de la transacción, procedemos
a crear el formulario de pago. Para fines de este ejemplo, haremos visible el campo "token_ws", el cual es
esencial para completar el proceso de pago de manera exitosa.
</p>

<form action={{ route('webpay-deferred.refund') }} method="POST">
@csrf
<div class="tbk-card">
<div class="input-container">
<label for="amount" class="tbk-label">Monto a Reembolsar:</label>
<input type="text" name="amount" class="tbk-input-text" value={{ $resp->capturedAmount }}>
<input type="hidden" name="token" class="tbk-input-text" value={{ $token }}>
</div>
<div class="tbk-card-footer ">
<button class="tbk-button primary">REEMBOLSAR</button>
</div>
</div>
</form>
<a href={{ route('webpay-deferred.status', ['token' => $token]) }} class="tbk-button primary mb-32">CONSULTAR
ESTADO</a>
</x-layout>
78 changes: 78 additions & 0 deletions resources/views/webpay-deferred/commit.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
@php
$navigation = ['confirm' => 'Confirmar transacción', 'other' => 'Ejemplo'];
@endphp

<x-layout active-link="Webpay Plus Diferido" :navigation="$navigation">

<h1 id="confirm">Webpay Plus Diferido - Confirmar transacción</h1>
<p class="mb-32">En este paso es importante confirmar la transacción para notificar a Transbank que hemos recibido
exitosamente los detalles de la transacción. Si la confirmación no se realiza, la transacción será reversada.
</p>

<h2>Paso 1 - Datos recibidos:</h2>
<ul class="mb-32">
<p class="m-32">
Después de completar el flujo en el formulario de pago, recibirás un GET con la siguiente
información:
</p>
</ul>
<x-snippet>(returnUrl)?token_ws={{ $token }} </x-snippet>

<h2>Paso 2 - Petición:</h2>
<p class="mb-32">
Utilizarás el token recibido para confirmar la transacción mediante una nueva llamada a WebpayPlus.
</p>

<x-snippet>
$resp = $transaction->commit($token);
</x-snippet>

<h2>Paso 3 - Respuesta:</h2>
<p class="mb-32">
Transbank responderá con la siguiente información. Es crucial guardar esta respuesta, y la única
validación necesaria es que el campo "response_code" sea igual a cero.
</p>

<x-snippet :content="$resp" />


<h2>¡Listo!</h2>
<p class="mb-32">
Es importante tener en cuenta que la transacción aún no ha sido capturada, por lo que hay que dejarle saber al
tarjetahabiente que necesita un paso más; solo se ha retenido el saldo en su tarjeta. Después de confirmar la
transacción, puedes:
</p>

<ul class="mb-32">
<li>
Capturar la transacción.
</li>
<li>
Revertir la transacción si es necesario.
</li>
<li>
Consultar el estado de la transacción hasta 7 días después de realizada.
</li>
</ul>

<form action={{ route('webpay-deferred.capture') }} method="POST">
@csrf
<div class="tbk-card">
<p class="mb-32">Capturar la transacción para realmente capturar el dinero que habia sido previamente
reservado.</p>
<div class="input-container">
<label for="amount" class="tbk-label">Monto a capturar:</label>
<input type="text" name="amount" class="tbk-input-text" value={{ $resp->amount }}>
<input type="hidden" name="buyOrder" class="tbk-input-text" value={{ $resp->buyOrder }}>
<input type="hidden" name="authorizationCode" class="tbk-input-text"
value={{ $resp->authorizationCode }}>
<input type="hidden" name="token" class="tbk-input-text" value={{ $token }}>
</div>
<div class="tbk-card-footer ">
<button class="tbk-button primary">CAPTURAR</button>
</div>
</div>
</form>
<a href={{ route('webpay-deferred.status', ['token' => $token]) }} class="tbk-button primary mb-32">CONSULTAR
ESTADO</a>
</x-layout>
72 changes: 72 additions & 0 deletions resources/views/webpay-deferred/create.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
@php
$navigation = ['create' => 'Crear transacción', 'example' => 'Ejemplo'];
@endphp

<x-layout active-link="Webpay Plus Diferido" :navigation="$navigation">
<h1 id="create">Webpay Plus Diferido - Creación de transacción</h1>
<p class="mb-32">
En esta etapa, se procederá a la creación de una transacción con el fin de obtener un identificador
único. Esto
nos permitirá redirigir al Tarjetahabiente hacia el formulario de pago en el siguiente paso.
</p>

<h2>Paso 1: Petición</h2>
<ul class="mb-32">
<li>Comienza por importar la librería WebpayPlus en tu proyecto.</li>
<li>Luego, crea una transacción utilizando las funciones proporcionadas por WebpayPlus.</li>
</ul>
<x-snippet>
use Transbank\Webpay\WebpayPlus\Transaction;
use Transbank\Webpay\Options;
//configuración de la transacción
$option = new Options(API_KEY, COMMERCE_CODE, Options::ENVIRONMENT_INTEGRATION);
$transaction = new Transaction($option);
$transaction->create($buyOrder, $sessionId, $amount, $returnUrl);
</x-snippet>

<h2>Paso 2: Respuesta</h2>
<p class="mb-32">Una vez que hayas creado la transacción, aquí encontrarás los datos de respuesta generados por el
proceso.
</p>

<x-snippet :content="$respond" />

<h2>Paso 3: Creación del formulario</h2>
<p class="mb-32">Utiliza estos datos de respuesta para generar y presentar un formulario de pago al Tarjetahabiente.
Este formulario será la interfaz a través de la cual el usuario realizará su transacción.
</p>

<x-snippet>
form action="https://webpay3gint.transbank.cl/webpayserver/initTransaction" method="POST">
input type="hidden" name="token_ws" value="{{ $respond->token }}" />
input type="submit" value="Pagar" />
form>
</x-snippet>

<h2 id="example">Ejemplo</h2>
<p class="mb-32">Para llevar a cabo una transacción de compra en nuestro sistema, primero debemos crear la
transacción. Utilizaremos los siguientes datos para configurar la transacción:
</p>

<div class="mb-32">
<x-table :request="$request" />
</div>

<p class="mb-32">Por último, con la respuesta del servicio que confirma la creación de la transacción, procedemos
a crear el formulario de pago. Para fines de este ejemplo, haremos visible el campo "token_ws", el cual es
esencial para completar el proceso de pago de manera exitosa.
</p>

<form action={{ $respond->url }} action="POST">
<div class="tbk-card">
<span class="tbk-card-title">Formulario de redirección</span>
<div class="input-container">
<label for="tokew_ws" class="tbk-label">Token</label>
<input type="text" name="token_ws" class="tbk-input-text" value={{ $respond->token }} required>
</div>
<div class="tbk-card-footer">
<button class="tbk-button primary">PAGAR</button>
</div>
</div>
</form>
</x-layout>
36 changes: 36 additions & 0 deletions resources/views/webpay-deferred/refund.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
@php
$navigation = ['refund' => 'Reembolsar'];
@endphp

<x-layout active-link="Webpay Plus" :navigation="$navigation">

<h1 id="refund">Webpay Plus - Reembolsar</h1>
<p class="mb-32">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 transacción, este proceso podría resultar en una
Reversa, Anulación o Anulación Parcial.
</p>

<h2>Paso 1 - Petición:</h2>
<p class="mb-32">Para llevar a cabo el reembolso, necesitas proporcionar el token 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, o
una Anulación Parcial si el monto es menor al total.
</p>

<p>Condiciones Importantes:</p>
<ul>
<li>
No es posible realizar Anulaciones ni Anulaciones Parciales en tarjetas que no sean de crédito.
</li>
<li>No se admiten reembolsos de compras en cuotas.</li>
</ul>

<x-snippet> $resp = $transaction->refund($token, $amount);</x-snippet>

<h2>Paso 2: Respuesta</h2>
<p class="mb-32">Transbank responderá con el resultado del proceso de reembolso, indicando si se ha realizado una
Reversa, Anulación o Anulación Parcial.
</p>

<x-snippet :content="$resp" />
</x-layout>
30 changes: 30 additions & 0 deletions resources/views/webpay-deferred/status.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
@php
$navigation = ['state' => 'Consultar estado'];
@endphp

<x-layout active-link="Webpay Plus" :navigation="$navigation">

<h1 id="state">Webpay Plus - Consultar estado de transacción</h1>
<p class="mb-32">Puedes solicitar el estado de una transacción hasta 7 días después de su realización. No hay límite
de solicitudes de este tipo durante ese período. Sin embargo, una vez pasados los 7 días, ya no podrás revisar
su estado.
</p>

<h2>Paso 1 - Petición:</h2>
<p class="mb-32">
Para realizar la consulta, necesitas el token de la transacción de la cual deseas obtener el estado. Utiliza
este token para realizar una llamada a WebpayPlus.Transaction.
</p>

<x-snippet> $resp = $transaction->status($token);</x-snippet>


<h2>Paso 2: Respuesta</h2>
<p class="mb-32">
Transbank responderá con la siguiente información. Asegúrate de guardar esta respuesta, y la única validación
necesaria es que el campo "response_code" sea igual a cero.
</p>

<x-snippet :content="$resp" />

</x-layout>
2 changes: 1 addition & 1 deletion resources/views/webpay-mall/commit.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
$navigation = ['confirm' => 'Confirmar transacción', 'other' => 'Otras operaciones'];
@endphp

<x-layout active-link="Wepbay Mall" :navigation="$navigation">
<x-layout active-link="Webpay Mall" :navigation="$navigation">

<h1 id="confirm">Webpay Mall - Confirmar transacción</h1>
<p class="mb-32">En este paso es importante confirmar la transacción para notificar a Transbank que hemos recibido
Expand Down
Loading

0 comments on commit 2968c28

Please sign in to comment.