Usar Redsys con Laravel

En España, cuando realizamos un proyecto en laravel, como una tienda virtual y necesitamos conectar las compras redsys con laravel pensamos en buscar módulos que nos puedan ayudar.

Para Laravel 5 hay un módulo que nos ayuda mucho con la integración  el cual dejo el link aqui Sobre ese modulo vamos a retocar un poco su configuración y a aportar más documentación de la que proporciona para que la adaptación sea más limpia y fácil.

Instalando Modulo Redsys en Laravel

para este ejemplo usaremos la versión más reciente que ha sido hecho el módulo. la 5.5

$ composer require "ssheduardo/redsys-laravel=~1.2"

Luego deberías ejecutar artisan para obtener las configuraciones del modulo

php artisan vendor:publish --provider="SsheduardoRedsysRedsysServiceProvider"

Si trabajas con una versión inferior a la 5.5 deberías hacer los siguientes pasos:

Debemos cargar nuestro Services Provider dentro del array ‘providers’ (config/app.php)


SsheduardoRedsysRedsysServiceProvider::class

Creamos un alias dentro del array ‘aliases’ (config/app.php)

'Redsys' => SsheduardoRedsysFacadesRedsys::class,

Configurando el Módulo con tu proyecto

Los datos que usaremos de prueba no será los mismos de producción. por lo tanto debemos generar una pequeña configuración a este módulo.

Para empezar en nuestro archivo de configuración de redsys (/config/redsys.php) encontraremos lo siguiente:

<?php
return [
'key' => '',
'url_notification' => '',
'url_ok' => '',
'url_ko' => '',
];

Vamos a agregarles unas variables nuevas

<?php
return [
'key'=> env('REDSYS_KEY',''),
'url_ok'=> env('REDSYS_URL_OK',''),
'url_ko'=> env('REDSYS_URL_KO',''),
'merchantcode'=> env('REDSYS_MERCHANT_CODE',''),
'terminal'=> env('REDSYS_TERMINAL','2'),
'enviroment'=> env('REDSYS_ENVIROMENT','test'),
'url_notification'=> env('REDSYS_URL_NOTIFICATION',''),
'tradename'=> env('REDSYS_TRADENAME',''),
'titular'=> env('REDSYS_TITULAR',''),
'description'=> env('REDSYS_DESCRIPTION','')
];

usaremos la función ENV para obtener los valores del archivo .env (puedes ver más detalles aqui) que serán los datos que necesitaremos y que pondremos en nuestro archivo .env para diferenciarlos de producción a desarrollo.

 

Creando el controlador para Redsys

Para ello vamos a la consola y creamos

php artisan make:controller RedsysController

y agregaremos algunas cosas al inicio del controlador

use IlluminateHttpRequest;
use AppHttpRequests; // para recibir la notificación via request
use SsheduardoRedsysFacadesRedsys; //el controlador de redsys

 

creamos la función index del controlador

/**
* Crear formulario redsys
*
*/
public static function index($order,$amount,$display=true,$des=false)
{
try{
$order = str_pad($order,12,0,STR_PAD_LEFT);
$key = config('redsys.key');
$merchantcode = config('redsys.merchantcode');
$terminal = config('redsys.terminal');
$enviroment = config('redsys.enviroment');
$urlOk = url(config('redsys.url_ok'));
$urlKo = url(config('redsys.url_ko'));
$urlNotification= url(config('redsys.url_notification'));
$tradeName = config('redsys.tradename');
$titular = config('redsys.titular');
$description = $des?$des:config('redsys.description');
Redsys::setAmount($amount);
Redsys::setOrder($order);
Redsys::setMerchantcode($merchantcode);
Redsys::setCurrency('978');
Redsys::setTransactiontype('0');
Redsys::setTerminal($terminal);
Redsys::setMethod('T');
Redsys::setNotification(config('redsys.url_notification'));
Redsys::setUrlOk(config('redsys.url_ok'));
Redsys::setUrlKo(config('redsys.url_ko'));
Redsys::setVersion('HMAC_SHA256_V1');
Redsys::setTradeName($tradeName);
Redsys::setTitular($titular);
Redsys::setProductDescription($description);
Redsys::setEnviroment($enviroment);
$signature = Redsys::generateMerchantSignature($key);
Redsys::setMerchantSignature($signature);
if($display==false){
Redsys::setAttributesSubmit('btn_submit', 'btn_id', 'Enviar', 'display:none');
return Redsys::executeRedirection();
}else{
return Redsys::createForm();
}
}
catch(Exception $e){
echo $e->getMessage();
}
}

con esta función podemos crear un boton de compra para que vaya a redsys con los datos necesarios:

$order: el número de orden del pedido

$amount: la cantidad a cobrar

$display: si quieres que se muestre el boton o que directamente se redireccione a redsys

$des: una descripción sobre el pedido ( Si se deja en blanco se coloca la que por defecto pusiste en el archivo .env)

 

un ejemplo para llamar a la función desde cualquier controlador

$redsys= new AppHttpControllersRedsysController;

$redsys->index(512,50,false,'Compra de entradas');

o en blade

{{AppHttpControllersRedsysController::index(512,50,false,'Compra de entradas')}}

Para comprobar la confirmación de redsys creamos una función dentro del controlador

/**
* Comprobar respuesta de Redsys
*/
public function comprobar(Request $request)
{
try{
$key = config('redsys.key');
$parameters = Redsys::getMerchantParameters($request->input('Ds_MerchantParameters'));
$DsResponse = $parameters["Ds_Response"];
$DsResponse += 0;
if (Redsys::check($key, $request->input()) && $DsResponse <=99) {
// lo que quieras que haya si es positiva la confirmación de redsys
} else {
//lo que quieras que haga si no es positivo
}
} catch (SermepaTpvTpvException $e) {
echo $e->getMessage();
}
}
}

 

Y luego en nuestra ruta colocamos

/**
* Comprobar redsys
*/
Route::post('/redsys/notification','RedsysController@comprobar');
Route::get('/redsys/notification','RedsysController@comprobar');

con esto tienes todo cubierto para crear un sistema limpio y ordenado de Redsys.

Si te a gustado no olvide compartirlo con otros compañeros!!

Recuerda que puedes contar con nosotros para solucionar los problemas que tengas con tu proyecto o página web. Rellena el formulario y nos pondremos en contacto contigo

Entrada anterior
Google y WordPress: Hacia una web para todos
Entrada siguiente
Witei para WordPress: infinitas posibilidades
Menú