:warning: Importante: Este paquete está basado en https://github.com/ssheduardo/redsys-laravel, pero modificado para adaptarlo a algo que nos servirá como base para paquetes de bPanel 4. Este módulo se basa a su vez en https://github.com/ssheduardo/sermepa, del mismo autor, pero que es un paquete más genérico y está soportado por VSCode, además de bastantes estrellas y seguidores en github.
Dejo en este readme el contenido del original al final, y añadiré como notas las particularidades de nuestra versión.
Este paquete publica automáticamente el archivo de configuración del plugin original a config/redsys.php, así que habrá que editarlo para incluir los datos del comercio del cliente.
Configuración
Una vez instalado el plugin habrá que editar su configuración en config/redsys.php
:warning: Importante: Este archivo se añade automáticamente a .gitignore, ya que contiene información del TPV del cliente. Al subir la web a producción, habrá que crearlo manualmente y actualizarlo.
Antes de generar el formulario del TPV se comprueba si la configuración está vacía, y se lanza una excepción en ese caso. Para ignorar esta comprobación, debe añadirse 'allow_empty_configuration' => true al archivo de configuración (útil mientras se desarrolla la web). Si el entorno de la aplicación es 'production', no será posible permitir una configuración vacía.
La mayoría de campos son bastante fáciles de entender, así que solo comento un par:
- 'tradename' = Nombre de la tienda
- 'environment' = 'live' para producción, 'test' para entorno de pruebas
Procesar notificación del TPV
Para procesar la notificación que envía el TPV (url_notification), se usa el servicio TpvNotificationService, que devolverá un objeto TpvNotificationResult. Este objeto tiene 2 propiedades públicas de solo lectura:
- success: que indica si la noftificación del pago indica que se ha realizado correctamente
- dsResponse: el código DS_RESPONSE de la notificación, por si otro plugin lo necesita
Este paquete no hace nada con el pago después de comprobar que es correcto o no, solo devuelve el objeto que acabamos de ver. Debe ser otro paquete (por ejemplo bittacora/bpanel4-redsys el que se encargue de marcar un pedido como pagado, etc).
De aquí para abajo está el README original
Redys Laravel
Introducción
Tras finalizar la actualización de la clases Redsys para trabajar con sha256, he aprovechado en crear este package para laravel, de esta forma hacemos más ameno el trabajar con este framework.
Instalación
Via Composer
Laravel 5.1
$ composer require "ssheduardo/redsys-laravel=1.0.*"
Laravel 5.2, 5.3, 5.4
$ composer require "ssheduardo/redsys-laravel=~1.1.0"
$ composer require "ssheduardo/redsys-laravel=~1.3.0"
$ composer require "ssheduardo/redsys-laravel=~1.4.0"
O si lo prefieres, puedes agregarlo en la sección require de tu composer.json
Laravel 5.1
"ssheduardo/redsys-laravel": "1.0.*"
Laravel 5.2, 5.3, 5.4
"ssheduardo/redsys-laravel": "~1.1.0"
"ssheduardo/redsys-laravel": "~1.3.0"
Laravel 6.0, 7.x, 8.x, 9.x
"ssheduardo/redsys-laravel": "~1.4.0"
Ahora debemos cargar nuestro Services Provider dentro del array 'providers' (config/app.php)
Si usas Laravel 5.5 o superior, no necesitas cargar el services provider
Ssheduardo\Redsys\RedsysServiceProvider::class
Creamos un alias dentro del array 'aliases' (config/app.php)
Si usas Laravel 5.5 o superior no necesitas crear el alias
'Redsys' => Ssheduardo\Redsys\Facades\Redsys::class,
Y finalmente publicamos nuestro archivo de configuración
php artisan vendor:publish --provider="Ssheduardo\Redsys\RedsysServiceProvider"
Esto nos creará un archivo llamado redsys.php dentro de config, en este archivo debemos configurar nuestra key, url ok y ko.
Uso
Imaginemos que tenemos esta ruta http://ubublog.com/redsys que enlaza con RedsysController@index
Route::get('/redsys', ['as' => 'redsys', 'uses' => 'RedsysController@index']);
Y el contenido del controlador RedsysController sería este:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Ssheduardo\Redsys\Facades\Redsys;
class RedsysController extends Controller
{
//
public function index()
{
try{
$key = config('redsys.key');
Redsys::setAmount(rand(10,600));
Redsys::setOrder(time());
Redsys::setMerchantcode('999008881'); //Reemplazar por el código que proporciona el banco
Redsys::setCurrency('978');
Redsys::setTransactiontype('0');
Redsys::setTerminal('1');
Redsys::setMethod('T'); //Solo pago con tarjeta, no mostramos iupay
Redsys::setNotification(config('redsys.url_notification')); //Url de notificacion
Redsys::setUrlOk(config('redsys.url_ok')); //Url OK
Redsys::setUrlKo(config('redsys.url_ko')); //Url KO
Redsys::setVersion('HMAC_SHA256_V1');
Redsys::setTradeName('Tienda S.L');
Redsys::setTitular('Pedro Risco');
Redsys::setProductDescription('Compras varias');
Redsys::setEnviroment('test'); //Entorno test
$signature = Redsys::generateMerchantSignature($key);
Redsys::setMerchantSignature($signature);
$form = Redsys::createForm();
}
catch(Exception $e){
echo $e->getMessage();
}
return $form;
}
}
Esta clase hereda de mi clase principal https://github.com/ssheduardo/sermepa, aquí encontrarán más ejemplos de los métodos que trae la clase Tvp.php
Notas adicionales
Dentro del archivo /config/redsys.php, se debe configurar el FUC (Merchant Code) y nuestra key. Puntos a tener en cuenta de la configuración si no has trabajado con redsys-laravel anteriormente:
-
Si queremos usar el entorno de producción debemos usar el string 'live' como environment.
-
El FUC en el entorno de pruebas debe ser real, de otro modo se obtendrá el error de importe 0 (https://github.com/ssheduardo/redsys-laravel#20)
-
La url OK ('url_ok') se usa para redireccionar tras un pago correcto (no contiene información del pago), lo mismo ocurre con la url de KO ('url_ko'). La url que tiene información del pago realizado es la URL de notificación ('url_notification') que deberá comprobar la firma de la información del siguiente modo:
$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
}
Change log
Please see CHANGELOG for more information what has changed recently.
Security
If you discover any security related issues, please email :author_email instead of using the issue tracker.
Credits
License
The MIT License (MIT). Please see License File for more information.
Donación
¿Te gustaría apoyarme? ¿Aprecias mi trabajo? ¿Lo usas en proyectos comerciales?
¡Siéntete libre de hacer una pequeña donación! :wink:
