gabrielextso / paybox-bundle
LexikPayboxBundle 简化了 Paybox 支付系统的实现。
v2.1.1
2016-10-12 11:12 UTC
Requires
- php: >=5.5.9
- lib-curl: >=7.10.0
- lib-openssl: >=0.9.6
- kriswallsmith/buzz: ~0.15
- psr/log: ~1.0
- symfony/form: ~2.7|~3.0
- symfony/framework-bundle: ~2.7|~3.0
- symfony/options-resolver: ~2.7|~3.0
Requires (Dev)
- symfony/phpunit-bridge: ^2.7.4
README
重要!
此包部分维护。不会添加新功能,但可能会合并一些PR以实现兼容性或安全性。
LexikPayboxBundle 通过为您完成所有繁琐的工作,简化了使用 Paybox 支付系统。
LexikPayboxBundle 静默地执行
- 请求期间参数的hmac散列计算。
- 在请求前对服务器进行测试,以确保它处于运行状态。
- 在 ipn 响应上使用 openssl 进行签名验证。
- 在响应上触发事件。
您只需要提供交易参数,自定义响应页面,并等待 ipn 响应上触发的事件。
要求
- PECL hash >= 1.1
- openssl 已启用
安装
使用 composer 安装
composer require lexik/paybox-bundle
将此包添加到您的 app/AppKernel.php
public function registerBundles() { return array( // ... new Lexik\Bundle\PayboxBundle\LexikPayboxBundle(), // ... ); }
配置
您的个人账户信息必须设置在您的 config.yml 中
# Lexik Paybox Bundle lexik_paybox: accounts: default: parameters: production: false # Switches between Paybox test and production servers (preprod-tpe <> tpe) site: '9999999' # Site number provided by the bank rank: '99' # Rank number provided by the bank login: '999999999' # Customer's login provided by Paybox hmac: key: '01234...BCDEF' # Key used to compute the hmac hash, provided by Paybox
附加配置
lexik_paybox: accounts: default: parameters: currencies: # Optionnal parameters, this is the default value - '036' # AUD - '124' # CAD - '756' # CHF - '826' # GBP - '840' # USD - '978' # EUR hmac: algorithm: sha512 # signature algorithm signature_name: Sign # customize the signature parameter name
路由集合必须在您的 routing.yml 中设置
# Lexik Paybox Bundle lexik_paybox: resource: '@LexikPayboxBundle/Resources/config/routing.yml'
Paybox 系统的使用
该包包括一个示例控制器 SampleController.php
,具有两个操作。
... use Symfony\Component\Routing\Generator\UrlGeneratorInterface; /** * Sample action to call a payment. * It create the form to submit with all parameters. */ public function indexAction($account) { $service = sprintf('lexik_paybox.request_handler.%s', $account); if (!$this->has($service)) { throw new NotFoundHttpException(sprintf('Service %s not found', $service)); } $paybox = $this->get($service); $paybox->setParameters(array( 'PBX_CMD' => 'CMD'.time(), 'PBX_DEVISE' => '978', 'PBX_PORTEUR' => 'test@paybox.com', 'PBX_RETOUR' => 'Mt:M;Ref:R;Auto:A;Erreur:E', 'PBX_TOTAL' => '1000', 'PBX_TYPEPAIEMENT' => 'CARTE', 'PBX_TYPECARTE' => 'CB', 'PBX_EFFECTUE' => $this->generateUrl('lexik_paybox_sample_return', array('account' => $account, 'status' => 'success'), UrlGenerator::ABSOLUTE_URL), 'PBX_REFUSE' => $this->generateUrl('lexik_paybox_sample_return', array('account' => $account, 'status' => 'denied'), UrlGenerator::ABSOLUTE_URL), 'PBX_ANNULE' => $this->generateUrl('lexik_paybox_sample_return', array('account' => $account, 'status' => 'canceled'), UrlGenerator::ABSOLUTE_URL), 'PBX_RUF1' => 'POST', 'PBX_REPONDRE_A' => $this->generateUrl('lexik_paybox_ipn', array('account' => $account, 'time' => time()), UrlGenerator::ABSOLUTE_URL), )); return $this->render( 'LexikPayboxBundle:Sample:index.html.twig', array( 'url' => $paybox->getUrl(), 'form' => $paybox->getForm()->createView(), ) ); } ... /** * Sample action of a confirmation payment page on witch the user is sent * after he seizes his payment informations on the Paybox's platform. * This action must only containts presentation logic. */ public function returnAction(Request $request, $status, $account) { return $this->render('LexikPayboxBundle:Sample:return.html.twig', array( 'status' => $status, 'account' => $account, 'parameters' => $request->query, )); } ...
getUrl() 方法在后台进行服务器检查,如果目标服务器没有响应,则抛出异常。
在业务逻辑中,必须在即时支付通知(IPN)发生时完成支付确认。插件包含一个控制器,具有一个管理此 IPN 并触发事件的操作。事件包含请求期间传输的所有数据和一个布尔值,指示签名验证是否成功。
该包包含一个监听器示例,它简单地在每个 ipn 调用上创建一个文件。
namespace Lexik\Bundle\PayboxBundle\Listener; use Lexik\Bundle\PayboxBundle\Event\PayboxResponseEvent; use Symfony\Component\Filesystem\Filesystem; /** * Sample listener that create a file for each ipn call. */ class SampleIpnListener { /** * @var string */ private $rootDir; /** * @var Filesystem */ private $filesystem; /** * Constructor. * * @param string $rootDir * @param Filesystem $filesystem */ public function __construct($rootDir, Filesystem $filesystem) { $this->rootDir = $rootDir; $this->filesystem = $filesystem; } /** * Creates a txt file containing all parameters for each IPN. * * @param PayboxResponseEvent $event */ public function onPayboxIpnResponse(PayboxResponseEvent $event) { $path = sprintf('%s/../data/%s', $this->rootDir, date('Y\/m\/d\/')); $this->filesystem->mkdir($path); $content = sprintf('Account : %s%s', $event->getAccount(), PHP_EOL); $content .= sprintf('Signature verification : %s%s', $event->isVerified() ? 'OK' : 'KO', PHP_EOL); foreach ($event->getData() as $key => $value) { $content .= sprintf("%s:%s%s", $key, $value, PHP_EOL); } file_put_contents( sprintf('%s%s.txt', $path, time()), $content ); } }
要创建自己的监听器,您只需使其等待“paybox.ipn_response”事件。例如,包的监听器
parameters: lexik_paybox.sample_response_listener.class: 'Lexik\Bundle\PayboxBundle\Listener\SampleIpnListener' services: ... lexik_paybox.sample_response_listener: class: '%lexik_paybox.sample_response_listener.class%' arguments: [ '%kernel.root_dir%', '@filesystem' ] tags: - { name: kernel.event_listener, event: paybox.ipn_response, method: onPayboxIpnResponse }
资源
所有交易参数均可在 官方文档 中找到。