ferotres / redsys-bundle
FerotresRedsysBundle 为 Symfony4 添加了对 redsys 平台支付管理的支持。
v1.0.2
2019-01-07 13:08 UTC
Requires
- php: ^7.1.3
- guzzlehttp/guzzle: ~6.0
- symfony/config: ^4.2
- symfony/dependency-injection: ^4.2
- symfony/framework-bundle: ^4.2
- symfony/http-kernel: ^4.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.14
- symfony/phpunit-bridge: ^3.3|^4.0
This package is auto-updated.
Last update: 2024-09-29 00:42:54 UTC
README
FerotresRedsysBundle 为 Symfony4 添加了对 redsys 平台支付管理的支持。
特性包括:
- 多货币 | 语言
- 多店铺
- 创建支付
- 创建支付授权
- 确认支付授权
- 取消支付授权
- 支付响应验证器
- OpenSSL
- HMAC_SHA256_V1
- 单元测试
注意:此包不提供管理支付用到的实体。
安装
下载 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 许可证的约束。