-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #5 from TransbankDevelopers/feat/webpay-deferred
Feat: webpay deferred
- Loading branch information
Showing
16 changed files
with
391 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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]); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.