ferotres/redsys-bundle

FerotresRedsysBundle 为 Symfony4 添加了对 redsys 平台支付管理的支持。

安装: 80

依赖: 0

建议者: 0

安全: 0

星标: 3

关注者: 0

分支: 1

开放问题: 1

类型:symfony-bundle

v1.0.2 2019-01-07 13:08 UTC

This package is auto-updated.

Last update: 2024-09-29 00:42:54 UTC


README

FerotresRedsysBundle 为 Symfony4 添加了对 redsys 平台支付管理的支持。

特性包括:

  • 多货币 | 语言
  • 多店铺
  • 创建支付
  • 创建支付授权
  • 确认支付授权
  • 取消支付授权
  • 支付响应验证器
  • OpenSSL
  • HMAC_SHA256_V1
  • 单元测试

注意:此包不提供管理支付用到的实体。

Build Status Latest Stable Version Total Downloads Latest Unstable Version License

安装

下载 FerotresRedsysBundle.

$ composer require ferotres/redsys-bundle

添加路由资源.

# config/routes/ferotres_redsys.yaml
_ferotres_redsys:
    resource: "@FerotresRedsysBundle/Resources/config/routes.xml"

配置 FerotresRedsysBundle.

您可以为每个环境配置该包。

# config/packages/ferotres_redsys.yaml
ferotres_redsys:
    url: 'https://sis-t.redsys.es:25443/sis/realizarPago' # this is a test url
    shops:
        sample1:
           merchant_name: 'sample1'
           merchant_code: '45677897'
           success: 'payment-success' # route for payment succes redirection
           error:   'payment-serror'  # route for payment error redirection
           terminals: # One terminal is mandatory
              - { secret: 'sq7HjrUOBfKmC344354fvv0gJ7', ces: true,  num: 1, iso_currency: 'EUR' }
              - { secret: 'sq7Hvfrty676LgskD5srU870g7', ces: false, num: 2, iso_currency: 'EUR' }
              - { secret: 'sq7HjrUOBfKmC576ILyythU870', ces: false, num: 4, iso_currency: 'USD' }
              
        # Is posible add more shops, but almost one is needed.

配置

终端配置(所有参数均为必填项)

  • secret:由 redsys 提供的密钥。
  • ces:如果终端已配置为安全支付,则设置为 true。
  • num:由 redsys 提供的终端号。
  • iso_currency:3 位数字的 ISO 货币代码。

有效的 ISO 货币

  • EUR:欧元
  • USD:美元
  • AUD:澳大利亚元
  • GBP:英镑
  • JPY:日元
  • CAD:加拿大元
  • ARS:阿根廷比索
  • INR:卢比
  • MXN:墨西哥比索
  • PEN:秘鲁索尔
  • CHF:瑞士法郎
  • BRL:巴西雷亚尔
  • VEF:委内瑞拉玻利瓦尔
  • TRY:土耳其里拉

创建支付

交易类型 0

创建动作方法.

class PaymentController extends AbstractController
{

    /** @var RedsysRedirection  */
    private $redsysRedirection;

    /**
     * DefaultController constructor.
     * @param RedsysRedirection $redsysRedirection
     */
    public function __construct(RedsysRedirection $redsysRedirection)
    {
        $this->redsysRedirection = $redsysRedirection;
    }
    
    public function pay(int $optionalIdOffer)
    {
        $paymentOrder = PaymentOrderBuilder::create()
            ->toApp('sample1')
            ->withAmount(1000)
            ->withCurrency('EUR')
            ->withLocale('ES')
            ->withPaymentHolder('Juan Alvarez')
            ->withDescription('Product Test description')
            ->withOrder('201901015001')
            // This params is used for success/error callbacks and notification response
            ->addUserParams(['optionalIdOffer' => $optionalIdOffer])
            // For use a secure terminal 
            ->usingCes(true) 
            ->build();
            
         /** @var RedsysOrder $redsysOrder */
         $redsysOrder = $this->redsysRedirection->createPayment($paymentOrder);
         
         return $this->render('Acme/pay.html.twig', ['redsysOrder' => $redsysOrder]);
    }
    
}

创建自动提交表单的模板(这是一个示例,所需部分包括支付表单)

# templates/Acme/pay.html.twig

{% extends "Acme::layout.html.twig" %}

{% block body %}

     {{ include('@FerotresRedsys/pay-form.html.twig') }}
     
{% endblock %}

在 js 中管理表单的自动提交。

# assets/js/app.js
// this submit trigger the redirecton to redsys form for credit card
document.querySelector('#redsys_pay_form').submit();
    

创建支付授权

如果等于支付,则仅更改执行的方法。为了使用此支付方法,终端必须允许交易类型 O

/** @var RedsysOrder $redsysOrder */
$redsysOrder = $this->redsysRedirection->createAuthorization($paymentOrder);

创建支付确认

与支付类似,所有参数必须与授权相同。为了使用此支付方法,终端必须允许交易类型 P

$paymentOrder = PaymentOrderBuilder::create()
    ->toApp('sample1')
    ->withAmount(1000)
    ->withCurrency('EUR')
    ->withLocale('ES')
    ->withPaymentHolder('Juan Alvarez')
    ->withDescription('Product Test description')
    ->withOrder('201901015001')
    // For this transaction authCode is mandatory
    ->withAuthCode('236055')h
    // This params is used for success/error callbacks and notification response
    ->addUserParams(['optionalIdOffer' => $optionalIdOffer])
    // For use a secure terminal 
    ->usingCes(true) 
    ->build();
// The confirmAuthorization do a curl to redsys, template is not needed.          
/** @var RedsysOrder $redsysOrder */
$redsysOrder = $this->redsysRedirection->confirmAuthorization($paymentOrder);

创建支付取消

与确认类似,所有参数必须与授权相同。为了使用此支付方法,终端必须允许交易类型 Q

// The cancelAuthorization do a curl to redsys, template is not needed.   
/** @var RedsysOrder $redsysOrder */
$redsysOrder = $this->redsysRedirection->cancelAuthorization($paymentOrder);

处理成功和错误回调

class PaymentController extends AbstractController
{
    /**
    * with sample config, this is a payment-success route
    * $optionalIdOffer is passed to paymentOrder with addUserParams
    */
    public function success(int $optionalIdOffer)
    {
        // TODO
    }
    
    /**
     * with sample config, this is a payment-error route
     * $optionalIdOffer is passed to paymentOrder with addUserParams
     */
    public function error(int $optionalIdOffer)
    {
        // TODO
    }
}

处理 redsys 通知响应

为了处理通知,您可以使用事件监听器或事件订阅者,在此情况下,我使用了事件监听器。

事件监听器

// src/EventListener/PaymentResponseHandler.php
class PaymentResponseHandler
{
    /**
     * @param RedsysResponseSuccessEvent $redsysResponseEvent
     */
    public function onPaymentSuccess(RedsysResponseSuccessEvent $redsysResponseEvent)
    {
        $redsysResponse = $redsysResponseEvent->redsysResponse();
        
        $order = $redsysResponse->order();
        $authCode = $redsysResponse->authCode();
        // This use __call magic method
        $optionalIdOffer = $redsysResponseEvent->getOptionalIdOffer()
        
        $valid = $redsysResponseEvent->isValidated();
        
        // TODO: Yout bussines logic
        
        // By default, If in this function something throw and exception, RedsysResponseFailedEvent will be triggered.

    }

    /**
     * @param RedsysResponseFailedEvent $responseFailedEvent
     */
    public function onPaymentError(RedsysResponseFailedEvent $responseFailedEvent)
    {
       $redsysResponse = $redsysResponseEvent->redsysResponse();
       
       // This use __call magic method
       $optionalIdOffer = $redsysResponseEvent->getOptionalIdOffer();
       
       $exception = $responseFailedEvent->exception();
       
       $valid = $redsysResponseEvent->isValidated();
       
       // TODO: Yout bussines logic
    }
}

配置事件监听器

# config/services.yaml
app.payment_response_listener:
    class: App\EventListener\PaymentResponseHandler
    tags:
        - { name: kernel.event_listener, event: ferotres_redsys.redsys_response_success, method: onPaymentSuccess }
        - { name: kernel.event_listener, event: ferotres_redsys.redsys_response_failed, method: onPaymentError }

许可证

此包受 MIT 许可证的约束。