diff --git a/.travis.yml b/.travis.yml index ce20954..4b3a5c5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,17 @@ language: php php: - - 5.4 - - 5.5 - 5.6 + - 7.0 + - 7.1 + - 7.2 env: - - SYMFONY_VERSION=2.6.* - - SYMFONY_VERSION=2.7.* - - SYMFONY_VERSION=2.8.* + - SYMFONY_VERSION=3.0.* + - SYMFONY_VERSION=3.1.* + - SYMFONY_VERSION=3.2.* + - SYMFONY_VERSION=3.3.* + - SYMFONY_VERSION=3.4.* before_script: - composer self-update @@ -16,4 +19,4 @@ before_script: - composer install --dev --no-interaction script: - - phpunit -c . + - bin/phpunit diff --git a/CardinityClientBundle.php b/CardinityClientBundle.php index abd9cc0..ccd4b95 100644 --- a/CardinityClientBundle.php +++ b/CardinityClientBundle.php @@ -1,4 +1,5 @@ templating = $templating; $this->router = $router; $this->formFactory = $formFactory; $this->session = $session; $this->payment = $payment; + $this->container = $container; } /** @@ -90,6 +99,7 @@ public function processAction(Request $request) $params['payment_instrument'] = $form->getData(); $method = new Payment\Create($params); + try { /** @var Cardinity\Method\Payment\Payment */ $payment = $this->payment->call($method); @@ -102,10 +112,12 @@ public function processAction(Request $request) } elseif ($payment->isApproved()) { return $this->successResponse($payment); } + } catch (Exception\ValidationFailed $e) { + return $this->errorResponse('Payment validation failed: ' . print_r($e->getErrors(), true)); } catch (Exception\Declined $e) { return $this->errorResponse('Payment declined: ' . print_r($e->getErrors(), true)); } catch (Exception\Runtime $e) { - return $this->errorResponse('Unexpected error occurred: ' . print_r($e, true)); + return $this->errorResponse('Unexpected error occurred: ' . print_r($e->getMessage(), true)); }; } @@ -157,15 +169,18 @@ public function processAuthorizationAction(Request $request) $payment->getId(), $pares ); + /** @var Cardinity\Method\Payment\Payment */ $payment = $this->payment->call($method); } - + if ($payment->isApproved()) { return new RedirectResponse($this->router->generate('cardinity_client.payment_success')); } + } catch (Exception\Declined $e) { + return $this->errorResponse('Payment declined: ' . print_r($e->getErrors(), true)); } catch (Exception\Runtime $e) { - return $this->errorResponse('Unexpected error occurred. ' . $e->getMessage() . ': ' . print_r($e->getErrors(), true)); + return $this->errorResponse('Unexpected error occurred. ' . $e->getMessage()); }; return $this->errorResponse('Unexpected response while finalizing payment'); @@ -198,7 +213,7 @@ private function renderForm(Form $form) private function createForm() { - return $this->formFactory->create(new CreditCardType(), null, [ + return $this->formFactory->create(CreditCardType::class, null, [ 'action' => $this->router->generate('cardinity_client.payment_process'), ]); } diff --git a/DependencyInjection/CardinityClientExtension.php b/DependencyInjection/CardinityClientExtension.php index 1a12b05..6cf7812 100644 --- a/DependencyInjection/CardinityClientExtension.php +++ b/DependencyInjection/CardinityClientExtension.php @@ -25,7 +25,7 @@ public function load(array $configs, ContainerBuilder $container) $container->setParameter('cardinity_client.consumer_key', $config['consumer_key']); $container->setParameter('cardinity_client.consumer_secret', $config['consumer_secret']); - $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); $loader->load('services.yml'); } } diff --git a/Form/CreditCardType.php b/Form/CreditCardType.php index f171e6e..c203b24 100644 --- a/Form/CreditCardType.php +++ b/Form/CreditCardType.php @@ -1,8 +1,11 @@ add('pan', null, [ 'constraints' => new Luhn(), ]) - ->add('exp_year', 'choice', [ + ->add('exp_year', ChoiceType::class, [ 'choices' => $this->years() ]) - ->add('exp_month', 'choice', [ + ->add('exp_month', ChoiceType::class, [ 'choices' => $this->months() ]) ->add('cvc') - ->add('save', 'submit') - ; + ->add('save', SubmitType::class); } public function getName() @@ -33,7 +35,7 @@ public function getName() private function years() { $return = []; - for ($i = date('Y'); $i <= date('Y')+7; $i++) { + for ($i = date('Y'); $i <= date('Y') + 7; $i++) { $return[$i] = $i; } return $return; diff --git a/README.md b/README.md index d28de70..bc13673 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![Build Status](https://travis-ci.org/cardinity/client-bundle.svg?branch=master)](https://travis-ci.org/cardinity/client-bundle) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/cardinity/client-bundle/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/cardinity/client-bundle/?branch=master) -[![SensioLabsInsight](https://insight.sensiolabs.com/projects/2706efcc-de8b-4848-89cc-c1c38f92536d/mini.png)](https://insight.sensiolabs.com/projects/2706efcc-de8b-4848-89cc-c1c38f92536d) ## Installation @@ -94,9 +93,9 @@ Cardinity\Settlement\GetAll($paymentId) #### Void ```php -Cardinity\Void\Create($paymentId, $description = null) -Cardinity\Void\Get($paymentId, $voidId) -Cardinity\Void\GetAll($paymentId) +Cardinity\VoidPayment\Create($paymentId, $description = null) +Cardinity\VoidPayment\Get($paymentId, $voidId) +Cardinity\VoidPayment\GetAll($paymentId) ``` #### Refund @@ -124,7 +123,7 @@ try { 'payment_method' => Cardinity\Payment\Create::CARD, 'payment_instrument' => [ 'pan' => '4111111111111111', - 'exp_year' => 2018, + 'exp_year' => 2021, 'exp_month' => 12, 'cvc' => '456', 'holder' => 'Mike Dough' diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 9ab4e40..c9cc06b 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -1,8 +1,7 @@ parameters: cardinity_client.controller.payment.class: Cardinity\ClientBundle\Controller\PaymentController cardinity_client.service.oauth_subscriber.class: GuzzleHttp\Subscriber\Oauth\Oauth1 - cardinity_client.service.log_subscriber.class: GuzzleHttp\Subscriber\Log - cardinity_client.service.emitter.class: GuzzleHttp\Event\Emitter + cardinity_client.service.stack.class: GuzzleHttp\HandlerStack cardinity_client.service.http_client.class: GuzzleHttp\Client cardinity_client.service.result_object_mapper.class: Cardinity\Method\ResultObjectMapper cardinity_client.service.exception_mapper.class: Cardinity\Http\Guzzle\ExceptionMapper @@ -10,64 +9,65 @@ parameters: cardinity_client.service.client.class: Cardinity\Client cardinity_client.service.validator.class: Cardinity\Method\Validator cardinity_client.parameters.url: 'https://api.cardinity.com/v1/' - cardinity_client.parameters.defaults: - auth: 'oauth' + cardinity_client.parameters.auth: 'oauth' + cardinity_client.parameters.verify: false services: cardinity_client.controller.payment: - class: %cardinity_client.controller.payment.class% + class: '%cardinity_client.controller.payment.class%' arguments: - '@templating' - '@router' - '@form.factory' - '@session' - '@cardinity_client.service.client' + - '@service_container' cardinity_client.service.oauth_subscriber: - class: %cardinity_client.service.oauth_subscriber.class% - arguments: - config: - consumer_key: '%cardinity_client.consumer_key%' - consumer_secret: '%cardinity_client.consumer_secret%' - - cardinity_client.service.log_subscriber: - class: %cardinity_client.service.log_subscriber.class% + class: '%cardinity_client.service.oauth_subscriber.class%' + arguments: + $config: + token_secret: '' + consumer_key: '%cardinity_client.consumer_key%' + consumer_secret: '%cardinity_client.consumer_secret%' - cardinity_client.service.emitter: - class: %cardinity_client.service.emitter.class% - calls: - - [attach, ['@cardinity_client.service.oauth_subscriber']] + cardinity_client.service.stack: + class: '%cardinity_client.service.stack.class%' + factory: ['%cardinity_client.service.stack.class%', create] + calls: + - [push, ['@cardinity_client.service.oauth_subscriber']] cardinity_client.service.http_client: - class: %cardinity_client.service.http_client.class% - arguments: - config: - base_url: %cardinity_client.parameters.url% - defaults: %cardinity_client.parameters.defaults% - emitter: '@cardinity_client.service.emitter' + class: '%cardinity_client.service.http_client.class%' + arguments: + $config: + base_uri: '%cardinity_client.parameters.url%' + handler: '@cardinity_client.service.stack' + auth: '%cardinity_client.parameters.auth%' + verify: '%cardinity_client.parameters.verify%' cardinity_client.service.result_object_mapper: - class: %cardinity_client.service.result_object_mapper.class% + class: '%cardinity_client.service.result_object_mapper.class%' cardinity_client.service.exception_mapper: - class: %cardinity_client.service.exception_mapper.class% - arguments: - client: '@cardinity_client.service.result_object_mapper' + class: '%cardinity_client.service.exception_mapper.class%' + arguments: + $resultMapper: '@cardinity_client.service.result_object_mapper' cardinity_client.service.client_adapter: - class: %cardinity_client.service.client_adapter.class% - arguments: - client: '@cardinity_client.service.http_client' - mapper: '@cardinity_client.service.exception_mapper' + class: '%cardinity_client.service.client_adapter.class%' + arguments: + $client: '@cardinity_client.service.http_client' + $mapper: '@cardinity_client.service.exception_mapper' cardinity_client.service.validator: - class: %cardinity_client.service.validator.class% - arguments: - validator: '@validator' + class: '%cardinity_client.service.validator.class%' + arguments: + $validator: '@validator' cardinity_client.service.client: - class: %cardinity_client.service.client.class% - arguments: - client: '@cardinity_client.service.client_adapter' - validator: '@cardinity_client.service.validator' - mapper: '@cardinity_client.service.result_object_mapper' + class: '%cardinity_client.service.client.class%' + arguments: + $client: '@cardinity_client.service.client_adapter' + $validator: '@cardinity_client.service.validator' + $mapper: '@cardinity_client.service.result_object_mapper' diff --git a/Resources/views/Payment/begin_authorization.html.twig b/Resources/views/Payment/begin_authorization.html.twig index 370141c..8aec677 100644 --- a/Resources/views/Payment/begin_authorization.html.twig +++ b/Resources/views/Payment/begin_authorization.html.twig @@ -1,21 +1,21 @@ {% extends 'CardinityClientBundle::layout.html.twig' %} {% block body %} -

Redirecting to credit card validation page

-

- If your browser does not start loading the page, - press the button below. - You will be sent back to this site after you - authorize the transaction. -

-
- - - - -
- +

Redirecting to credit card validation page

+

+ If your browser does not start loading the page, + press the button below. + You will be sent back to this site after you + authorize the transaction. +

+
+ + + + +
+ {% endblock %} diff --git a/Resources/views/Payment/details.html.twig b/Resources/views/Payment/details.html.twig index 36f0473..5bd0eec 100644 --- a/Resources/views/Payment/details.html.twig +++ b/Resources/views/Payment/details.html.twig @@ -1,9 +1,9 @@ {% extends 'CardinityClientBundle::layout.html.twig' %} {% block body %} -

Enter credit card details

+

Enter credit card details

-{{ form_start(form) }} -{{ form_widget(form) }} -{{ form_end(form) }} + {{ form_start(form) }} + {{ form_widget(form) }} + {{ form_end(form) }} {% endblock %} diff --git a/Resources/views/Payment/error.html.twig b/Resources/views/Payment/error.html.twig index 2233d5e..1517c57 100644 --- a/Resources/views/Payment/error.html.twig +++ b/Resources/views/Payment/error.html.twig @@ -1,6 +1,6 @@ {% extends 'CardinityClientBundle::layout.html.twig' %} {% block body %} -

Ooops! Something went wrong.

-

{{ message }}

+

Ooops! Something went wrong.

+

{{ message }}

{% endblock %} diff --git a/Resources/views/Payment/index.html.twig b/Resources/views/Payment/index.html.twig index e05230c..f4dd2e1 100644 --- a/Resources/views/Payment/index.html.twig +++ b/Resources/views/Payment/index.html.twig @@ -1,6 +1,6 @@ {% extends 'CardinityClientBundle::layout.html.twig' %} {% block body %} -

Press 'continue' to proceed checkout process

-

Continue

+

Press 'continue' to proceed checkout process

+

Continue

{% endblock %} diff --git a/Resources/views/Payment/success.html.twig b/Resources/views/Payment/success.html.twig index 512e0a8..d06eb35 100644 --- a/Resources/views/Payment/success.html.twig +++ b/Resources/views/Payment/success.html.twig @@ -1,8 +1,10 @@ {% extends 'CardinityClientBundle::layout.html.twig' %} {% block body %} -

Your payment has been successfully processed!

-

Amount: {{ payment.amount }} {{ payment.currency }}
-Description: {{ payment.description }}
-Order ID: {{ payment.orderId }}

+

Your payment has been successfully processed!

+

+ Amount: {{ payment.amount }} {{ payment.currency }}
+ Description: {{ payment.description }}
+ Order ID: {{ payment.orderId }} +

{% endblock %} diff --git a/Tests/AbstractTestCase.php b/Tests/AbstractTestCase.php index e19f527..3569123 100644 --- a/Tests/AbstractTestCase.php +++ b/Tests/AbstractTestCase.php @@ -1,12 +1,13 @@ method('getBundles') ->will($this->returnValue(array())); } - + $bundle = new CardinityClientBundle($kernel); $extension = $bundle->getContainerExtension(); $container = new ContainerBuilder(); diff --git a/Tests/CardinityServiceClientTest.php b/Tests/CardinityServiceClientTest.php index 19677e0..0965164 100644 --- a/Tests/CardinityServiceClientTest.php +++ b/Tests/CardinityServiceClientTest.php @@ -1,11 +1,16 @@ container = $this->getContainer(); + } + public function testCardinityClientInstance() { $client = $this->getContainer()->get('cardinity_client.service.client'); diff --git a/Tests/Controller/PaymentControllerTest.php b/Tests/Controller/PaymentControllerTest.php index 22c4d10..fe7e29f 100644 --- a/Tests/Controller/PaymentControllerTest.php +++ b/Tests/Controller/PaymentControllerTest.php @@ -39,15 +39,15 @@ public function testDetails() */ public function testProcess($crawler) { - $csrfToken = $this->client->getContainer()->get('form.csrf_provider')->generateCsrfToken('credit_card'); + $csrfToken = $this->client->getContainer()->get('security.csrf.token_manager')->getToken('credit_card'); $form = $crawler->selectButton('Save')->form(); $form['credit_card[holder]'] = 'John Deer'; $form['credit_card[pan]'] = '4111111111111111'; - $form['credit_card[exp_year]'] = 2018; - $form['credit_card[exp_month]'] = 1; - $form['credit_card[cvc]'] = '123'; + $form['credit_card[exp_year]'] = 2021; + $form['credit_card[exp_month]'] = 12; + $form['credit_card[cvc]'] = '456'; $form['credit_card[_token]'] = $csrfToken; $this->client->submit($form); diff --git a/composer.json b/composer.json index 9f4f690..b31c68e 100644 --- a/composer.json +++ b/composer.json @@ -1,22 +1,24 @@ { "name": "cardinity/client-bundle", - "description": "Cardinity Credit Card payments bundle for Symfony2", - "homepage": "http://www.cardinity.com", + "description": "Cardinity Credit Card payments bundle for Symfony 3", + "homepage": "https://cardinity.com", "type": "library", "license": "MIT", "require": { - "php" : ">=5.4.0", - "cardinity/cardinity-sdk-php" : "~1.0", - "symfony/validator" : "~2.6" + "php": ">=5.5.9", + "cardinity/cardinity-sdk-php": "~2.0", + "symfony/validator": "~3.0" }, "require-dev": { - "symfony/http-kernel" : "~2.8", - "symfony/dependency-injection" : "~2.8", - "phpunit/phpunit" : "~4.4", - "matthiasnoback/symfony-config-test" : "~1.0" + "symfony/http-kernel": "~3.0", + "symfony/dependency-injection": "~3.0", + "phpunit/phpunit": "~4.4", + "matthiasnoback/symfony-config-test": "~1.0" }, "autoload": { - "psr-4": { "Cardinity\\ClientBundle\\": "" } + "psr-4": { + "Cardinity\\ClientBundle\\": "" + } }, "config": { "bin-dir": "bin" diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 5f02ee2..5e59a1e 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -2,18 +2,18 @@ + backupGlobals="false" + backupStaticAttributes="false" + colors="true" + convertErrorsToExceptions="true" + convertNoticesToExceptions="true" + convertWarningsToExceptions="true" + processIsolation="false" + stopOnFailure="false" + syntaxCheck="false" + bootstrap="vendor/autoload.php" + mapTestClassNameToCoveredClassName="true" + forceCoversAnnotation="false">