Icono del sitio Carlos Herrera

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

[code lang=»cmd»]

$ composer require «ssheduardo/redsys-laravel=~1.4″

[/code]

Esto funciona con las versiones 6, 7 y 8 de Laravel.

Para versiones anteriores os dejo este listado:

[code lang=»cmd»]

$ composer require «ssheduardo/redsys-laravel=1.0.*»

[/code]

Para Laravel 5.1

[code lang=»cmd»]

$ composer require «ssheduardo/redsys-laravel=~1.1.0»

[/code]

Para Laravel del 5.2 al 5.4

[code lang=»cmd»]

$ composer require «ssheduardo/redsys-laravel=~1.3.0»

[/code]

Para Laravel del 5.5 al 5.8

 

 

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

[code lang=»cmd»]php artisan vendor:publish –provider=»SsheduardoRedsysRedsysServiceProvider»[/code]

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)

[code lang=»php»]
SsheduardoRedsysRedsysServiceProvider::class
[/code]

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

[code lang=»php»]

‘Redsys’ => SsheduardoRedsysFacadesRedsys::class,

[/code]

 

Ahora que tenemos todo listo, pasamos a la parte interesante.

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:

[code lang=»php»]

<?php
return [
‘key’ => »,
‘url_notification’ => »,
‘url_ok’ => »,
‘url_ko’ => »,
];

[/code]

Vamos a agregarles unas variables nuevas

[code lang=»php»]

<?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’,»)
];

[/code]

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

[code lang=»php»]

php artisan make:controller RedsysController

[/code]

y agregaremos algunas cosas al inicio del controlador

[code lang=»php»]

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

[/code]

 

creamos la función index del controlador

[code lang=»php»]

/**
* 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();
}

}

[/code]

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

[code lang=»php»]

$redsys= new AppHttpControllersRedsysController;

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

[/code]

o en blade

[code lang=»php»]

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

[/code]

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

[code lang=»php»]

/**
* 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();
}
}
}

[/code]

 

Y luego en nuestra ruta colocamos

[code lang=»php»]

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

[/code]

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


    Puede darse de baja de estas comunicaciones en cualquier momento. Para obtener más información sobre cómo darse de baja, nuestras prácticas de privacidad y cómo nos comprometemos a proteger y respetar su privacidad, revise nuestra Política de privacidad.

    Salir de la versión móvil