creagia/laravel-redsys

Laravel Redsys支付网关

3.0.1 2024-07-09 09:50 UTC

This package is auto-updated.

Last update: 2024-09-09 10:06:41 UTC


README

Logo Laravel Redsys

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

简介

将您的Laravel应用程序与西班牙领先的支付网关Redsys集成。

此包提供

  • Redsys重定向和REST方法的集成
  • 将Redsys请求与Eloquent模型关联
  • 将Redsys卡令牌与Eloquent模型关联
  • Redsys通知管理(支付确认)
  • 覆盖所有功能的自定义Redsys请求
  • 本地测试网关

您只需几行代码即可创建支付请求,将用户重定向到支付网关并处理Redsys响应

public function createPaymentAndRedirect()
{
    $redsysRequest = $yourModel->createRedsysRequest(
        productDescription: 'Product description',
        payMethod: PayMethod::Bizum,
    );
    return $redsysRequest->redirect();
}

如果您不使用Laravel,请查看我们的其他包 creagia/redsys-php,它仅包含Redsys PHP库。

支持我们

Laradir banner

安装

您可以通过composer安装此包

composer require creagia/laravel-redsys

之后,您应该发布和运行迁移

php artisan vendor:publish --tag="redsys-migrations"
php artisan migrate

接下来,您应该使用以下命令发布配置文件

php artisan vendor:publish --tag="redsys-config"

最后,您应该在.env文件中定义,至少是所需的选项

REDSYS_ENVIRONMENT
REDSYS_MERCHANT_CODE
REDSYS_KEY

这是已发布配置文件的内容

return [
    /**
     * Used to define the service URL. Possible values 'test', 'production' or 'local'.
     *
     * It's recommended to use 'local' during your development to enable a local gateway to test your
     * application without need to expose it.
     */
    'environment' => env('REDSYS_ENVIRONMENT'),

    /**
     * Values sent to Redsys.
     */
    'tpv' => [
        'terminal' => env('REDSYS_TERMINAL', 1),
        'currency' => \Creagia\Redsys\Enums\Currency::EUR,
        'merchantCode' => env('REDSYS_MERCHANT_CODE'), // Default test code: 999008881
        'key' => env('REDSYS_KEY'), // Default test key: sq7HjrUOBfKmC576ILgskD5srU870gJ7
    ],

    /**
     * Prefix used by the package routes. 'redsys' by default.
     */
    'routes_prefix' => env('REDSYS_ROUTE_PREFIX', 'redsys'),

    /**
     * Route names for successful and unsuccessful confirm pages. Redsys redirects to these routes
     * after the payment is finished. By default, this package provides two neutral views.
     */
    'successful_payment_route_name' => env('REDSYS_SUCCESSFUL_ROUTE_NAME', null),
    'unsuccessful_payment_route_name' => env('REDSYS_UNSUCCESSFUL_ROUTE_NAME', null),
    
    /**
     * Use an automatic prefix for the order number with the current year and month.
     */
    'order_num_auto_prefix' => true,

    /**
     * Redsys order number should be unique. Here you can set an order number prefix if you need it.
     * This prefix must be an integer number.
     */
    'order_num_prefix' => env('REDSYS_ORDER_NUM_PREFIX', 0),
];

用法

简介

此包将redsys-php与您的Laravel应用程序集成。您可以使用两种不同的方式

将请求与Eloquent模型关联

为要使其可支付的模式添加CanCreateRedsysRequests特性和实现RedsysPayable类。

通常,这个模型可能是全电商或购物车系统的Order,但您可以根据需要将支付与多个Eloquent模型关联。

您应该实现您的getTotalAmountpaidWithRedsys方法。第一个将返回支付计算的总额(以分计)。第二个将在Redsys确认支付成功时执行。

use Creagia\LaravelRedsys\Concerns\CanCreateRedsysRequests;
use Creagia\LaravelRedsys\Contracts\RedsysPayable;

class YourModel extends Model implements RedsysPayable
{
    use CanCreateRedsysRequests;

    public function getTotalAmount(): int
    {
        return 199_99;
    }

    public function paidWithRedsys(): void
    {
        // Notify user, change status to paid, ...
    }
}

创建请求

use Creagia\Redsys\Enums\PayMethod;

$redsysRequest = $yourModel->createRedsysRequest(
    productDescription: 'Product description',
    payMethod: PayMethod::Card,
);

自定义Redsys请求

如果您不想将Redsys请求与Eloquent模型关联,或者您需要创建更复杂的请求,您可以轻松创建自定义请求。

这样,您可以完全自定义请求并实现Redsys提供的所有功能。请求输入参数由实现所有可用参数RequestParameters对象定义

use Creagia\LaravelRedsys\RequestBuilder;

$redsysRequestBuilder = RequestBuilder::newRequest(
    new \Creagia\Redsys\Support\RequestParameters(
        transactionType: \Creagia\Redsys\Enums\TransactionType::Autorizacion,
        productDescription: 'Description',
        amountInCents: 123_12,
        currency: Currency::EUR,
        payMethods: \Creagia\Redsys\Enums\PayMethod::Card,
    )
);

RequestBuilder有一些中间方法可以帮助您创建请求。您可以使用associateWithModel()方法将自定义请求与eloquent模型关联,并使用requestingCardToken()usingCardToken()方法与信用卡令牌交互。有关更多信息,请参阅凭证文件请求部分。

创建请求后,您应继续下一部分以将请求发送到Redsys。

向Redsys发送请求

在Redsys提供的所有集成方法中,您可以实现“重定向”和“REST”方法。

一旦您创建Redsys请求,您应该通过重定向发送它

use Creagia\Redsys\Enums\PayMethod;

public function redirection()
{
    $redsysRequest = $yourModel->createRedsysRequest(
        productDescription: 'Product description',
        payMethod: PayMethod::Card,
    );
    return $redsysRequest->redirect();
}

或者将其作为POST请求发送

use Creagia\Redsys\Enums\Currency;
use Creagia\Redsys\Enums\TransactionType;
use Creagia\LaravelRedsys\RequestBuilder;
use Illuminate\Database\Eloquent\Model;

public function cancellation(Model $yourModel)
{
    $redsysRequest = RequestBuilder::newRequest(new RequestParameters(
        amountInCents: $yourModel->getTotalAmount(),
        currency: Currency::EUR,
        order: '1446068581',
        transactionType: TransactionType::Anulacion,
    ))->associateWithModel($yourModel);

    return $redsysRequest->post();
}

请注意,REST集成模式并非所有功能都可用,并且默认情况下不一定启用。如果您不确定是否可以使用它或某些东西不正常工作,请始终检查Redsys文档和您的账户配置。

Redsys响应

Redsys将自动处理请求结果的通知,对于成功的支付,包将从您的模型中运行paidWithRedsys方法。

返回用户

在重定向方法中,当客户完成时,Redsys将他们重定向到您的网站。默认情况下,此包使用一个简单的视图提供成功或失败的路由。您可以在配置文件中覆盖重定向路由

'successful_payment_route_name' => env('REDSYS_SUCCESSFUL_ROUTE_NAME', null),
'unsuccessful_payment_route_name' => env('REDSYS_UNSUCCESSFUL_ROUTE_NAME', null),

Successful default view

凭据文件(令牌)请求

凭据文件请求使用授权存储的卡数据在初始请求之后创建未来的请求。这对于一些用例很有用,例如周期性订阅支付或分期付款。

虽然您可以使用Redsys文档中定义的自定义Redsys请求创建凭据文件,但此包提供了一些辅助工具以使其更容易。

凭据文件交易需要初始请求,您需要在其中请求卡令牌。之后,您可以使用存储在您的应用程序中的卡令牌创建新的请求。

准备您的Eloquent模型

在您想与Redsys卡令牌关联的模型上使用InteractsWithRedsysCards关注点。通常这个模型将是UserTeamSubscription,例如。

use Creagia\LaravelRedsys\Concerns\InteractsWithRedsysCards;

class Team extends Model
{
    use InteractsWithRedsysCards;

    ...
}

初始请求

use Creagia\Redsys\Enums\CofType;
use Creagia\Redsys\Enums\PayMethod;

/**
 * Use this example to associate the request and card easily to Eloquent models
 */
public function initialRequest()
{
    $redsysRequest = $yourProductModel->createRedsysRequest(
        productDescription: 'Product description',
        payMethod: PayMethod::Card,
    )->requestingCardToken(
        CofType::Recurring
    )->storeCardOnModel(
        $yourPayingModel // User, Team, ...
    );
    
    return $redsysRequest->redirect();
}

/**
 * Use this example for a custom request, optionally associating the request to Eloquent models
 */
public function initialCustomRequest()
{
    $redsysRequest = RequestBuilder::newRequest(new RequestParameters(
        amountInCents: 19_99,
        currency: Currency::EUR,
        transactionType: TransactionType::Autorizacion,
    ))->associateWithModel(
        $yourProductModel
    )->requestingCardToken(
        CofType::Recurring
    )->storeCardOnModel(
        $yourPayingModel // User, Team, ...
    );
    return $redsysRequest->redirect();
}

未来请求

use Creagia\Redsys\Enums\Currency;
use Creagia\Redsys\Enums\TransactionType;
use Creagia\LaravelRedsys\RequestBuilder;
use Illuminate\Database\Eloquent\Model;
use Creagia\Redsys\Enums\CofType;

public function renewSubscription(Model $yourProductModel, Model $yourPayingModel)
{
    $redsysCard = $yourPayingModel->redsysCards->last();  // User, Team, ...
    
    $redsysRequest = RequestBuilder::newRequest(new RequestParameters(
        amountInCents: $yourProductModel->getTotalAmount(),
        currency: Currency::EUR,
        transactionType: TransactionType::Autorizacion,
    ))
        ->associateWithModel(
            $yourProductModel
        )->usingCard(
            CofType::Recurring, 
            $redsysCard,
        );

    return $redsysRequest->post();
}

本地网关

LaravelRedsys提供了一种实用的本地网关,可以用于在本地测试应用程序,而无需将其公开。当您的环境配置定义为local时,您的Redsys支付将重定向到您的本地应用程序,而不是测试或生产Redsys URL。

您可以选择响应代码之间的可用选项来测试授权和拒绝的支付。

出于您的安全考虑,此功能仅在您的应用程序设置为本地环境的情况下才可用,除了包配置之外。

Local gateway screenshot

失败或被遗弃的支付

不成功的支付不会执行任何方法,与成功的支付不同。

用户可以在Redsys端放弃支付,我们不会收到通知。因此,您应该在您的应用程序中处理挂起/取消/放弃的支付。

事件

包将触发一些您可以监听的事件

RedsysNotificationEvent

当Redsys尝试用支付结果通知您时,将触发此事件。此事件不包含RedsysPayment模型,因为它在处理请求之前触发。

此事件有一个属性,包含Redsys的请求输入:$fields

RedsysSuccessfulEvent

当处理Redsys的成功通知时,将触发此事件。

此事件有两个属性

  • $redsysPayment:处理过的RedsysPayment模型。
  • $notificationData:包含成功通知数据的数组。

RedsysUnsuccessfulEvent

当处理Redsys的不成功通知时,将触发此事件。

此事件有两个属性

  • $redsysPayment:处理过的RedsysPayment模型。
  • $errorMessage:包含Redsys错误消息的字符串。

测试

composer test

更新日志

有关最近更改的更多信息,请参阅更新日志

贡献

有关详细信息,请参阅贡献

安全漏洞

请查阅我们的安全策略了解如何报告安全漏洞。

致谢

许可证

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