diff --git a/app/Http/Controllers/WebpayPlusDeferredController.php b/app/Http/Controllers/WebpayPlusDeferredController.php new file mode 100644 index 0000000..62ca70d --- /dev/null +++ b/app/Http/Controllers/WebpayPlusDeferredController.php @@ -0,0 +1,95 @@ +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]); + } +} diff --git a/resources/views/components/menu.blade.php b/resources/views/components/menu.blade.php index de0170f..aab4155 100644 --- a/resources/views/components/menu.blade.php +++ b/resources/views/components/menu.blade.php @@ -2,10 +2,10 @@
Webpay Plus @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) {{ $menuItemName }} diff --git a/resources/views/webpay-deferred/capture.blade.php b/resources/views/webpay-deferred/capture.blade.php new file mode 100644 index 0000000..c38057f --- /dev/null +++ b/resources/views/webpay-deferred/capture.blade.php @@ -0,0 +1,59 @@ +@php + $navigation = ['create' => 'Crear transacción', 'example' => 'Ejemplo']; +@endphp + + +

Webpay Plus Diferido - Creación de transacción

+

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

+ +

Paso 1: Petición

+

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

+ + $resp = $transaction->capture($token, $buyOrder, $authorizationCode, $amount); + + +

Paso 2: Respuesta

+

+ Transbank contestará con lo siguiente. Debes guardar esta información, lo único que debes validar + es que response_code sea igual a cero. +

+ + + +

+ Otras utilidades +

+

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

+ +

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

+ +
+ @csrf +
+
+ + capturedAmount }}> + +
+ +
+
+
$token]) }} class="tbk-button primary mb-32">CONSULTAR + ESTADO + diff --git a/resources/views/webpay-deferred/commit.blade.php b/resources/views/webpay-deferred/commit.blade.php new file mode 100644 index 0000000..dec1889 --- /dev/null +++ b/resources/views/webpay-deferred/commit.blade.php @@ -0,0 +1,78 @@ +@php + $navigation = ['confirm' => 'Confirmar transacción', 'other' => 'Ejemplo']; +@endphp + + + +

Webpay Plus Diferido - Confirmar transacción

+

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

+ +

Paso 1 - Datos recibidos:

+ + (returnUrl)?token_ws={{ $token }} + +

Paso 2 - Petición:

+

+ Utilizarás el token recibido para confirmar la transacción mediante una nueva llamada a WebpayPlus. +

+ + + $resp = $transaction->commit($token); + + +

Paso 3 - Respuesta:

+

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

+ + + + +

¡Listo!

+

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

+ +
    +
  • + Capturar la transacción. +
  • +
  • + Revertir la transacción si es necesario. +
  • +
  • + Consultar el estado de la transacción hasta 7 días después de realizada. +
  • +
+ +
+ @csrf +
+

Capturar la transacción para realmente capturar el dinero que habia sido previamente + reservado.

+
+ + amount }}> + buyOrder }}> + authorizationCode }}> + +
+ +
+
+ $token]) }} class="tbk-button primary mb-32">CONSULTAR + ESTADO +
diff --git a/resources/views/webpay-deferred/create.blade.php b/resources/views/webpay-deferred/create.blade.php new file mode 100644 index 0000000..f38f8c4 --- /dev/null +++ b/resources/views/webpay-deferred/create.blade.php @@ -0,0 +1,72 @@ +@php + $navigation = ['create' => 'Crear transacción', 'example' => 'Ejemplo']; +@endphp + + +

Webpay Plus Diferido - Creación de transacción

+

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

+ +

Paso 1: Petición

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

Paso 2: Respuesta

+

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

+ + + +

Paso 3: Creación del formulario

+

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

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

Ejemplo

+

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

+ +
+ +
+ +

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

+ +
url }} action="POST"> +
+ Formulario de redirección +
+ + token }} required> +
+ +
+
+
diff --git a/resources/views/webpay-deferred/refund.blade.php b/resources/views/webpay-deferred/refund.blade.php new file mode 100644 index 0000000..8f1ab07 --- /dev/null +++ b/resources/views/webpay-deferred/refund.blade.php @@ -0,0 +1,36 @@ +@php + $navigation = ['refund' => 'Reembolsar']; +@endphp + + + +

Webpay Plus - 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 transacción, este proceso podría resultar en una + Reversa, Anulación o Anulación Parcial. +

+ +

Paso 1 - Petición:

+

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

+ +

Condiciones Importantes:

+ + + $resp = $transaction->refund($token, $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. +

+ + +
diff --git a/resources/views/webpay-deferred/status.blade.php b/resources/views/webpay-deferred/status.blade.php new file mode 100644 index 0000000..b554b55 --- /dev/null +++ b/resources/views/webpay-deferred/status.blade.php @@ -0,0 +1,30 @@ +@php + $navigation = ['state' => 'Consultar estado']; +@endphp + + + +

Webpay Plus - 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 de este tipo 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, necesitas el token de la transacción de la cual deseas obtener el estado. Utiliza + este token para realizar una llamada a WebpayPlus.Transaction. +

+ + $resp = $transaction->status($token); + + +

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 "response_code" sea igual a cero. +

+ + + +
diff --git a/resources/views/webpay-mall/commit.blade.php b/resources/views/webpay-mall/commit.blade.php index 466e1b3..83163b1 100644 --- a/resources/views/webpay-mall/commit.blade.php +++ b/resources/views/webpay-mall/commit.blade.php @@ -2,7 +2,7 @@ $navigation = ['confirm' => 'Confirmar transacción', 'other' => 'Otras operaciones']; @endphp - +

Webpay Mall - Confirmar transacción

En este paso es importante confirmar la transacción para notificar a Transbank que hemos recibido diff --git a/resources/views/webpay-mall/create.blade.php b/resources/views/webpay-mall/create.blade.php index df06faa..ea7e511 100644 --- a/resources/views/webpay-mall/create.blade.php +++ b/resources/views/webpay-mall/create.blade.php @@ -2,7 +2,7 @@ $navigation = ['create' => 'Crear transacción', 'example' => 'Ejemplo']; @endphp - +

Webpay Mall - Creación de transacción Mall

diff --git a/resources/views/webpay-mall/refund.blade.php b/resources/views/webpay-mall/refund.blade.php index 619f357..ce8afc9 100644 --- a/resources/views/webpay-mall/refund.blade.php +++ b/resources/views/webpay-mall/refund.blade.php @@ -2,7 +2,7 @@ $navigation = ['refund' => 'Reembolsar']; @endphp - +

Webpay Plus - 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 transacción, este proceso podría resultar en una diff --git a/resources/views/webpay-mall/status.blade.php b/resources/views/webpay-mall/status.blade.php index 8aa5847..1e68cbd 100644 --- a/resources/views/webpay-mall/status.blade.php +++ b/resources/views/webpay-mall/status.blade.php @@ -2,7 +2,7 @@ $navigation = ['state' => 'Consultar estado']; @endphp - +

Webpay Plus - 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 diff --git a/resources/views/webpay/commit.blade.php b/resources/views/webpay/commit.blade.php index 53e9ac9..78c6e19 100644 --- a/resources/views/webpay/commit.blade.php +++ b/resources/views/webpay/commit.blade.php @@ -2,7 +2,7 @@ $navigation = ['confirm' => 'Confirmar transacción', 'other' => 'Ejemplo']; @endphp - +

Webpay Plus - Confirmar transacción

En este paso es importante confirmar la transacción para notificar a Transbank que hemos recibido diff --git a/resources/views/webpay/create.blade.php b/resources/views/webpay/create.blade.php index dcbd001..a0b00ac 100644 --- a/resources/views/webpay/create.blade.php +++ b/resources/views/webpay/create.blade.php @@ -2,7 +2,7 @@ $navigation = ['create' => 'Crear transacción', 'example' => 'Ejemplo']; @endphp - +

Webpay Plus - Creación de transacción

En esta etapa, se procederá a la creación de una transacción con el fin de obtener un identificador único. Esto diff --git a/resources/views/webpay/refund.blade.php b/resources/views/webpay/refund.blade.php index 52a443c..8f1ab07 100644 --- a/resources/views/webpay/refund.blade.php +++ b/resources/views/webpay/refund.blade.php @@ -2,7 +2,7 @@ $navigation = ['refund' => 'Reembolsar']; @endphp - +

Webpay Plus - Reembolsar

En esta etapa, tienes la opción de solicitar el reembolso del monto al titular de la tarjeta. diff --git a/resources/views/webpay/status.blade.php b/resources/views/webpay/status.blade.php index ea75439..b554b55 100644 --- a/resources/views/webpay/status.blade.php +++ b/resources/views/webpay/status.blade.php @@ -2,7 +2,7 @@ $navigation = ['state' => 'Consultar estado']; @endphp - +

Webpay Plus - 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 diff --git a/routes/web.php b/routes/web.php index 4d038d9..72c3c10 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,6 +2,7 @@ use App\Http\Controllers\WebpayController; use App\Http\Controllers\WebpayPlusMallController; +use App\Http\Controllers\WebpayPlusDeferredController; use Illuminate\Support\Facades\Route; @@ -23,3 +24,11 @@ Route::post('/refund', [WebpayPlusMallController::class, 'refund'])->name("refund"); Route::get('/status', [WebpayPlusMallController::class, 'status'])->name("status"); }); + +Route::prefix('webpay-plus-diferido')->name("webpay-deferred.")->group(function () { + Route::get('/create', [WebpayPlusDeferredController::class, 'create'])->name("create"); + Route::get('/commit', [WebpayPlusDeferredController::class, 'commit'])->name("commit"); + Route::post('/capture', [WebpayPlusDeferredController::class, 'capture'])->name("capture"); + Route::post('/refund', [WebpayPlusDeferredController::class, 'refund'])->name("refund"); + Route::get('/status', [WebpayPlusDeferredController::class, 'status'])->name("status"); +});