xoborg/laravel-redsys

用于在Laravel中使用Redsys支付网关的包

1.1.2 2020-08-24 18:16 UTC

This package is auto-updated.

Last update: 2024-09-25 04:15:12 UTC


README

此包可用于简单管理通过Redsys进行支付请求以及接收支付确认。

以下是一个如何生成带Redsys支付的简单表单的示例。

在控制器中创建新的支付请求

$solicitudPagoRedsys = new \Xoborg\LaravelRedsys\Models\SolicitudPagoRedsys();
$solicitudPagoRedsys->order = '0001';
$solicitudPagoRedsys->amount = 1000;

在我们的视图中会有一个类似以下的表单

<form name="frm" action="{{ config('redsys.url.pruebas') }}" method="POST">
	Ds_Merchant_SignatureVersion <input type="text" name="Ds_SignatureVersion" value="{{ config('redsys.ds_signature_version') }}"/></br>
	Ds_Merchant_MerchantParameters <input type="text" name="Ds_MerchantParameters" value="{{ $pagoRedsys->getMerchantParameters() }}"/></br>
	Ds_Merchant_Signature <input type="text" name="Ds_Signature" value="{{ $pagoRedsys->getMerchantSignature() }}"/></br>
	<input type="submit" value="Enviar" >
</form>

安装

您可以通过以下命令使用composer安装包:

composer require xoborg/laravel-redsys

您可以使用以下命令发布迁移:

php artisan vendor:publish --provider="Xoborg\LaravelRedsys\LaravelRedsysServiceProvider" --tag="migrations"

发布迁移后,您可以通过执行迁移来创建'tablas' 'pagos_redsys'和'notificaciones_online_redsys'。

php artisan migrate

您还可以使用以下命令发布配置文件:

php artisan vendor:publish --provider="Xoborg\LaravelRedsys\LaravelRedsysServiceProvider" --tag="config"

默认情况下,使用Redsys手册中出现的测试数据,要更改它们,只需创建必要的环境变量即可。

    ...
    
    DS_MERCHANT_MERCHANTCODE=000000000
    DS_MERCHANT_TERMINAL=0
    etc.
    
    ...

此外,您可以通过以下命令访问带有示例表单的视图:

php artisan vendor:publish --provider="Xoborg\LaravelRedsys\LaravelRedsysServiceProvider" --tag="views"

这将在resources/views/vendor/laravel-redsys/example-payment-form.blade.php中创建一个blade文件。

文档

完整过程示例

以下是一个从创建请求到接收在线通知和客户部分的更高级的过程示例。

首先,在控制器中创建支付请求的动作

...

$solicitudPagoRedsys = new \Xoborg\LaravelRedsys\Models\SolicitudPagoRedsys();
$solicitudPagoRedsys->order = '0002';
$solicitudPagoRedsys->amount = 2075;
$solicitudPagoRedsys->merchantUrl = route('notificacion-online');
$solicitudPagoRedsys->urlOk = route('pago-ok');
$solicitudPagoRedsys->urlKo = route('pago-ko');
$solicitudPagoRedsys->productDescription = 'Producto de ejemplo';
$solicitudPagoRedsys->titular = 'Nombre del cliente';
$solicitudPagoRedsys->merchantName = 'Empresa de ejemplo S.L.';

$pagoRedsys = $solicitudPagoRedsys->saveInDatabase();

// Guardariamos el id del pago en nuestra propia tabla de compras o similar.

return view('formulario-pago', compact('solicitudPagoRedsys'));

当用户点击表单中的支付按钮时,将触发两个动作,前提是设置了merchantUrl和OK/KO的URL。

要接收在线通知,我们需要一个接受POST请求的路由(与请求中的merchantUrl相同),以及一个类似以下动作的控制器:

...

$notificacionOnlineRedsys = new \Xoborg\LaravelRedsys\Models\NotificacionOnlineRedsys();
$notificacionOnlineRedsys->setUp($request->input('Ds_MerchantParameters'));

if ($notificacionOnlineRedsys->firmaValida($request->input('Ds_Signature'))) {
	
	$pagoRedsys = \Xoborg\LaravelRedsys\Models\PagoRedsys::where('Ds_Merchant_Order', $notificacionOnlineRedsys->order)->firstOrFail();
	
	// También es muy recomendable comprobar que algunos de los datos recibidos son los mismos que los que tenemos guardados de la solicitud de pago, como por ejemplo el importe o la moneda (la orden la hemos utilizado para buscar el propio pago).
	
	...
	
	// Insertamos la notificación online en DB
	$pagoRedsys->notificacionesOnlineRedsys()->save($notificacionOnlineRedsys);
	
	// Ahora podríamos cambiar el estado de la compra en nuestra propia tabla, etc.
}

// La firma no es válida así que aquí no tendríamos que hacer nada más ya que no podemos fiarnos de la información que ha llegado

此外,用户将被重定向到OK或KO的路由,这是控制器中的两个动作,它们的代码可能如下所示:

...

// IMPORTANTE: Aquí sólo debemos utilizar la información que nos llegue para mostrarle al usuario el estado de la operación, no debemos utilizar esta información para guardarla en DB ni fiarnos de ella ya que puede haberse modificado.

$notificacionOnlineRedsys = new \Xoborg\LaravelRedsys\Models\NotificacionOnlineRedsys();
$notificacionOnlineRedsys->setUp($request->input('Ds_MerchantParameters'));

if ($notificacionOnlineRedsys->firmaValida($request->input('Ds_Signature'))) {
	
	$pagoRedsys = \Xoborg\LaravelRedsys\Models\PagoRedsys::where('Ds_Merchant_Order', $notificacionOnlineRedsys->order)->firstOrFail();
    	
	// También es muy recomendable comprobar que algunos de los datos recibidos son los mismos que los que tenemos guardados de la solicitud de pago, como por ejemplo el importe o la moneda (la orden la hemos utilizado para buscar el propio pago).
	
	...
	
	// Podemos utilizar el método "getResponse()" del modelo NotificacionOnlineRedsys para obtener un código de respuesta que se pueda enseñar al propio usuario
	
	$codigoRespuesta = $notificacionOnlineRedsys->getResponse();
	
	return view('pago-ok', compact('codigoRespuesta'));
	
}

// Aquí podemos reenviar al usuario a una pantalla de error ya que la información que nos ha llegado no es válida

至此,支付过程结束。

实用类

在namespace \Xoborg\LaravelRedsys\Services\Redsys中,有4个类帮助我们配置包等,而不必查看Redsys的官方文档。

DsMerchantConsumerLanguage

使用此类可以获取用于创建新请求的语言代码

$solicitudPagoRedsys->consumerLanguage = \Xoborg\LaravelRedsys\Services\Redsys\DsMerchantConsumerLanguage::CASTELLANO;

DsMerchantCurrency

使用此类可以获取用于创建新请求的货币代码

$solicitudPagoRedsys->currency = \Xoborg\LaravelRedsys\Services\Redsys\DsMerchantCurrency::EUROS;

DsMerchantTransactionType

使用此类可以获取用于请求的支付类型

$solicitudPagoRedsys->transactionType = \Xoborg\LaravelRedsys\Services\Redsys\DsMerchantTransactionType::AUTORIZACION;

NotificacionOnlineHumanReadableResponses

使用此类可以获取Redsys在支付完成后发送的响应代码的文本

$textoRespuesta = \Xoborg\LaravelRedsys\Services\Redsys\NotificacionOnlineHumanReadableResponses::getResponse($responseCode);

测试

您可以使用以下命令运行测试:

vendor/bin/phpunit

许可

MIT许可证(MIT)。有关更多信息,请参阅许可文件