From 46c1ba81f8d7821dbe87f1ace03a0af198d1f139 Mon Sep 17 00:00:00 2001 From: Denys Date: Thu, 28 Jul 2022 15:26:47 +0200 Subject: [PATCH 01/21] Workflows; refs #35898 --- .github/workflows/phpunit.yml | 10 +++++----- src/Constant/BankCapability.php | 4 ++-- src/Logger/NullLogger.php | 1 - src/Model/Error.php | 1 - src/Model/ListBanks.php | 2 +- src/Stream.php | 2 ++ 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index 2854454..a56f9e5 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -5,10 +5,6 @@ jobs: name: PHPUnit runs-on: ubuntu-latest steps: - - name: Get runner ip addresses - id: ip - uses: haythem/public-ip@v1.2 - run: echo "${{ steps.ip.outputs.ipv4 }}" - name: Setup PHP uses: shivammathur/setup-php@v2 with: @@ -26,7 +22,11 @@ jobs: - name: Install dependencies run: composer update --ignore-platform-reqs + - name: Get runner ip addresses + id: ip + uses: haythem/public-ip@v1.2 + - name: Unit tests (PHPUnit) env: BRIDGE_CLIENT_ID: ${{ secrets.BRIDGE_CLIENT_ID }} - run: ./vendor/bin/phpunit . + run: echo "${{ steps.ip.outputs.ipv4 }}"; ./vendor/bin/phpunit . diff --git a/src/Constant/BankCapability.php b/src/Constant/BankCapability.php index 39de0a4..dba6495 100644 --- a/src/Constant/BankCapability.php +++ b/src/Constant/BankCapability.php @@ -17,7 +17,7 @@ class BankCapability { - const SINGLE_TRANSFER = 'single_transfer'; + public const SINGLE_TRANSFER = 'single_transfer'; - const SINGLE_PAYMENT = 'single_payment'; + public const SINGLE_PAYMENT = 'single_payment'; } diff --git a/src/Logger/NullLogger.php b/src/Logger/NullLogger.php index baa7e61..f25f3d9 100644 --- a/src/Logger/NullLogger.php +++ b/src/Logger/NullLogger.php @@ -19,7 +19,6 @@ class NullLogger implements LoggerInterface { - public function emergency($message, array $context = array()) { } diff --git a/src/Model/Error.php b/src/Model/Error.php index 337e2b8..4614a9e 100644 --- a/src/Model/Error.php +++ b/src/Model/Error.php @@ -18,7 +18,6 @@ use InvalidArgumentException; use JsonSerializable; - class Error extends AbstractModel implements JsonSerializable { /** diff --git a/src/Model/ListBanks.php b/src/Model/ListBanks.php index ab04513..f36b344 100644 --- a/src/Model/ListBanks.php +++ b/src/Model/ListBanks.php @@ -78,4 +78,4 @@ public function getAfter() { return $this->after; } -} \ No newline at end of file +} diff --git a/src/Stream.php b/src/Stream.php index 0f68068..fd0e3c3 100644 --- a/src/Stream.php +++ b/src/Stream.php @@ -20,6 +20,7 @@ use Psr\Http\Message\StreamInterface; use Psr\Http\Message\UriInterface; use RuntimeException; + use function clearstatcache; use function fclose; use function feof; @@ -28,6 +29,7 @@ use function ftell; use function is_resource; use function var_export; + use const SEEK_CUR; use const SEEK_SET; From 8d8f4ea579f4c0b420d8be3ba08384f6af94e361 Mon Sep 17 00:00:00 2001 From: Denys Date: Thu, 28 Jul 2022 15:30:33 +0200 Subject: [PATCH 02/21] Workflows; refs #35898 --- .github/workflows/phpunit.yml | 1 + tests/phpunit.xml | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index a56f9e5..1895ece 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -29,4 +29,5 @@ jobs: - name: Unit tests (PHPUnit) env: BRIDGE_CLIENT_ID: ${{ secrets.BRIDGE_CLIENT_ID }} + BRIDGE_CLIENT_SECRET: ${{ secrets.BRIDGE_CLIENT_SECRET }} run: echo "${{ steps.ip.outputs.ipv4 }}"; ./vendor/bin/phpunit . diff --git a/tests/phpunit.xml b/tests/phpunit.xml index e1d2adb..9252c2e 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -6,9 +6,7 @@ - - - + tests From 17c5a6aae0590d9249b0f7870129f615d025532c Mon Sep 17 00:00:00 2001 From: Denys Date: Thu, 28 Jul 2022 15:35:28 +0200 Subject: [PATCH 03/21] Workflows; refs #35898 --- .github/workflows/phpunit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index 1895ece..88b99d3 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -30,4 +30,4 @@ jobs: env: BRIDGE_CLIENT_ID: ${{ secrets.BRIDGE_CLIENT_ID }} BRIDGE_CLIENT_SECRET: ${{ secrets.BRIDGE_CLIENT_SECRET }} - run: echo "${{ steps.ip.outputs.ipv4 }}"; ./vendor/bin/phpunit . + run: ./vendor/bin/phpunit . From a7cce6b6616ad2c042b720d24ee414ccb289a8d5 Mon Sep 17 00:00:00 2001 From: Denys Date: Thu, 28 Jul 2022 18:41:14 +0200 Subject: [PATCH 04/21] Added bank request; refs #35898 --- .github/workflows/phpunit.yml | 1 + README.md | 2 +- src/Model/Bank.php | 130 ++++++++++++++---- src/Request/BankRequest.php | 47 +++++++ src/Response/BankResponse.php | 51 +++++++ tests/Integration/IntegrationTestCase.php | 43 ++++++ tests/Integration/Request/BankRequestTest.php | 89 ++++++++++++ .../Request}/ListBanksRequestTest.php | 20 +-- tests/phpunit.xml | 5 +- 9 files changed, 341 insertions(+), 47 deletions(-) create mode 100644 src/Request/BankRequest.php create mode 100644 src/Response/BankResponse.php create mode 100644 tests/Integration/IntegrationTestCase.php create mode 100644 tests/Integration/Request/BankRequestTest.php rename tests/{Request/Integration => Integration/Request}/ListBanksRequestTest.php (79%) diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index 88b99d3..12f57a0 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -30,4 +30,5 @@ jobs: env: BRIDGE_CLIENT_ID: ${{ secrets.BRIDGE_CLIENT_ID }} BRIDGE_CLIENT_SECRET: ${{ secrets.BRIDGE_CLIENT_SECRET }} + BRIDGE_INTEGRATION_TEST: false run: ./vendor/bin/phpunit . diff --git a/README.md b/README.md index b6cb124..9c05fb8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Younited Pay SDK for PHP -[![Coding Standart](https://github.com/202ecommerce/younitedpaysdk/actions/workflows/main.yml/badge.svg)](https://github.com/202ecommerce/younitedpaysdk/actions/workflows/main.yml) [![Unit test](https://github.com/202ecommerce/younitedpaysdk/actions/workflows/phpunit.yml/badge.svg)](https://github.com/202ecommerce/younitedpaysdk/actions/workflows/phpunit.yml) +[![Coding Standart](https://github.com/202ecommerce/bridgesdk/actions/workflows/main.yml/badge.svg)](https://github.com/202ecommerce/younitedpaysdk/actions/workflows/main.yml) [![Unit test](https://github.com/202ecommerce/younitedpaysdk/actions/workflows/phpunit.yml/badge.svg)](https://github.com/202ecommerce/younitedpaysdk/actions/workflows/phpunit.yml) This package is a Younited Pay PHP SDK. It let you mange exchange between your shop and Younited Pay. diff --git a/src/Model/Bank.php b/src/Model/Bank.php index 4ad61e5..536945a 100644 --- a/src/Model/Bank.php +++ b/src/Model/Bank.php @@ -15,6 +15,8 @@ namespace BridgeSDK\Model; +use InvalidArgumentException; + class Bank extends AbstractModel { /** @@ -73,7 +75,7 @@ class Bank extends AbstractModel protected $channelType = []; /** - * @var ?string + * @var ?int */ protected $displayOrder; @@ -91,8 +93,14 @@ public function getId() */ public function setId($id) { - $this->id = $id; - return $this; + if (is_int($id) === true) { + $this->id = $id; + return $this; + } + + throw new InvalidArgumentException( + 'Id must be an int, ' . gettype($id) . ' is given.' + ); } /** @@ -109,8 +117,14 @@ public function getName() */ public function setName($name) { - $this->name = $name; - return $this; + if (is_string($name) === true) { + $this->name = $name; + return $this; + } + + throw new InvalidArgumentException( + 'Name must be a string, ' . gettype($name) . ' is given.' + ); } /** @@ -127,8 +141,14 @@ public function getCountryCode() */ public function setCountryCode($countryCode) { - $this->countryCode = $countryCode; - return $this; + if (is_string($countryCode) === true) { + $this->countryCode = $countryCode; + return $this; + } + + throw new InvalidArgumentException( + 'Country code must be a string, ' . gettype($countryCode) . ' is given.' + ); } /** @@ -145,8 +165,14 @@ public function getLogoUrl() */ public function setLogoUrl($logoUrl) { - $this->logoUrl = $logoUrl; - return $this; + if (is_string($logoUrl) === true) { + $this->logoUrl = $logoUrl; + return $this; + } + + throw new InvalidArgumentException( + 'Logo url must be a string, ' . gettype($logoUrl) . ' is given.' + ); } /** @@ -158,13 +184,19 @@ public function isHighlighted() } /** - * @param bool $isHighlighted + * @param bool|null $isHighlighted * @return Bank */ public function setIsHighlighted($isHighlighted) { - $this->isHighlighted = $isHighlighted; - return $this; + if (is_bool($isHighlighted) === true || is_null($isHighlighted)) { + $this->isHighlighted = $isHighlighted; + return $this; + } + + throw new InvalidArgumentException( + 'Is highlighted must be a string or null, ' . gettype($isHighlighted) . ' is given.' + ); } /** @@ -181,8 +213,14 @@ public function getPrimaryColor() */ public function setPrimaryColor($primaryColor) { - $this->primaryColor = $primaryColor; - return $this; + if (is_string($primaryColor) === true || is_null($primaryColor)) { + $this->primaryColor = $primaryColor; + return $this; + } + + throw new InvalidArgumentException( + 'Primary color must be a string or null, ' . gettype($primaryColor) . ' is given.' + ); } /** @@ -199,8 +237,14 @@ public function getSecondaryColor() */ public function setSecondaryColor($secondaryColor) { - $this->secondaryColor = $secondaryColor; - return $this; + if (is_string($secondaryColor) === true || is_null($secondaryColor)) { + $this->secondaryColor = $secondaryColor; + return $this; + } + + throw new InvalidArgumentException( + 'Secondary color must be a string or null, ' . gettype($secondaryColor) . ' is given.' + ); } /** @@ -217,8 +261,14 @@ public function getParentName() */ public function setParentName($parentName) { - $this->parentName = $parentName; - return $this; + if (is_string($parentName) === true || is_null($parentName)) { + $this->parentName = $parentName; + return $this; + } + + throw new InvalidArgumentException( + 'Parent name must be a string or null, ' . gettype($parentName) . ' is given.' + ); } /** @@ -235,8 +285,14 @@ public function getCapabilities() */ public function setCapabilities($capabilities) { - $this->capabilities = $capabilities; - return $this; + if (is_array($capabilities) === true) { + $this->capabilities = $capabilities; + return $this; + } + + throw new InvalidArgumentException( + 'Capabilities must be an array, ' . gettype($capabilities) . ' is given.' + ); } /** @@ -253,8 +309,14 @@ public function getForm() */ public function setForm($form) { - $this->form = $form; - return $this; + if (is_array($form) === true) { + $this->form = $form; + return $this; + } + + throw new InvalidArgumentException( + 'Form must be an array, ' . gettype($form) . ' is given.' + ); } /** @@ -271,12 +333,18 @@ public function getChannelType() */ public function setChannelType($channelType) { - $this->channelType = $channelType; - return $this; + if (is_array($channelType) === true) { + $this->channelType = $channelType; + return $this; + } + + throw new InvalidArgumentException( + 'Channel type must be an array, ' . gettype($channelType) . ' is given.' + ); } /** - * @return string|null + * @return int|null */ public function getDisplayOrder() { @@ -284,12 +352,18 @@ public function getDisplayOrder() } /** - * @param string|null $displayOrder + * @param int|null $displayOrder * @return Bank */ public function setDisplayOrder($displayOrder) { - $this->displayOrder = $displayOrder; - return $this; + if (is_int($displayOrder) === true || is_null($displayOrder)) { + $this->displayOrder = $displayOrder; + return $this; + } + + throw new InvalidArgumentException( + 'Display order must be an int or null, ' . gettype($displayOrder) . ' is given.' + ); } } diff --git a/src/Request/BankRequest.php b/src/Request/BankRequest.php new file mode 100644 index 0000000..82dc1a7 --- /dev/null +++ b/src/Request/BankRequest.php @@ -0,0 +1,47 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Request; + +use BridgeSDK\Model\AbstractModel; +use BridgeSDK\Model\Bank; +use BridgeSDK\Response\BankResponse; +use InvalidArgumentException; + +class BankRequest extends AbstractRequest +{ + protected $requestTarget = '/banks/:idBank'; + + protected $method = 'GET'; + + protected $response = BankResponse::class; + + /** + * @param AbstractModel $body + * @return AbstractRequest + */ + public function setModel(AbstractModel $body) + { + if ($body instanceof Bank) { + // $this->requestTarget = str_replace('{idBank}', $body->getId(), $this->requestTarget); + $this->uri = $this->uri->withPath(str_replace(':idBank', $body->getId(), $this->uri->getPath())) ; + return parent::setModel($body); + } + + throw new InvalidArgumentException( + 'Body must be an instance of ' . Bank::class . ' ' . get_class($body) . ' given.' + ); + } +} diff --git a/src/Response/BankResponse.php b/src/Response/BankResponse.php new file mode 100644 index 0000000..c93b3e5 --- /dev/null +++ b/src/Response/BankResponse.php @@ -0,0 +1,51 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Response; + +use BridgeSDK\Model\AbstractModel; +use BridgeSDK\Model\ArrayCollection; +use BridgeSDK\Model\Bank; +use BridgeSDK\Model\Error; +use InvalidArgumentException; + +class BankResponse extends AbstractResponse +{ + /** + * @return AbstractModel|ArrayCollection + */ + public function getModel() + { + $content = (string) $this->stream; + if (empty($content) === true) { + return new ArrayCollection(); + } + $output = json_decode($content, true); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new InvalidArgumentException( + 'json_decode error: ' . json_last_error_msg() + ); + } + if (empty($output) === true) { + return new Bank(); + } + + if ($this->getStatusCode() < 200 || $this->getStatusCode() > 299) { + return (new Error())->hydrate($output); + } + + return (new Bank())->hydrate($output); + } +} diff --git a/tests/Integration/IntegrationTestCase.php b/tests/Integration/IntegrationTestCase.php new file mode 100644 index 0000000..31597e6 --- /dev/null +++ b/tests/Integration/IntegrationTestCase.php @@ -0,0 +1,43 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace Tests\Integration; + +use PHPUnit\Framework\TestCase; + +class IntegrationTestCase extends TestCase +{ + protected $clientId; + + protected $clientSecret; + + protected $version; + + public function __construct(?string $name = null, array $data = [], $dataName = '') + { + parent::__construct($name, $data, $dataName); + $this->clientId = getenv('BRIDGE_CLIENT_ID'); + $this->clientSecret = getenv('BRIDGE_CLIENT_SECRET'); + $this->version = '2021-06-01'; + } + + protected function setUp(): void + { + $integrationTest = getenv('BRIDGE_INTEGRATION_TEST'); + if (!$integrationTest) { + $this->markTestSkipped('Skipping integration test: ' . $this->getName()); + } + } +} diff --git a/tests/Integration/Request/BankRequestTest.php b/tests/Integration/Request/BankRequestTest.php new file mode 100644 index 0000000..4db8a60 --- /dev/null +++ b/tests/Integration/Request/BankRequestTest.php @@ -0,0 +1,89 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace Tests\Integration\Request; + +use BridgeSDK\Client; +use BridgeSDK\Model\Bank; +use BridgeSDK\Model\Error; +use BridgeSDK\Request\BankRequest; +use Tests\Integration\IntegrationTestCase; + +class BankRequestTest extends IntegrationTestCase +{ + /** + * @dataProvider getApiCallBankOkDataProvider + * @param $id + * @param $expectedName + * @return void + */ + public function testApiCallBankOk($id, $expectedName) + { + $request = (new BankRequest()) + ->setModel((new Bank()) + ->setId($id) + ); + $client = new Client(); + $response = $client->setCredentials($this->clientId, $this->clientSecret) + ->sendRequest($request); + + $model = $response->getModel(); + + $this->assertInstanceOf(Bank::class, $model); + $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals($id, $model->getId()); + $this->assertEquals($expectedName, $model->getName()); + } + + /** + * @dataProvider getApiCallBanksErrorDataProvider + * @return void + */ + public function testApiCallBanksError($id, $clientId, $clientSecret, $version, $expectedErrorType) + { + $request = (new BankRequest()) + ->setModel((new Bank()) + ->setId($id) + ); + $client = new Client(); + $response = $client->setCredentials($clientId, $clientSecret) + ->setVersion($version) + ->sendRequest($request); + + $model = $response->getModel(); + + $this->assertInstanceOf(Error::class, $model); + $this->assertEquals($expectedErrorType, $model->getType()); + } + + public function getApiCallBanksErrorDataProvider() + { + return [ + [1111111, $this->clientId, $this->clientSecret, $this->version, 'not_found'], + [563, 'test', $this->clientSecret, $this->version, 'invalid_client_credentials'], + [563, $this->clientId, 'test', $this->version, 'invalid_client_credentials'], + [563, $this->clientSecret, $this->clientId, $this->version, 'invalid_client_credentials'], + [563, $this->clientId, $this->clientSecret, 'test', 'invalid_version_header'], + ]; + } + + public function getApiCallBankOkDataProvider() + { + return [ + [563, 'Memo Bank'], + [543, 'BTP Banque (Lecteur sans fil)'], + ]; + } +} diff --git a/tests/Request/Integration/ListBanksRequestTest.php b/tests/Integration/Request/ListBanksRequestTest.php similarity index 79% rename from tests/Request/Integration/ListBanksRequestTest.php rename to tests/Integration/Request/ListBanksRequestTest.php index 30c0f53..124c244 100644 --- a/tests/Request/Integration/ListBanksRequestTest.php +++ b/tests/Integration/Request/ListBanksRequestTest.php @@ -13,30 +13,16 @@ * @link https://docs.bridgeapi.io/ */ -namespace Tests\Request\Integration; +namespace Integration\Request; use BridgeSDK\Client; use BridgeSDK\Model\Error; use BridgeSDK\Model\ListBanks; use BridgeSDK\Request\ListBanksRequest; -use PHPUnit\Framework\TestCase; +use Tests\Integration\IntegrationTestCase; -class ListBanksRequestTest extends TestCase +class ListBanksRequestTest extends IntegrationTestCase { - protected $clientId; - - protected $clientSecret; - - protected $version; - - public function __construct(?string $name = null, array $data = [], $dataName = '') - { - parent::__construct($name, $data, $dataName); - $this->clientId = getenv('BRIDGE_CLIENT_ID'); - $this->clientSecret = getenv('BRIDGE_CLIENT_SECRET'); - $this->version = '2021-06-01'; - } - public function testApiCallBanksOk() { $request = new ListBanksRequest(); diff --git a/tests/phpunit.xml b/tests/phpunit.xml index 9252c2e..dfb6d11 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -6,7 +6,10 @@ - + + + + tests From 7d2a1f9d7a4ef6df84c0c44f1b61b168ec119108 Mon Sep 17 00:00:00 2001 From: Denys Date: Thu, 28 Jul 2022 18:43:51 +0200 Subject: [PATCH 05/21] Fixed test skip; refs #35898 --- tests/Integration/IntegrationTestCase.php | 2 +- tests/phpunit.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Integration/IntegrationTestCase.php b/tests/Integration/IntegrationTestCase.php index 31597e6..8be08a0 100644 --- a/tests/Integration/IntegrationTestCase.php +++ b/tests/Integration/IntegrationTestCase.php @@ -36,7 +36,7 @@ public function __construct(?string $name = null, array $data = [], $dataName = protected function setUp(): void { $integrationTest = getenv('BRIDGE_INTEGRATION_TEST'); - if (!$integrationTest) { + if (empty($integrationTest)) { $this->markTestSkipped('Skipping integration test: ' . $this->getName()); } } diff --git a/tests/phpunit.xml b/tests/phpunit.xml index dfb6d11..3cce602 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -8,7 +8,7 @@ - + From 04aff3efdbd0752f9e4b8137932d59569fb6b682 Mon Sep 17 00:00:00 2001 From: Denys Date: Fri, 29 Jul 2022 18:33:15 +0200 Subject: [PATCH 06/21] Added some calls; refs #35898 --- .github/workflows/main.yml | 2 +- .github/workflows/phpunit.yml | 4 +- src/Constant/PaymentStatuses.php | 76 +++++ src/Model/AbstractModel.php | 3 +- src/Model/{ => Bank}/Bank.php | 3 +- src/Model/{ => Bank}/ListBanks.php | 10 +- src/Model/Payment/CreatePayment.php | 173 +++++++++++ .../Payment/CreatePaymentTransaction.php | 167 +++++++++++ src/Model/Payment/CreatePaymentUrl.php | 80 +++++ src/Model/Payment/Payment.php | 279 ++++++++++++++++++ src/Model/Payment/PaymentError.php | 80 +++++ src/Model/Payment/PaymentErrors.php | 72 +++++ src/Model/Payment/PaymentUser.php | 138 +++++++++ src/Model/Payment/Transaction.php | 81 +++++ src/Request/BankRequest.php | 3 +- src/Request/CreatePaymentRequest.php | 41 +++ src/Request/ListBanksRequest.php | 2 +- src/Request/PaymentRequest.php | 42 +++ src/Response/BankResponse.php | 2 +- src/Response/CreatePaymentResponse.php | 57 ++++ src/Response/ListBanksResponse.php | 2 +- src/Response/PaymentResponse.php | 64 ++++ tests/Integration/Request/BankRequestTest.php | 2 +- .../Request/CreatePaymentRequestTest.php | 127 ++++++++ .../Request/ListBanksRequestTest.php | 2 +- .../Request/PaymentRequestTest.php | 61 ++++ tests/phpunit.xml | 15 +- 27 files changed, 1571 insertions(+), 17 deletions(-) create mode 100644 src/Constant/PaymentStatuses.php rename src/Model/{ => Bank}/Bank.php (99%) rename src/Model/{ => Bank}/ListBanks.php (93%) create mode 100644 src/Model/Payment/CreatePayment.php create mode 100644 src/Model/Payment/CreatePaymentTransaction.php create mode 100644 src/Model/Payment/CreatePaymentUrl.php create mode 100644 src/Model/Payment/Payment.php create mode 100644 src/Model/Payment/PaymentError.php create mode 100644 src/Model/Payment/PaymentErrors.php create mode 100644 src/Model/Payment/PaymentUser.php create mode 100644 src/Model/Payment/Transaction.php create mode 100644 src/Request/CreatePaymentRequest.php create mode 100644 src/Request/PaymentRequest.php create mode 100644 src/Response/CreatePaymentResponse.php create mode 100644 src/Response/PaymentResponse.php create mode 100644 tests/Integration/Request/CreatePaymentRequestTest.php create mode 100644 tests/Integration/Request/PaymentRequestTest.php diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cb6e666..6f24676 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,5 +1,5 @@ name: Coding Standart -on: [push, pull_request] +on: [push] jobs: # Check there is no syntax errors in the project php-linter: diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index 12f57a0..caf9107 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -1,5 +1,5 @@ name: Unit tests -on: [ push, pull_request ] +on: [ push ] jobs: phpunit: name: PHPUnit @@ -30,5 +30,5 @@ jobs: env: BRIDGE_CLIENT_ID: ${{ secrets.BRIDGE_CLIENT_ID }} BRIDGE_CLIENT_SECRET: ${{ secrets.BRIDGE_CLIENT_SECRET }} - BRIDGE_INTEGRATION_TEST: false + BRIDGE_INTEGRATION_TEST: 0 run: ./vendor/bin/phpunit . diff --git a/src/Constant/PaymentStatuses.php b/src/Constant/PaymentStatuses.php new file mode 100644 index 0000000..415c792 --- /dev/null +++ b/src/Constant/PaymentStatuses.php @@ -0,0 +1,76 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Constant; + +class PaymentStatuses +{ + /** + * Status created : CREA, ACTC, ACCP + * @var array + */ + const CREATED_PAYMENTS = [ + 'CREA', + 'ACTC', + 'ACCP', + ]; + + /** + * Status success : PDNG, ACSP, PART or ACSC + * @var array + */ + const SUCCESS_PAYMENTS = [ + 'PDNG', + 'ACSP', + 'PART', + 'ACSC', + ]; + + /** + * Status done : PART or ACSC + * @var array + */ + const DONE_PAYMENTS = [ + 'PART', + 'ACSC', + ]; + + /** + * Status rejected : CANC, RJCT + * @var array + */ + const REJECTED_PAYMENTS = [ + 'CANC', + 'RJCT', + ]; + + public static function getAllStatuses() + { + return array_merge( + self::CREATED_PAYMENTS, + self::SUCCESS_PAYMENTS, + self::DONE_PAYMENTS, + self::REJECTED_PAYMENTS + ); + } + + /** + * Status not found (error response) + * @var string + */ + const ERROR_NOT_FOUND = 'errorstatus'; + + const PROCESS_IN_PROGRESS = 'inprogress'; +} diff --git a/src/Model/AbstractModel.php b/src/Model/AbstractModel.php index 3d3e404..cc1f19c 100644 --- a/src/Model/AbstractModel.php +++ b/src/Model/AbstractModel.php @@ -28,7 +28,8 @@ public function jsonSerialize() $gettableAttributes = []; foreach ($getterName as $value) { if (substr($value, 0, 3) === 'get') { - $gettableAttributes[lcfirst(substr($value, 3, strlen($value)))] = $this->$value(); + $key = lcfirst(substr($value, 3, strlen($value))); + $gettableAttributes[$this->transformToPascalCase($key)] = $this->$value(); } } diff --git a/src/Model/Bank.php b/src/Model/Bank/Bank.php similarity index 99% rename from src/Model/Bank.php rename to src/Model/Bank/Bank.php index 536945a..4ea36ce 100644 --- a/src/Model/Bank.php +++ b/src/Model/Bank/Bank.php @@ -13,8 +13,9 @@ * @link https://docs.bridgeapi.io/ */ -namespace BridgeSDK\Model; +namespace BridgeSDK\Model\Bank; +use BridgeSDK\Model\AbstractModel; use InvalidArgumentException; class Bank extends AbstractModel diff --git a/src/Model/ListBanks.php b/src/Model/Bank/ListBanks.php similarity index 93% rename from src/Model/ListBanks.php rename to src/Model/Bank/ListBanks.php index f36b344..5abd99c 100644 --- a/src/Model/ListBanks.php +++ b/src/Model/Bank/ListBanks.php @@ -13,12 +13,20 @@ * @link https://docs.bridgeapi.io/ */ -namespace BridgeSDK\Model; +namespace BridgeSDK\Model\Bank; + +use BridgeSDK\Model\AbstractModel; class ListBanks extends AbstractModel { + /** + * @var array + */ protected $banks = []; + /** + * @var string + */ private $after = ''; public function hydrate(array $content) diff --git a/src/Model/Payment/CreatePayment.php b/src/Model/Payment/CreatePayment.php new file mode 100644 index 0000000..2d7296d --- /dev/null +++ b/src/Model/Payment/CreatePayment.php @@ -0,0 +1,173 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Model\Payment; + +use BridgeSDK\Model\AbstractModel; +use BridgeSDK\Model\ArrayCollection; +use InvalidArgumentException; + +class CreatePayment extends AbstractModel +{ + /** + * @var string + */ + private $successfulCallbackUrl; + + /** + * @var string + */ + private $unsuccessfulCallbackUrl; + + /** + * @var int + */ + private $bankId; + + /** + * @var array + */ + private $transactions; + + /** + * @var PaymentUser + */ + private $user; + + /** + * @return string + */ + public function getSuccessfulCallbackUrl() + { + return $this->successfulCallbackUrl; + } + + /** + * @param string $successfulCallbackUrl + * @return CreatePayment + */ + public function setSuccessfulCallbackUrl($successfulCallbackUrl) + { + if (is_string($successfulCallbackUrl) === true) { + $this->successfulCallbackUrl = $successfulCallbackUrl; + return $this; + } + + throw new InvalidArgumentException( + 'Successful callback url must be a string ' . gettype($successfulCallbackUrl) . ' is given.' + ); + } + + /** + * @return string + */ + public function getUnsuccessfulCallbackUrl() + { + return $this->unsuccessfulCallbackUrl; + } + + /** + * @param string $unsuccessfulCallbackUrl + * @return CreatePayment + */ + public function setUnsuccessfulCallbackUrl($unsuccessfulCallbackUrl) + { + if (is_string($unsuccessfulCallbackUrl) === true) { + $this->unsuccessfulCallbackUrl = $unsuccessfulCallbackUrl; + return $this; + } + + throw new InvalidArgumentException( + 'Unsuccessful callback url must be a string ' . gettype($unsuccessfulCallbackUrl) . ' is given.' + ); + } + + /** + * @return int + */ + public function getBankId() + { + return $this->bankId; + } + + /** + * @param int $bankId + * @return CreatePayment + */ + public function setBankId($bankId) + { + if (is_int($bankId) === true) { + $this->bankId = $bankId; + return $this; + } + + throw new InvalidArgumentException( + 'Bank id must be an int ' . gettype($bankId) . ' is given.' + ); + } + + /** + * @return array + */ + public function getTransactions() + { + return $this->transactions; + } + + /** + * @param array $transactions + * @return CreatePayment + */ + public function setTransactions($transactions) + { + if (is_array($transactions)) { + $this->transactions = $transactions; + return $this; + } + + throw new InvalidArgumentException( + 'Transactions must be an array ' . gettype($transactions) . ' is given.' + ); + } + + /** + * @return PaymentUser + */ + public function getUser() + { + return $this->user; + } + + /** + * @param PaymentUser $user + * @return CreatePayment + */ + public function setUser($user) + { + if ($user instanceof PaymentUser) { + $this->user = $user; + return $this; + } + + throw new InvalidArgumentException( + 'User must be an ArrayCollection ' . gettype($user) . ' is given.' + ); + } + + public function jsonSerialize() + { + return parent::jsonSerialize(); + } +} diff --git a/src/Model/Payment/CreatePaymentTransaction.php b/src/Model/Payment/CreatePaymentTransaction.php new file mode 100644 index 0000000..37513ed --- /dev/null +++ b/src/Model/Payment/CreatePaymentTransaction.php @@ -0,0 +1,167 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Model\Payment; + +use BridgeSDK\Model\AbstractModel; +use InvalidArgumentException; + +class CreatePaymentTransaction extends AbstractModel +{ + /** + * @var string + */ + protected $currency = 'EUR'; + + /** + * @var string + */ + protected $label; + + /** + * @var float + */ + protected $amount; + + /** + * @var string + */ + protected $clientReference; + + /** + * @var string + */ + protected $endToEndId; + + /** + * @return string + */ + public function getCurrency() + { + return $this->currency; + } + + /** + * @param string $currency + * @return CreatePaymentTransaction + */ + public function setCurrency($currency) + { + if (is_string($currency) === true) { + $this->currency = $currency; + return $this; + } + + throw new InvalidArgumentException( + 'Currency must be a string ' . gettype($currency) . ' is given.' + ); + } + + /** + * @return string + */ + public function getLabel() + { + return $this->label; + } + + /** + * @param string $label + * @return CreatePaymentTransaction + */ + public function setLabel($label) + { + if (is_string($label) === true) { + $this->label = $label; + return $this; + } + + throw new InvalidArgumentException( + 'Label must be a string ' . gettype($label) . ' is given.' + ); + } + + /** + * @return float + */ + public function getAmount() + { + return $this->amount; + } + + /** + * @param float $amount + * @return CreatePaymentTransaction + */ + public function setAmount($amount) + { + if (is_float($amount) === true) { + $this->amount = $amount; + return $this; + } + + throw new InvalidArgumentException( + 'Amount must be a float ' . gettype($amount) . ' is given.' + ); + } + + /** + * @return string + */ + public function getClientReference() + { + return $this->clientReference; + } + + /** + * @param string $clientReference + * @return CreatePaymentTransaction + */ + public function setClientReference($clientReference) + { + if (is_string($clientReference) === true) { + $this->clientReference = $clientReference; + return $this; + } + + throw new InvalidArgumentException( + 'Client reference must be a string ' . gettype($clientReference) . ' is given.' + ); + } + + /** + * @return string + */ + public function getEndToEndId() + { + return $this->endToEndId; + } + + /** + * @param string $endToEndId + * @return CreatePaymentTransaction + */ + public function setEndToEndId($endToEndId) + { + if (is_string($endToEndId) === true) { + $this->endToEndId = $endToEndId; + return $this; + } + + throw new InvalidArgumentException( + 'End to end id must be a string ' . gettype($endToEndId) . ' is given.' + ); + } +} diff --git a/src/Model/Payment/CreatePaymentUrl.php b/src/Model/Payment/CreatePaymentUrl.php new file mode 100644 index 0000000..e121137 --- /dev/null +++ b/src/Model/Payment/CreatePaymentUrl.php @@ -0,0 +1,80 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Model\Payment; + +use BridgeSDK\Model\AbstractModel; +use InvalidArgumentException; + +class CreatePaymentUrl extends AbstractModel +{ + /** + * @var string + */ + private $id; + + /** + * @var string + */ + private $consentUrl; + + /** + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * @param string $id + * @return CreatePaymentUrl + */ + public function setId($id) + { + if (is_string($id) === true) { + $this->id = $id; + return $this; + } + + throw new InvalidArgumentException( + 'Id must be a string ' . gettype($id) . ' is given.' + ); + } + + /** + * @return string + */ + public function getConsentUrl() + { + return $this->consentUrl; + } + + /** + * @param string $consentUrl + * @return CreatePaymentUrl + */ + public function setConsentUrl($consentUrl) + { + if (is_string($consentUrl) === true) { + $this->consentUrl = $consentUrl; + return $this; + } + + throw new InvalidArgumentException( + 'Consent url must be a string ' . gettype($consentUrl) . ' is given.' + ); + } +} diff --git a/src/Model/Payment/Payment.php b/src/Model/Payment/Payment.php new file mode 100644 index 0000000..5e9a919 --- /dev/null +++ b/src/Model/Payment/Payment.php @@ -0,0 +1,279 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Model\Payment; + +use BridgeSDK\Model\AbstractModel; +use BridgeSDK\Model\ArrayCollection; +use InvalidArgumentException; + +class Payment extends AbstractModel +{ + /** + * @var string + */ + private $id; + + /** + * @var string + */ + private $status; + + /** + * @var string + */ + private $statusReason; + + /** + * @var int + */ + private $bankId; + + /** + * @var string + */ + private $createdAt; + + /** + * @var string + */ + private $updatedAt; + + /** + * @var PaymentUser + */ + private $user; + + /** + * @var ArrayCollection + */ + private $transactions; + + /** + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * @param string $id + * @return Payment + */ + public function setId($id) + { + $this->id = $id; + return $this; + } + + /** + * @return string + */ + public function getStatus() + { + return $this->status; + } + + /** + * @param string $status + * @return Payment + */ + public function setStatus($status) + { + $this->status = $status; + return $this; + } + + /** + * @return string + */ + public function getStatusReason() + { + return $this->statusReason; + } + + /** + * @param string $statusReason + * @return Payment + */ + public function setStatusReason($statusReason) + { + if (is_string($statusReason) === true) { + $this->statusReason = $statusReason; + return $this; + } + + throw new InvalidArgumentException( + 'Status reason must be a string ' . gettype($statusReason) . ' is given.' + ); + } + + /** + * @return int + */ + public function getBankId() + { + return $this->bankId; + } + + /** + * @param int $bankId + * @return Payment + */ + public function setBankId($bankId) + { + if (is_int($bankId) === true) { + $this->bankId = $bankId; + return $this; + } + + throw new InvalidArgumentException( + 'Bank id must be an int ' . gettype($bankId) . ' is given.' + ); + } + + /** + * @return string + */ + public function getCreatedAt() + { + return $this->createdAt; + } + + /** + * @param string $createdAt + * @return Payment + */ + public function setCreatedAt($createdAt) + { + if (is_string($createdAt) === true) { + $this->createdAt = $createdAt; + return $this; + } + + throw new InvalidArgumentException( + 'Created at must be a string ' . gettype($createdAt) . ' is given.' + ); + } + + /** + * @return string + */ + public function getUpdatedAt() + { + return $this->updatedAt; + } + + /** + * @param string $updatedAt + * @return Payment + */ + public function setUpdatedAt($updatedAt) + { + if (is_string($updatedAt) === true) { + $this->updatedAt = $updatedAt; + return $this; + } + + throw new InvalidArgumentException( + 'Updated at must be a string ' . gettype($updatedAt) . ' is given.' + ); + } + + /** + * @return PaymentUser + */ + public function getUser() + { + return $this->user; + } + + /** + * @param PaymentUser $user + * @return Payment + */ + public function setUser($user) + { + if ($user instanceof PaymentUser) { + $this->user = $user; + return $this; + } + + throw new InvalidArgumentException( + 'User must be a string ' . gettype($user) . ' is given.' + ); + } + + /** + * @return ArrayCollection + */ + public function getTransactions() + { + return $this->transactions; + } + + /** + * @param ArrayCollection $transactions + * @return Payment + */ + public function setTransactions($transactions) + { + if ($transactions instanceof ArrayCollection) { + $this->transactions = $transactions; + return $this; + } + + throw new InvalidArgumentException( + 'Transactions must be an ArrayCollection ' . gettype($transactions) . ' is given.' + ); + } + + /** + * hydrate from array + * + * @param array $content + * + * @return self + */ + public function hydrate(array $content) + { + $setterName = get_class_methods(get_class($this)); + foreach ($setterName as $value) { + if (substr($value, 0, 3) === 'set') { + $key = lcfirst(substr($value, 3, strlen($value))); + $apiKey = $this->transformToPascalCase($key); + if (isset($content[$apiKey])) { + switch ($key) { + case 'user': + $this->$value((new PaymentUser())->hydrate($content[$apiKey])); + break; + case 'transactions': + $collection = new ArrayCollection(); + foreach ($content[$apiKey] as $transaction) { + $collection->append((new Transaction())->hydrate($transaction)); + } + $this->transactions = $collection; + break; + default: + $this->$value($content[$apiKey]); + } + } + } + } + + return $this; + } +} diff --git a/src/Model/Payment/PaymentError.php b/src/Model/Payment/PaymentError.php new file mode 100644 index 0000000..14def53 --- /dev/null +++ b/src/Model/Payment/PaymentError.php @@ -0,0 +1,80 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Model\Payment; + +use BridgeSDK\Model\AbstractModel; +use InvalidArgumentException; + +class PaymentError extends AbstractModel +{ + /** + * @var string + */ + private $code; + + /** + * @var string + */ + private $message; + + /** + * @return string + */ + public function getCode() + { + return $this->code; + } + + /** + * @param string $code + * @return PaymentError + */ + public function setCode($code) + { + if (is_string($code) === true) { + $this->code = $code; + return $this; + } + + throw new InvalidArgumentException( + 'Code must be a string ' . gettype($code) . ' is given.' + ); + } + + /** + * @return string + */ + public function getMessage() + { + return $this->message; + } + + /** + * @param string $message + * @return PaymentError + */ + public function setMessage($message) + { + if (is_string($message) === true) { + $this->message = $message; + return $this; + } + + throw new InvalidArgumentException( + 'Message must be a string ' . gettype($message) . ' is given.' + ); + } +} diff --git a/src/Model/Payment/PaymentErrors.php b/src/Model/Payment/PaymentErrors.php new file mode 100644 index 0000000..82d8f39 --- /dev/null +++ b/src/Model/Payment/PaymentErrors.php @@ -0,0 +1,72 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Model\Payment; + +use BridgeSDK\Model\AbstractModel; +use BridgeSDK\Model\ArrayCollection; +use InvalidArgumentException; + +class PaymentErrors extends AbstractModel +{ + /** + * @var ArrayCollection + */ + private $errors; + + public function __construct() + { + $this->errors = new ArrayCollection(); + } + + /** + * @return ArrayCollection + */ + public function getErrors() + { + return $this->errors; + } + + /** + * @param ArrayCollection $errors + * @return PaymentErrors + */ + public function setErrors($errors) + { + if ($errors instanceof ArrayCollection) { + $this->errors = $errors; + return $this; + } + + throw new InvalidArgumentException( + 'Errors must be an Array collection ' . gettype($errors) . ' is given.' + ); + } + + public function hydrate(array $content) + { + if (empty($content['errors'])) { + return null; + } + + $collection = new ArrayCollection(); + foreach ($content['errors'] as $error) { + $collection->append((new PaymentError())->hydrate($error)); + } + $this->errors = $collection; + + return $this; + } +} diff --git a/src/Model/Payment/PaymentUser.php b/src/Model/Payment/PaymentUser.php new file mode 100644 index 0000000..af4b554 --- /dev/null +++ b/src/Model/Payment/PaymentUser.php @@ -0,0 +1,138 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Model\Payment; + +use BridgeSDK\Model\AbstractModel; +use InvalidArgumentException; + +class PaymentUser extends AbstractModel +{ + /** + * @var string + */ + private $firstName; + + /** + * @var string + */ + private $lastName; + + /** + * @var string + */ + private $externalReference; + + /** + * @var string + */ + private $ipAddress; + + /** + * @return string + */ + public function getFirstName() + { + return $this->firstName; + } + + /** + * @param string $firstName + * @return PaymentUser + */ + public function setFirstName($firstName) + { + if (is_string($firstName) === true) { + $this->firstName = $firstName; + return $this; + } + + throw new InvalidArgumentException( + 'First name must be a string ' . gettype($firstName) . ' is given.' + ); + } + + /** + * @return string + */ + public function getLastName() + { + return $this->lastName; + } + + /** + * @param string $lastName + * @return PaymentUser + */ + public function setLastName($lastName) + { + if (is_string($lastName) === true) { + $this->lastName = $lastName; + return $this; + } + + throw new InvalidArgumentException( + 'Last name must be a string ' . gettype($lastName) . ' is given.' + ); + } + + /** + * @return string + */ + public function getExternalReference() + { + return $this->externalReference; + } + + /** + * @param string $externalReference + * @return PaymentUser + */ + public function setExternalReference($externalReference) + { + if (is_string($externalReference) === true) { + $this->externalReference = $externalReference; + return $this; + } + + throw new InvalidArgumentException( + 'External reference must be a string ' . gettype($externalReference) . ' is given.' + ); + } + + /** + * @return string + */ + public function getIpAddress() + { + return $this->ipAddress; + } + + /** + * @param string $ipAddress + * @return PaymentUser + */ + public function setIpAddress($ipAddress) + { + if (is_string($ipAddress) === true) { + $this->ipAddress = $ipAddress; + return $this; + } + + throw new InvalidArgumentException( + 'Ip address must be a string ' . gettype($ipAddress) . ' is given.' + ); + } +} diff --git a/src/Model/Payment/Transaction.php b/src/Model/Payment/Transaction.php new file mode 100644 index 0000000..43f8eb0 --- /dev/null +++ b/src/Model/Payment/Transaction.php @@ -0,0 +1,81 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Model\Payment; + +use BridgeSDK\Constant\PaymentStatuses; +use BridgeSDK\Model\AbstractModel; +use InvalidArgumentException; + +class Transaction extends CreatePaymentTransaction +{ + /** + * @var string + */ + private $id; + + /** + * @var string + */ + private $status; + + /** + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * @param string $id + * @return Transaction + */ + public function setId($id) + { + if (is_string($id) === true) { + $this->id = $id; + return $this; + } + + throw new InvalidArgumentException( + 'Id must be a string ' . gettype($id) . ' is given.' + ); + } + + /** + * @return string + */ + public function getStatus() + { + return $this->status; + } + + /** + * @param string $status + * @return Transaction + */ + public function setStatus($status) + { + if (is_string($status) === true && in_array($status, PaymentStatuses::getAllStatuses())) { + $this->status = $status; + return $this; + } + + throw new InvalidArgumentException( + 'Status must be a string ' . gettype($status) . ' is given or status is not valid.' + ); + } +} diff --git a/src/Request/BankRequest.php b/src/Request/BankRequest.php index 82dc1a7..67a8677 100644 --- a/src/Request/BankRequest.php +++ b/src/Request/BankRequest.php @@ -16,7 +16,7 @@ namespace BridgeSDK\Request; use BridgeSDK\Model\AbstractModel; -use BridgeSDK\Model\Bank; +use BridgeSDK\Model\Bank\Bank; use BridgeSDK\Response\BankResponse; use InvalidArgumentException; @@ -35,7 +35,6 @@ class BankRequest extends AbstractRequest public function setModel(AbstractModel $body) { if ($body instanceof Bank) { - // $this->requestTarget = str_replace('{idBank}', $body->getId(), $this->requestTarget); $this->uri = $this->uri->withPath(str_replace(':idBank', $body->getId(), $this->uri->getPath())) ; return parent::setModel($body); } diff --git a/src/Request/CreatePaymentRequest.php b/src/Request/CreatePaymentRequest.php new file mode 100644 index 0000000..89eb390 --- /dev/null +++ b/src/Request/CreatePaymentRequest.php @@ -0,0 +1,41 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Request; + +use BridgeSDK\Model\AbstractModel; +use BridgeSDK\Model\Payment\CreatePayment; +use BridgeSDK\Response\CreatePaymentResponse; +use InvalidArgumentException; + +class CreatePaymentRequest extends AbstractRequest +{ + protected $requestTarget = '/payment-requests'; + + protected $method = 'POST'; + + protected $response = CreatePaymentResponse::class; + + public function setModel(AbstractModel $body) + { + if ($body instanceof CreatePayment) { + return parent::setModel($body); + } + + throw new InvalidArgumentException( + 'Body must be an instance of ' . CreatePayment::class . ' ' . get_class($body) . ' given.' + ); + } +} diff --git a/src/Request/ListBanksRequest.php b/src/Request/ListBanksRequest.php index 8e0d0fc..e2566c7 100644 --- a/src/Request/ListBanksRequest.php +++ b/src/Request/ListBanksRequest.php @@ -45,7 +45,7 @@ class ListBanksRequest extends AbstractRequest protected $response = ListBanksResponse::class; /** - * @param $query + * @param array $query * @return array */ protected function filterQuery($query) diff --git a/src/Request/PaymentRequest.php b/src/Request/PaymentRequest.php new file mode 100644 index 0000000..1cebd78 --- /dev/null +++ b/src/Request/PaymentRequest.php @@ -0,0 +1,42 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Request; + +use BridgeSDK\Model\AbstractModel; +use BridgeSDK\Model\Payment\Payment; +use BridgeSDK\Response\PaymentResponse; +use InvalidArgumentException; + +class PaymentRequest extends AbstractRequest +{ + protected $requestTarget = '/payment-requests/:idPayment'; + + protected $method = 'GET'; + + protected $response = PaymentResponse::class; + + public function setModel(AbstractModel $body) + { + if ($body instanceof Payment) { + $this->uri = $this->uri->withPath(str_replace(':idPayment', $body->getId(), $this->uri->getPath())); + return parent::setModel($body); + } + + throw new InvalidArgumentException( + 'Body must be an instance of ' . Payment::class . ' ' . get_class($body) . ' given.' + ); + } +} diff --git a/src/Response/BankResponse.php b/src/Response/BankResponse.php index c93b3e5..3f431ee 100644 --- a/src/Response/BankResponse.php +++ b/src/Response/BankResponse.php @@ -17,7 +17,7 @@ use BridgeSDK\Model\AbstractModel; use BridgeSDK\Model\ArrayCollection; -use BridgeSDK\Model\Bank; +use BridgeSDK\Model\Bank\Bank; use BridgeSDK\Model\Error; use InvalidArgumentException; diff --git a/src/Response/CreatePaymentResponse.php b/src/Response/CreatePaymentResponse.php new file mode 100644 index 0000000..b8679a3 --- /dev/null +++ b/src/Response/CreatePaymentResponse.php @@ -0,0 +1,57 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Response; + +use BridgeSDK\Model\ArrayCollection; +use BridgeSDK\Model\Error; +use BridgeSDK\Model\Payment\CreatePaymentUrl; +use BridgeSDK\Model\Payment\PaymentErrors; +use InvalidArgumentException; + +class CreatePaymentResponse extends AbstractResponse +{ + + public function getModel() + { + $content = (string) $this->stream; + if (empty($content) === true) { + return new ArrayCollection(); + } + $output = json_decode($content, true); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new InvalidArgumentException( + 'json_decode error: ' . json_last_error_msg() + ); + } + if (empty($output) === true) { + return new CreatePaymentUrl(); + } + + if ($this->getStatusCode() == 400) { + $errors = (new PaymentErrors())->hydrate($output); + if (!is_null($errors)) { + return $errors; + } + return (new Error())->hydrate($output); + } + + if ($this->getStatusCode() < 200 || $this->getStatusCode() > 299) { + return (new Error())->hydrate($output); + } + + return (new CreatePaymentUrl())->hydrate($output); + } +} diff --git a/src/Response/ListBanksResponse.php b/src/Response/ListBanksResponse.php index 5eb1aea..f6a9f8e 100644 --- a/src/Response/ListBanksResponse.php +++ b/src/Response/ListBanksResponse.php @@ -17,8 +17,8 @@ use BridgeSDK\Model\AbstractModel; use BridgeSDK\Model\ArrayCollection; +use BridgeSDK\Model\Bank\ListBanks; use BridgeSDK\Model\Error; -use BridgeSDK\Model\ListBanks; use InvalidArgumentException; class ListBanksResponse extends AbstractResponse diff --git a/src/Response/PaymentResponse.php b/src/Response/PaymentResponse.php new file mode 100644 index 0000000..92f0172 --- /dev/null +++ b/src/Response/PaymentResponse.php @@ -0,0 +1,64 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Response; + + +use BridgeSDK\Model\AbstractModel; +use BridgeSDK\Model\ArrayCollection; +use BridgeSDK\Model\Error; +use BridgeSDK\Model\Payment\Payment; +use BridgeSDK\Model\Payment\PaymentErrors; +use InvalidArgumentException; + +class PaymentResponse extends AbstractResponse +{ + /** + * Get body + * + * @return AbstractModel|ArrayCollection + */ + public function getModel() + { + $content = (string) $this->stream; + if (empty($content) === true) { + return new ArrayCollection(); + } + $output = json_decode($content, true); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new InvalidArgumentException( + 'json_decode error: ' . json_last_error_msg() + ); + } + if (empty($output) === true) { + return new Payment(); + } + + if ($this->getStatusCode() == 404) { + $errors = (new PaymentErrors())->hydrate($output); + if (!is_null($errors)) { + return $errors; + } + + return (new Error())->hydrate($output); + } + + if ($this->getStatusCode() < 200 || $this->getStatusCode() > 299) { + return (new Error())->hydrate($output); + } + + return (new Payment())->hydrate($output); + } +} \ No newline at end of file diff --git a/tests/Integration/Request/BankRequestTest.php b/tests/Integration/Request/BankRequestTest.php index 4db8a60..450c560 100644 --- a/tests/Integration/Request/BankRequestTest.php +++ b/tests/Integration/Request/BankRequestTest.php @@ -16,7 +16,7 @@ namespace Tests\Integration\Request; use BridgeSDK\Client; -use BridgeSDK\Model\Bank; +use BridgeSDK\Model\Bank\Bank; use BridgeSDK\Model\Error; use BridgeSDK\Request\BankRequest; use Tests\Integration\IntegrationTestCase; diff --git a/tests/Integration/Request/CreatePaymentRequestTest.php b/tests/Integration/Request/CreatePaymentRequestTest.php new file mode 100644 index 0000000..1a0f322 --- /dev/null +++ b/tests/Integration/Request/CreatePaymentRequestTest.php @@ -0,0 +1,127 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace Integration\Request; + +use BridgeSDK\Client; +use BridgeSDK\Model\Error; +use BridgeSDK\Model\Payment\CreatePayment; +use BridgeSDK\Model\Payment\CreatePaymentTransaction; +use BridgeSDK\Model\Payment\CreatePaymentUrl; +use BridgeSDK\Model\Payment\PaymentErrors; +use BridgeSDK\Model\Payment\PaymentUser; +use BridgeSDK\Request\CreatePaymentRequest; +use Tests\Integration\IntegrationTestCase; + +class CreatePaymentRequestTest extends IntegrationTestCase +{ + public function testApiCallCreatePaymentOk() + { + $body = $this->getValidBody(); + + $request = (new CreatePaymentRequest()) + ->setModel($body); + $client = new Client(); + $response = $client->setCredentials($this->clientId, $this->clientSecret) + ->sendRequest($request); + $model = $response->getModel(); + + $this->assertInstanceOf(CreatePaymentUrl::class, $model); + $this->assertEquals(200, $response->getStatusCode()); + } + + /** + * @dataProvider getApiCallCreatePaymentErrorDataProvider + * @return void + */ + public function testApiCallCreatePaymentError($clientId, $clientSecret, $version, $expectedErrorType) + { + $body = $this->getValidBody(); + $request = (new CreatePaymentRequest()) + ->setModel($body); + $client = new Client(); + $response = $client->setCredentials($clientId, $clientSecret) + ->setVersion($version) + ->sendRequest($request); + $model = $response->getModel(); + + $this->assertInstanceOf(Error::class, $model); + $this->assertEquals($expectedErrorType, $model->getType()); + } + + /** + * @dataProvider getApiCallCreatePaymentPaymentErrorDataProvider + * @param $bankId + * @param $error + * @return void + */ + public function testApiCallCreatePaymentPaymentError($bankId, $error) + { + $body = $this->getValidBody(); + $body->setBankId($bankId); + + $request = (new CreatePaymentRequest()) + ->setModel($body); + $client = new Client(); + $response = $client->setCredentials($this->clientId, $this->clientSecret) + ->sendRequest($request); + $model = $response->getModel(); + + $this->assertInstanceOf(PaymentErrors::class, $model); + $this->assertNotEmpty($model->getErrors()); + $this->assertEquals($error, $model->getErrors()[0]->getCode()); + } + + public function getApiCallCreatePaymentErrorDataProvider() + { + return [ + ['test', $this->clientSecret, $this->version, 'invalid_client_credentials'], + [$this->clientId, 'test', $this->version, 'invalid_client_credentials'], + [$this->clientSecret, $this->clientId, $this->version, 'invalid_client_credentials'], + [$this->clientId, $this->clientSecret, 'test', 'invalid_version_header'], + ]; + } + + public function getApiCallCreatePaymentPaymentErrorDataProvider() + { + return [ + [14, 'bank.unsupported_operation'], + [22213, 'payment.bank_not_found'], + ]; + } + + protected function getValidBody() + { + return (new CreatePayment()) + ->setBankId(6) + ->setSuccessfulCallbackUrl('http://prestashop171.denys.tot/?success') + ->setUnsuccessfulCallbackUrl('http://prestashop171.denys.tot/?error') + ->setTransactions([ + (new CreatePaymentTransaction()) + ->setCurrency('EUR') + ->setLabel('Label Unit test') + ->setAmount(10.50) + ->setClientReference('unit_test') + ->setEndToEndId('unit_test') + ]) + ->setUser( + (new PaymentUser()) + ->setFirstName('Unit') + ->setLastName('Test') + ->setExternalReference('unit_test') + ->setIpAddress('192.168.1.1') + ); + } +} diff --git a/tests/Integration/Request/ListBanksRequestTest.php b/tests/Integration/Request/ListBanksRequestTest.php index 124c244..17622a6 100644 --- a/tests/Integration/Request/ListBanksRequestTest.php +++ b/tests/Integration/Request/ListBanksRequestTest.php @@ -17,7 +17,7 @@ use BridgeSDK\Client; use BridgeSDK\Model\Error; -use BridgeSDK\Model\ListBanks; +use BridgeSDK\Model\Bank\ListBanks; use BridgeSDK\Request\ListBanksRequest; use Tests\Integration\IntegrationTestCase; diff --git a/tests/Integration/Request/PaymentRequestTest.php b/tests/Integration/Request/PaymentRequestTest.php new file mode 100644 index 0000000..34a45ba --- /dev/null +++ b/tests/Integration/Request/PaymentRequestTest.php @@ -0,0 +1,61 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace Integration\Request; + +use BridgeSDK\Client; +use BridgeSDK\Constant\PaymentStatuses; +use BridgeSDK\Model\Payment\Payment; +use BridgeSDK\Request\PaymentRequest; +use Tests\Integration\IntegrationTestCase; + +class PaymentRequestTest extends IntegrationTestCase +{ + /** + * @dataProvider getApiCallPaymentOkDataProvider + * @param $id + * @param $status + * @param $bankId + * @return void + */ + public function testApiCallPaymentOk($id, $status, $bankId, $amount) + { + $request = (new PaymentRequest()) + ->setModel((new Payment()) + ->setId($id) + ); + $client = new Client(); + $response = $client->setCredentials($this->clientId, $this->clientSecret) + ->sendRequest($request); + + $model = $response->getModel(); + + $this->assertInstanceOf(Payment::class, $model); + $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals($id, $model->getId()); + $this->assertEquals($status, $model->getStatus()); + $this->assertEquals($bankId, $model->getBankId()); + $this->assertEquals($amount, $model->getTransactions()[0]->getAmount()); + } + + public function getApiCallPaymentOkDataProvider() + { + return [ + ['e815420d4b414a9c8b007c57196c19b5', PaymentStatuses::REJECTED_PAYMENTS[1], 6, 10.5], + ['bf80034b41764d88b0bb4eef9017e6bb', PaymentStatuses::REJECTED_PAYMENTS[1], 6, 10.5], + ['2dd3d0b2abe443b98f0e6a2763c37bca', PaymentStatuses::REJECTED_PAYMENTS[1], 17, 12], + ]; + } +} diff --git a/tests/phpunit.xml b/tests/phpunit.xml index 3cce602..81f8fe8 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -2,17 +2,24 @@ + backupGlobals="false" + colors="true" + verbose="true" + convertNoticesToExceptions="false" + bootstrap="phpunit_bootstrap.php"> - - - + tests + + + ../src + + \ No newline at end of file From d53a37a65dbdd59f54552d13aaf38b0b5d79e8fa Mon Sep 17 00:00:00 2001 From: Denys Date: Fri, 5 Aug 2022 09:52:21 +0200 Subject: [PATCH 07/21] Some tests, fixes, new methods; refs #35898 --- .github/workflows/main.yml | 6 +- .github/workflows/phpunit.yml | 2 +- .gitignore | 0 .php_cs.dist.php => .php-cs-fixer.dist.php | 32 +- README.md | 560 ++++-------------- composer.json | 0 phpstan.neon.dist | 4 +- src/Client.php | 318 +++++----- src/Constant/BankCapability.php | 12 +- src/Constant/PaymentStatuses.php | 45 +- src/Constant/WebhookIP.php | 30 + src/Exception/RequestException.php | 18 +- src/Logger/NullLogger.php | 20 +- src/Model/AbstractModel.php | 31 +- src/Model/ArrayCollection.php | 4 +- src/Model/Bank/Bank.php | 114 ++-- src/Model/Bank/ListBanks.php | 45 +- src/Model/Callback.php | 196 ------ src/Model/Error.php | 38 +- src/Model/Payment/CreatePayment.php | 31 +- .../Payment/CreatePaymentTransaction.php | 32 +- src/Model/Payment/CreatePaymentUrl.php | 14 +- src/Model/Payment/Payment.php | 58 +- src/Model/Payment/PaymentError.php | 14 +- src/Model/Payment/PaymentErrors.php | 6 +- src/Model/Payment/PaymentUser.php | 26 +- src/Model/Payment/PaymentWebhook.php | 98 +++ .../PaymentWebhookTransactionUpdated.php | 240 ++++++++ src/Model/Payment/Transaction.php | 15 +- src/Request/AbstractRequest.php | 43 +- src/Request/BankRequest.php | 8 +- src/Request/CreatePaymentRequest.php | 4 +- src/Request/ListBanksRequest.php | 11 +- src/Request/MessageTrait.php | 49 +- src/Request/PaymentRequest.php | 5 +- src/Request/RequestTrait.php | 12 +- src/Response/AbstractResponse.php | 93 +-- src/Response/BankResponse.php | 10 +- src/Response/CallbackResponse.php | 65 -- src/Response/CreatePaymentResponse.php | 14 +- src/Response/DefaultResponse.php | 11 +- src/Response/ErrorResponse.php | 4 +- src/Response/ListBanksResponse.php | 10 +- src/Response/PaymentResponse.php | 19 +- src/Response/ResponseBuilder.php | 56 +- src/Response/WebhookResponse.php | 47 ++ src/Service/AbstractClientApiService.php | 34 +- src/Service/ClientApiService.php | 137 +---- src/Stream.php | 149 +++-- src/Uri/AbstractUri.php | 111 ++-- src/Uri/ApiUri.php | 6 +- tests/Integration/IntegrationTestCase.php | 0 ...est.php => BankRequestIntegrationTest.php} | 2 +- ...> CreatePaymentRequestIntegrationTest.php} | 4 +- ...hp => ListBanksRequestIntegrationTest.php} | 4 +- ....php => PaymentRequestIntegrationTest.php} | 4 +- tests/Request/BankRequestTest.php | 99 ++++ tests/Request/CreatePaymentRequestTest.php | 143 +++++ tests/Request/ListBanksRequestTest.php | 77 +++ tests/Request/PaymentRequestTest.php | 66 +++ tests/phpunit.xml | 2 + tests/phpunit_bootstrap.php | 0 62 files changed, 1806 insertions(+), 1502 deletions(-) mode change 100644 => 100755 .github/workflows/main.yml mode change 100644 => 100755 .github/workflows/phpunit.yml mode change 100644 => 100755 .gitignore rename .php_cs.dist.php => .php-cs-fixer.dist.php (70%) mode change 100644 => 100755 mode change 100644 => 100755 README.md mode change 100644 => 100755 composer.json mode change 100644 => 100755 src/Client.php mode change 100644 => 100755 src/Constant/BankCapability.php mode change 100644 => 100755 src/Constant/PaymentStatuses.php create mode 100755 src/Constant/WebhookIP.php mode change 100644 => 100755 src/Exception/RequestException.php mode change 100644 => 100755 src/Logger/NullLogger.php mode change 100644 => 100755 src/Model/AbstractModel.php mode change 100644 => 100755 src/Model/ArrayCollection.php mode change 100644 => 100755 src/Model/Bank/Bank.php mode change 100644 => 100755 src/Model/Bank/ListBanks.php delete mode 100644 src/Model/Callback.php mode change 100644 => 100755 src/Model/Error.php mode change 100644 => 100755 src/Model/Payment/CreatePayment.php mode change 100644 => 100755 src/Model/Payment/CreatePaymentTransaction.php mode change 100644 => 100755 src/Model/Payment/CreatePaymentUrl.php mode change 100644 => 100755 src/Model/Payment/Payment.php mode change 100644 => 100755 src/Model/Payment/PaymentError.php mode change 100644 => 100755 src/Model/Payment/PaymentErrors.php mode change 100644 => 100755 src/Model/Payment/PaymentUser.php create mode 100755 src/Model/Payment/PaymentWebhook.php create mode 100755 src/Model/Payment/PaymentWebhookTransactionUpdated.php mode change 100644 => 100755 src/Model/Payment/Transaction.php mode change 100644 => 100755 src/Request/AbstractRequest.php mode change 100644 => 100755 src/Request/BankRequest.php mode change 100644 => 100755 src/Request/CreatePaymentRequest.php mode change 100644 => 100755 src/Request/ListBanksRequest.php mode change 100644 => 100755 src/Request/MessageTrait.php mode change 100644 => 100755 src/Request/PaymentRequest.php mode change 100644 => 100755 src/Request/RequestTrait.php mode change 100644 => 100755 src/Response/AbstractResponse.php mode change 100644 => 100755 src/Response/BankResponse.php delete mode 100644 src/Response/CallbackResponse.php mode change 100644 => 100755 src/Response/CreatePaymentResponse.php mode change 100644 => 100755 src/Response/DefaultResponse.php mode change 100644 => 100755 src/Response/ErrorResponse.php mode change 100644 => 100755 src/Response/ListBanksResponse.php mode change 100644 => 100755 src/Response/PaymentResponse.php mode change 100644 => 100755 src/Response/ResponseBuilder.php create mode 100755 src/Response/WebhookResponse.php mode change 100644 => 100755 src/Service/AbstractClientApiService.php mode change 100644 => 100755 src/Service/ClientApiService.php mode change 100644 => 100755 src/Stream.php mode change 100644 => 100755 src/Uri/AbstractUri.php mode change 100644 => 100755 src/Uri/ApiUri.php mode change 100644 => 100755 tests/Integration/IntegrationTestCase.php rename tests/Integration/Request/{BankRequestTest.php => BankRequestIntegrationTest.php} (97%) mode change 100644 => 100755 rename tests/Integration/Request/{CreatePaymentRequestTest.php => CreatePaymentRequestIntegrationTest.php} (97%) mode change 100644 => 100755 rename tests/Integration/Request/{ListBanksRequestTest.php => ListBanksRequestIntegrationTest.php} (95%) mode change 100644 => 100755 rename tests/Integration/Request/{PaymentRequestTest.php => PaymentRequestIntegrationTest.php} (94%) mode change 100644 => 100755 create mode 100755 tests/Request/BankRequestTest.php create mode 100755 tests/Request/CreatePaymentRequestTest.php create mode 100755 tests/Request/ListBanksRequestTest.php create mode 100755 tests/Request/PaymentRequestTest.php mode change 100644 => 100755 tests/phpunit.xml mode change 100644 => 100755 tests/phpunit_bootstrap.php diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml old mode 100644 new mode 100755 index 6f24676..79753a6 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,17 +12,17 @@ jobs: - name: PHP syntax checker 5.6 uses: prestashop/github-action-php-lint/5.6@master with: - folder-to-exclude: "! -path \"./.php_cs.dist.php\" ! -path \"./tests/*\" ! -path \"./vendor/*\"" + folder-to-exclude: "! -path \"./.php-cs-fixer.dist.php\" ! -path \"./tests/*\" ! -path \"./vendor/*\"" - name: PHP syntax checker 7.4 uses: prestashop/github-action-php-lint/7.4@master with: - folder-to-exclude: "! -path \"./.php_cs.dist.php\" ! -path \"./tests/*\" ! -path \"./vendor/*\"" + folder-to-exclude: "! -path \"./.php-cs-fixer.dist.php\" ! -path \"./tests/*\" ! -path \"./vendor/*\"" - name: PHP syntax checker 8.1 uses: prestashop/github-action-php-lint/8.1@master with: - folder-to-exclude: "! -path \"./.php_cs.dist.php\" ! -path \"./tests/*\" ! -path \"./vendor/*\"" + folder-to-exclude: "! -path \"./.php-cs-fixer.dist.php\" ! -path \"./tests/*\" ! -path \"./vendor/*\"" # Check the PHP code follow the coding standards php-cs-fixer-and-phpstan: diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml old mode 100644 new mode 100755 index caf9107..502d27c --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -30,5 +30,5 @@ jobs: env: BRIDGE_CLIENT_ID: ${{ secrets.BRIDGE_CLIENT_ID }} BRIDGE_CLIENT_SECRET: ${{ secrets.BRIDGE_CLIENT_SECRET }} - BRIDGE_INTEGRATION_TEST: 0 + BRIDGE_INTEGRATION_TEST: 1 run: ./vendor/bin/phpunit . diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.php_cs.dist.php b/.php-cs-fixer.dist.php old mode 100644 new mode 100755 similarity index 70% rename from .php_cs.dist.php rename to .php-cs-fixer.dist.php index 52c5774..de366f5 --- a/.php_cs.dist.php +++ b/.php-cs-fixer.dist.php @@ -12,28 +12,24 @@ */ $header = <<<'EOF' - NOTICE OF LICENSE +NOTICE OF LICENSE - This source file is subject to the Open Software License (OSL 3.0) - PHP version 5.6+ +This source file is subject to the Open Software License (OSL 3.0) +PHP version 5.6+ - @category BridgeSDK - @package Ecommercebridgesdk - @author 202-ecommerce - @copyright 2022 (c) 202-ecommerce - @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) - @link https://docs.bridgeapi.io/ - EOF; +@category BridgeSDK +@package Ecommercebridgesdk +@author 202-ecommerce +@copyright 2022 (c) 202-ecommerce +@license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) +@link https://docs.bridgeapi.io/ +EOF; $finder = PhpCsFixer\Finder::create() ->ignoreDotFiles(false) ->ignoreVCSIgnored(true) - ->exclude('tests/Fixtures') + ->exclude(['tests']) ->in(__DIR__) - ->append([ - __DIR__.'/dev-tools/doc.php', - // __DIR__.'/php-cs-fixer', disabled, as we want to be able to run bootstrap file even on lower PHP version, to show nice message - ]) ; $config = new PhpCsFixer\Config(); @@ -46,10 +42,14 @@ '@PhpCsFixer' => true, '@PhpCsFixer:risky' => true, 'general_phpdoc_annotation_remove' => ['annotations' => ['expectedDeprecation']], // one should use PHPUnit built-in method instead - 'header_comment' => ['header' => $header], + 'header_comment' => ['header' => $header, 'separate' => 'bottom', 'comment_type' => 'PHPDoc'], 'heredoc_indentation' => false, // TODO switch on when # of PR's is lower 'modernize_strpos' => true, // needs PHP 8+ or polyfill 'use_arrow_functions' => false, // TODO switch on when # of PR's is lower + 'visibility_required' => ['elements' => ['property', 'method']], + 'declare_strict_types' => false, + 'void_return' => false, + 'phpdoc_no_empty_return' => false, ]) ->setFinder($finder) ; diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 9c05fb8..e885c50 --- a/README.md +++ b/README.md @@ -1,12 +1,10 @@ -# Younited Pay SDK for PHP +# Bridge SDK for PHP +[![Coding Standart](https://github.com/202ecommerce/bridgesdk/actions/workflows/main.yml/badge.svg)](https://github.com/202ecommerce/bridgesdk/actions/workflows/main.yml) [![Unit test](https://github.com/202ecommerce/bridgesdk/actions/workflows/phpunit.yml/badge.svg)](https://github.com/202ecommerce/bridgesdk/actions/workflows/phpunit.yml) -[![Coding Standart](https://github.com/202ecommerce/bridgesdk/actions/workflows/main.yml/badge.svg)](https://github.com/202ecommerce/younitedpaysdk/actions/workflows/main.yml) [![Unit test](https://github.com/202ecommerce/younitedpaysdk/actions/workflows/phpunit.yml/badge.svg)](https://github.com/202ecommerce/younitedpaysdk/actions/workflows/phpunit.yml) - -This package is a Younited Pay PHP SDK. It let you mange exchange between your shop and Younited Pay. - -This package is a dependancy of Younited Credit PrestaShop or Magento plugin. +This package is a Bridge PHP SDK. It let you manage exchange between your shop and Bridge. +This package is a dependency for Bridge PrestaShop module or Magento plugin. ## Versions scope @@ -16,43 +14,40 @@ This package is compatible with PHP 5.6+. Todo: Composer via packagist +To use this package with php 5.6 or in production mode, please install this dependency with : -To use this package with php 5.6 or in production mode, please install this dependancy with : ``` composer update --ignore-platform-reqs --no-dev ``` -in a eveloppement environment +in a development environment + ``` composer update ``` ## How to try this SDK ? -### Get Younited Pay eligible offers, per maturities +### Get List of Banks -[Best Price documentation][bestprice-doc] +[List of banks documentation][list-banks-doc] -You can easily get list of offer by creating a request +You can easily get list of banks by creating a request ```php require 'vendor/autoload.php'; -use YounitedPaySDK\Client; -use YounitedPaySDK\Request\BestPriceRequest; -use YounitedPaySDK\Model\BestPrice; +use BridgeSDK\Client; +use BridgeSDK\Model\Bank\ListBanks; +use BridgeSDK\Request\ListBanksRequest; $clientId = 'your-client-id'; $clientSecret = 'your-secret-idtoken'; -$body = (new BestPrice()) - ->setBorrowedAmount(149.0); - -$request = (new BestPriceRequest()) - ->enableSandbox() - ->setModel($body); - +$request = new ListBanksRequest(); $client = new Client(); +$model = $response->getModel(); + try { $response = $client->setCredential($clientId, $clientSecret) ->sendRequest($request); @@ -60,7 +55,7 @@ try { var_dump($response->getModel()); echo ''; } catch (Exception $e) { - echo ($e->getMessage() . $e->getFile() . ':' . $e->getLine(). $e->getTraceAsString()); + echo ($e->getMessage() . $e->getFile() . ':' . $e->getLine() . $e->getTraceAsString()); } ``` @@ -69,98 +64,43 @@ You can also use the client api service to get list of offer ```php require 'vendor/autoload.php'; -use YounitedPaySDK\Client; -use YounitedPaySDK\Service\ClientApiService; +use BridgeSDK\Client; +use BridgeSDK\Service\ClientApiService; $clientId = 'your-client-id'; $clientSecret = 'your-secret-idtoken'; - -$borrowedAmount = 149.0; - + $client = (new Client()) ->setCredential($clientId, $clientSecret); $response = (new ClientApiService($client)) - ->enableTest() - ->getBestPrice($borrowedAmount); + ->getListBanks(); ``` -### Get Available Maturities +### Get Bank by ID -[Get available maturities documentation][maturities-doc] +[Get bank by ID documentation][bank-doc] -You can easily get available maturities by creating a request +You can easily get a bank by ID by creating a request ```php require 'vendor/autoload.php'; -use YounitedPaySDK\Client; -use YounitedPaySDK\Request\LoadContractRequest; -use YounitedPaySDK\Model\LoadContract; +use BridgeSDK\Client; +use BridgeSDK\Model\Bank\Bank; +use BridgeSDK\Request\BankRequest; $clientId = 'your-client-id'; $clientSecret = 'your-secret-idtoken'; +$id = 'bank-id'; -$request = (new LoadContractRequest()) - ->enableSandbox() - +$request = (new BankRequest()) + ->setModel((new Bank()) + ->setId($id) + ); $client = new Client(); -try { - $response = $client->setCredential($clientId, $clientSecret) - ->sendRequest($request); - echo '
';
-    var_dump($response->getModel());
-    echo '
'; -} catch (Exception $e) { - echo ($e->getMessage() . $e->getFile() . ':' . $e->getLine(). $e->getTraceAsString()); -} -``` - -You can also use the client api service to get available maturities - -```php -require 'vendor/autoload.php'; - -use YounitedPaySDK\Client; -use YounitedPaySDK\Service\ClientApiService; - -$clientId = 'your-client-id'; -$clientSecret = 'your-secret-idtoken'; - -$contractReference = 'contract-reference'; - -$client = (new Client()) - ->setCredential($clientId, $clientSecret); - -$response = (new ClientApiService($client)) - ->enableTest() - ->getAvailableMaturities(); -``` - -### Load Contract - -[Load a contract documentation][contract-doc] - -You can easily load a contract by creating a request - -```php -require 'vendor/autoload.php'; - -use YounitedPaySDK\Client; -use YounitedPaySDK\Request\LoadContractRequest; -use YounitedPaySDK\Model\LoadContract; - -$clientId = 'your-client-id'; -$clientSecret = 'your-secret-idtoken'; +$model = $response->getModel(); -$body = (new LoadContract()) - ->setContractReference('contract-ref'); - -$request = (new LoadContractRequest()) - ->enableSandbox() - ->setModel($body); - -$client = new Client(); try { $response = $client->setCredential($clientId, $clientSecret) ->sendRequest($request); @@ -168,218 +108,53 @@ try { var_dump($response->getModel()); echo ''; } catch (Exception $e) { - echo ($e->getMessage() . $e->getFile() . ':' . $e->getLine(). $e->getTraceAsString()); + echo ($e->getMessage() . $e->getFile() . ':' . $e->getLine() . $e->getTraceAsString()); } ``` -You can also use the client api service to load a contract +You can also use the client api service to get list of offer ```php require 'vendor/autoload.php'; -use YounitedPaySDK\Client; -use YounitedPaySDK\Service\ClientApiService; +use BridgeSDK\Client; +use BridgeSDK\Service\ClientApiService; $clientId = 'your-client-id'; $clientSecret = 'your-secret-idtoken'; +$id = 'bank-id'; -$contractReference = 'contract-reference'; - $client = (new Client()) ->setCredential($clientId, $clientSecret); $response = (new ClientApiService($client)) - ->enableTest() - ->loadContract($contractReference); + ->getBankById($id); ``` -### Initialize a contract +### Get Payment by ID -[Initialize a contract documentation][initialize-doc] +[Get payment by ID documentation][payment-doc] -You can easily initialize a contract by creating a request +You can easily get a payment by ID by creating a request ```php require 'vendor/autoload.php'; -use YounitedPaySDK\Client; -use YounitedPaySDK\Request\InitializeContractRequest; -use YounitedPaySDK\Model\Address; -use YounitedPaySDK\Model\PersonalInformation; -use YounitedPaySDK\Model\BasketItem; -use YounitedPaySDK\Model\Basket; -use YounitedPaySDK\Model\MerchantUrls; -use YounitedPaySDK\Model\MerchantOrderContext; -use YounitedPaySDK\Model\InitializeContract; +use BridgeSDK\Client; +use BridgeSDK\Model\Payment\Payment; +use BridgeSDK\Request\PaymentRequest; $clientId = 'your-client-id'; $clientSecret = 'your-secret-idtoken'; +$id = 'payment-id'; -$datetime = new \DateTime('1970-01-01T00:00:00'); - -$address = (new Address()) - ->setStreetNumber('123') - ->setStreetName('StreetName') - ->setAdditionalAddress('') - ->setCity('Country') - ->setPostalCode('12345') - ->setCountryCode('FR'); - -$personalInformation = (new PersonalInformation()) - ->setFirstName('FirstName') - ->setLastName('LastName') - ->setGenderCode('MALE') - ->setEmailAddress('firstname.lastname@mail.com') - ->setCellPhoneNumber('33611223344') - ->setBirthDate($datetime) - ->setAddress($address); - -$basketItem1 = (new BasketItem()) - ->setItemName('Item basket 1') - ->setQuantity(2) - ->setUnitPrice(45.0); - -$basketItem2 = (new BasketItem()) - ->setItemName('Item basket 2') - ->setQuantity(1) - ->setUnitPrice(33.0); - -$basket = (new Basket()) - ->setBasketAmount(123.0) - ->setItems([$basketItem1, $basketItem2]); - -$merchantUrls = (new MerchantUrls()) - ->setOnApplicationFailedRedirectUrl('on-application-failed-redirect-url.com') - ->setOnApplicationSucceededRedirectUrl('on-application-succeeded-redirect-url.com') - ->setOnCanceledWebhookUrl('on-canceled-webhook-url.com') - ->setOnWithdrawnWebhookUrl('on-withdrawn-webhook-url.com'); - -$merchantOrderContext = (new MerchantOrderContext()) - ->setChannel('test') - ->setShopCode('TEST') - ->setMerchantReference('MerchantReference') - ->setAgentEmailAddress('merchant@mail.com'); - -$body = (new InitializeContract()) - ->setRequestedMaturity(10) - ->setPersonalInformation($personalInformation) - ->setBasket($basket) - ->setMerchantUrls($merchantUrls) - ->setMerchantOrderContext($merchantOrderContext); - -$request = (new InitializeContractRequest()) - ->enableSandbox() - ->setModel($body); - +$request = (new PaymentRequest()) + ->setModel((new Payment()) + ->setId($id) + ); $client = new Client(); -try { - $response = $client->setCredential($clientId, $clientSecret) - ->sendRequest($request); - echo '
';
-    var_dump($response->getModel());
-    echo '
'; -} catch (Exception $e) { - echo ($e->getMessage() . $e->getFile() . ':' . $e->getLine(). $e->getTraceAsString()); -} -``` - -You can also use the client api service to initialize a contract - -```php -require 'vendor/autoload.php'; - -use YounitedPaySDK\Client; -use YounitedPaySDK\Model\Address; -use YounitedPaySDK\Model\PersonalInformation; -use YounitedPaySDK\Model\BasketItem; -use YounitedPaySDK\Model\Basket; -use YounitedPaySDK\Model\MerchantUrls; -use YounitedPaySDK\Model\MerchantOrderContext; -use YounitedPaySDK\Service\ClientApiService; - -$clientId = 'your-client-id'; -$clientSecret = 'your-secret-idtoken'; - -$requestedMaturity = 10; - -$datetime = new \DateTime('1970-01-01T00:00:00'); - -$address = (new Address()) - ->setStreetNumber('123') - ->setStreetName('StreetName') - ->setAdditionalAddress('') - ->setCity('Country') - ->setPostalCode('12345') - ->setCountryCode('FR'); - -$personalInformation = (new PersonalInformation()) - ->setFirstName('FirstName') - ->setLastName('LastName') - ->setGenderCode('MALE') - ->setEmailAddress('firstname.lastname@mail.com') - ->setCellPhoneNumber('33611223344') - ->setBirthDate($datetime) - ->setAddress($address); - -$basketItem1 = (new BasketItem()) - ->setItemName('Item basket 1') - ->setQuantity(2) - ->setUnitPrice(45.0); - -$basketItem2 = (new BasketItem()) - ->setItemName('Item basket 2') - ->setQuantity(1) - ->setUnitPrice(33.0); - -$basket = (new Basket()) - ->setBasketAmount(123.0) - ->setItems([$basketItem1, $basketItem2]); - -$merchantUrls = (new MerchantUrls()) - ->setOnApplicationFailedRedirectUrl('on-application-failed-redirect-url.com') - ->setOnApplicationSucceededRedirectUrl('on-application-succeeded-redirect-url.com') - ->setOnCanceledWebhookUrl('on-canceled-webhook-url.com') - ->setOnWithdrawnWebhookUrl('on-withdrawn-webhook-url.com'); - -$merchantOrderContext = (new MerchantOrderContext()) - ->setChannel('test') - ->setShopCode('TEST') - ->setMerchantReference('MerchantReference') - ->setAgentEmailAddress('merchant@mail.com'); - -$client = (new Client()) - ->setCredential($clientId, $clientSecret); - -$response = (new ClientApiService($client)) - ->enableTest() - ->initializeContract($requestMaturity, $personalInformation, $basket, $merchantUrls, $merchantOrderContext); -``` - -### Confirm Contract - -[Confirm a contract documentation][confirm-doc] - -You can easily confirm a contract by creating a request - -```php -require 'vendor/autoload.php'; - -use YounitedPaySDK\Client; -use YounitedPaySDK\Request\ConfirmContractRequest; -use YounitedPaySDK\Model\ConfirmContract; +$model = $response->getModel(); -$clientId = 'your-client-id'; -$clientSecret = 'your-secret-idtoken'; - -$body = (new ConfirmContract()) - ->setContractReference('contract-ref') - ->setMerchantOrderId('order-id'); - -$request = (new ConfirmContractRequest()) - ->enableSandbox() - ->setModel($body); - -$client = new Client(); try { $response = $client->setCredential($clientId, $clientSecret) ->sendRequest($request); @@ -387,113 +162,72 @@ try { var_dump($response->getModel()); echo ''; } catch (Exception $e) { - echo ($e->getMessage() . $e->getFile() . ':' . $e->getLine(). $e->getTraceAsString()); + echo ($e->getMessage() . $e->getFile() . ':' . $e->getLine() . $e->getTraceAsString()); } ``` -You can also use the client api service to confirm a contract +You can also use the client api service to get list of offer ```php require 'vendor/autoload.php'; -use YounitedPaySDK\Client; -use YounitedPaySDK\Service\ClientApiService; +use BridgeSDK\Client; +use BridgeSDK\Service\ClientApiService; $clientId = 'your-client-id'; $clientSecret = 'your-secret-idtoken'; +$id = 'payment-id'; -$contractReference = 'contract-reference'; -$merchantOrderId = 'merchant-order_id'; - $client = (new Client()) ->setCredential($clientId, $clientSecret); $response = (new ClientApiService($client)) - ->enableTest() - ->confirmContract($contractReference, $merchantOrderId = null); + ->getPayment($id); ``` -### Activate Contract +### Create Payment -[Activate a contract documentation][activate-doc] +[Create payment documentation][create-payment-doc] -You can easily activate a contract by creating a request +You can easily get create a payment by creating a request ```php require 'vendor/autoload.php'; -use YounitedPaySDK\Client; -use YounitedPaySDK\Request\ActivateContractRequest; -use YounitedPaySDK\Model\ActivateContract; +use BridgeSDK\Client; +use BridgeSDK\Model\Payment\CreatePayment; +use BridgeSDK\Model\Payment\CreatePaymentTransaction; +use BridgeSDK\Model\Payment\PaymentUser; +use BridgeSDK\Request\CreatePaymentRequest; $clientId = 'your-client-id'; $clientSecret = 'your-secret-idtoken'; -$body = (new ActivateContract()) - ->setContractReference('contract-ref'); - -$request = (new ActivateContractRequest()) - ->enableSandbox() - ->setModel($body); - +$body = (new CreatePayment()) + ->setBankId(6) + ->setSuccessfulCallbackUrl('http://test.tot/?success') + ->setUnsuccessfulCallbackUrl('http://test.tot/?error') + ->setTransactions([ + (new CreatePaymentTransaction()) + ->setCurrency('EUR') + ->setLabel('Label Unit test') + ->setAmount(10.50) + ->setClientReference('unit_test') + ->setEndToEndId('unit_test') + ]) + ->setUser( + (new PaymentUser()) + ->setFirstName('Unit') + ->setLastName('Test') + ->setExternalReference('unit_test') + ->setIpAddress('192.168.1.1') + ); + +$request = (new CreatePaymentRequest()) + ->setModel($body); $client = new Client(); -try { - $response = $client->setCredential($clientId, $clientSecret) - ->sendRequest($request); - echo '
';
-    var_dump($response->getModel());
-    echo '
'; -} catch (Exception $e) { - echo ($e->getMessage() . $e->getFile() . ':' . $e->getLine(). $e->getTraceAsString()); -} -``` - -You can also use the client api service to activate a contract - -```php -require 'vendor/autoload.php'; - -use YounitedPaySDK\Client; -use YounitedPaySDK\Service\ClientApiService; - -$clientId = 'your-client-id'; -$clientSecret = 'your-secret-idtoken'; - -$contractReference = 'contract-reference'; - -$client = (new Client()) - ->setCredential($clientId, $clientSecret); - -$response = (new ClientApiService($client)) - ->enableTest() - ->activateContract($contractReference); -``` - -### Withdraw Contract - -[Withdraw a contract documentation][withdraw-doc] - -You can easily withdraw a contract by creating a request - -```php -require 'vendor/autoload.php'; - -use YounitedPaySDK\Client; -use YounitedPaySDK\Request\WithdrawContractRequest; -use YounitedPaySDK\Model\WithdrawContract; - -$clientId = 'your-client-id'; -$clientSecret = 'your-secret-idtoken'; - -$body = (new WithdrawContract()) - ->setContractReference('contract-ref') - ->setAmount(149.0); - -$request = (new WithdrawContractRequest()) - ->enableSandbox() - ->setModel($body); +$model = $response->getModel(); -$client = new Client(); try { $response = $client->setCredential($clientId, $clientSecret) ->sendRequest($request); @@ -501,111 +235,77 @@ try { var_dump($response->getModel()); echo ''; } catch (Exception $e) { - echo ($e->getMessage() . $e->getFile() . ':' . $e->getLine(). $e->getTraceAsString()); + echo ($e->getMessage() . $e->getFile() . ':' . $e->getLine() . $e->getTraceAsString()); } ``` -You can also use the client api service to withdraw a contract +You can also use the client api service to get list of offer ```php require 'vendor/autoload.php'; -use YounitedPaySDK\Client; -use YounitedPaySDK\Service\ClientApiService; +use BridgeSDK\Client; +use BridgeSDK\Model\Payment\CreatePayment; +use BridgeSDK\Model\Payment\CreatePaymentTransaction; +use BridgeSDK\Model\Payment\PaymentUser; +use BridgeSDK\Service\ClientApiService; $clientId = 'your-client-id'; $clientSecret = 'your-secret-idtoken'; +$body = (new CreatePayment()) + ->setBankId(6) + ->setSuccessfulCallbackUrl('http://test.tot/?success') + ->setUnsuccessfulCallbackUrl('http://test.tot/?error') + ->setTransactions([ + (new CreatePaymentTransaction()) + ->setCurrency('EUR') + ->setLabel('Label Unit test') + ->setAmount(10.50) + ->setClientReference('unit_test') + ->setEndToEndId('unit_test') + ]) + ->setUser( + (new PaymentUser()) + ->setFirstName('Unit') + ->setLastName('Test') + ->setExternalReference('unit_test') + ->setIpAddress('192.168.1.1') + ); -$contractReference = 'contract-reference'; -$amount = '149.0'; - $client = (new Client()) ->setCredential($clientId, $clientSecret); $response = (new ClientApiService($client)) - ->enableTest() - ->withdrawContract($contractReference, $amount); + ->createPayment($body); ``` -### Cancel Contract +### Get Webhook Response -[Cancel a contract documentation][cancel-doc] +[Get webhook documentation][webhooks] -You can easily cancel a contract by creating a request +You can easily subscribe to the webhook using this code. Webhook can come from next IPs: \BridgeSDK\Constant\WebhookIP. ```php require 'vendor/autoload.php'; - -use YounitedPaySDK\Client; -use YounitedPaySDK\Request\CancelContractRequest; -use YounitedPaySDK\Model\CancelContract; - -$clientId = 'your-client-id'; -$clientSecret = 'your-secret-idtoken'; - -$body = (new CancelContract()) - ->setContractReference('contract-ref'); - -$request = (new CancelContractRequest()) - ->enableSandbox() - ->setModel($body); - -$client = new Client(); + try { - $response = $client->setCredential($clientId, $clientSecret) - ->sendRequest($request); - echo '
';
-    var_dump($response->getModel());
-    echo '
'; + $client = new \BridgeSDK\Client(); + $response = $client->retrieveWebhookResponse(); + + $model = $response->getModel(); } catch (Exception $e) { - echo ($e->getMessage() . $e->getFile() . ':' . $e->getLine(). $e->getTraceAsString()); + // handle exception } -``` -You can also use the client api service to cancel a contract - -```php -require 'vendor/autoload.php'; - -use YounitedPaySDK\Client; -use YounitedPaySDK\Service\ClientApiService; - -$clientId = 'your-client-id'; -$clientSecret = 'your-secret-idtoken'; - -$contractReference = 'contract-reference'; - -$client = (new Client()) - ->setCredential($clientId, $clientSecret); - -$response = (new ClientApiService($client)) - ->enableTest() - ->cancelContract($contractReference); +// Do webhook process ``` -### Get Callback Response to configure Webhook - -[Get callback response documentation][callback-doc] - -You can easily get available maturities by creating a request +[bank-doc]: https://docs.bridgeapi.io/reference/show-a-bank -```php -require 'vendor/autoload.php'; +[list-banks-doc]: https://docs.bridgeapi.io/reference/list-banks -use YounitedPaySDK\Client; -use YounitedPaySDK\Service\ClientApiService; - -$response = (new Client())->retrieveCallbackResponse(); +[create-payment-doc]: https://docs.bridgeapi.io/reference/create-payment-request -// Do webhook process -``` +[payment-doc]: https://docs.bridgeapi.io/reference/get-payment-request -[bestprice-doc]: https://api.younited-pay.com/#tag/BestPrice/paths/~1api~11.0~1BestPrice/post -[maturities-doc]: https://api.younited-pay.com/#tag/Maturities/paths/~1api~11.0~1Maturities/get -[contract-doc]: https://api.younited-pay.com/#tag/Contract/paths/~1api~11.0~1Contract~1{contractReference}/get -[initialize-doc]: https://api.younited-pay.com/#tag/Contract/paths/~1api~11.0~1Contract/post -[confirm-doc]: https://api.younited-pay.com/#tag/Contract/paths/~1api~11.0~1Contract~1{contractReference}~1confirm/patch -[activate-doc]: https://api.younited-pay.com/#tag/Contract/paths/~1api~11.0~1Contract~1{contractReference}~1activate/patch -[withdraw-doc]: https://api.younited-pay.com/#tag/Contract/paths/~1api~11.0~1Contract~1{contractReference}~1withdraw/patch -[cancel-doc]: https://api.younited-pay.com/#tag/Contract/paths/~1api~11.0~1Contract~1{contractReference}/delete -[callback-doc]: https://api.younited-pay.com/#tag/Contract/paths/~1api~11.0~1Contract/post \ No newline at end of file +[webhooks]: https://docs.bridgeapi.io/docs/webhooks-events diff --git a/composer.json b/composer.json old mode 100644 new mode 100755 diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 62beccd..10cfcc3 100755 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -15,8 +15,7 @@ parameters: # Note that I have put my configuraiton file in the "./configuration" directory # if you have yours at the root of your project remove the "../" paths: - - ../src - - ../tests + - ./src # https://phpstan.org/config-reference#vague-typehints checkMissingIterableValueType: true @@ -27,6 +26,7 @@ parameters: # the use of this functions is intended. # @see https://phpstan.org/user-guide/ignoring-errors ignoreErrors: + - '#Property BridgeSDK\\Client::\$ch has unknown class CurlHandle as its type\.#' # - '#Should not use node with type "Expr_Exit", please change the code.#' # warnings for "die()" # - '#Should not use node with type "Stmt_Echo", please change the code.#' # warnings for "echo()" # - '#Should not use function "print_r", please change the code.#' # warnings for "print_r()" diff --git a/src/Client.php b/src/Client.php old mode 100644 new mode 100755 index 909cdde..c2e7905 --- a/src/Client.php +++ b/src/Client.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -17,9 +17,10 @@ use BridgeSDK\Exception\RequestException; use BridgeSDK\Request\AbstractRequest; -use BridgeSDK\Response\CallbackResponse; +use BridgeSDK\Response\AbstractResponse; use BridgeSDK\Response\DefaultResponse; use BridgeSDK\Response\ResponseBuilder; +use BridgeSDK\Response\WebhookResponse; use InvalidArgumentException; use Logger\NullLogger; use Psr\Http\Message\RequestInterface; @@ -29,58 +30,58 @@ use UnexpectedValueException; /** - * API client + * API client. */ class Client { /** - * @var string + * cURL handler. + * + * @var \CurlHandle|resource */ - private $clientId; + protected $ch; /** - * @var string + * cURL options array. + * + * @var array */ - private $clientSecret; + protected $options; /** - * @var string + * @var LoggerInterface */ - private $version = '2021-06-01'; + protected $logger; /** - * @var Stream + * Maximum request body size. + * + * @var int */ - private $stream; + protected static $MAX_BODY_SIZE; /** - * cURL handler - * - * @var resource|\CurlHandle + * @var string */ - protected $ch; + private $clientId; /** - * cURL options array - * - * @var array + * @var string */ - protected $options; + private $clientSecret; /** - * @var LoggerInterface + * @var string */ - protected $logger; + private $version = '2021-06-01'; /** - * Maximum request body size - * - * @var int + * @var Stream */ - protected static $MAX_BODY_SIZE; + private $stream; /** - * Create new cURL http client object + * Create new cURL http client object. */ public function __construct() { @@ -89,14 +90,13 @@ public function __construct() } /** - * Send a PSR-7 Request + * Send a PSR-7 Request. * - * @param AbstractRequest $request - * @return ResponseInterface + * @throws RequestException Invalid request + * @throws InvalidArgumentException Invalid header names and/or values + * @throws RuntimeException Failure to create stream * - * @throws RequestException Invalid request - * @throws InvalidArgumentException Invalid header names and/or values - * @throws RuntimeException Failure to create stream + * @return ResponseInterface */ public function sendRequest(AbstractRequest $request) { @@ -110,6 +110,12 @@ public function sendRequest(AbstractRequest $request) $request->setHeaders($headers); + $this->logger->info((string) $request->getBody(), [ + 'path' => $request->getUri()->getPath(), + 'query' => $request->getUri()->getQuery(), + 'type' => \get_class($request), + ]); + $response = $this->createResponse($request); $options = $this->createOptions($request, $response); $this->ch = curl_init(); @@ -124,36 +130,112 @@ public function sendRequest(AbstractRequest $request) switch (curl_errno($this->ch)) { case CURLE_OK: break; + case CURLE_COULDNT_RESOLVE_PROXY: case CURLE_COULDNT_RESOLVE_HOST: case CURLE_COULDNT_CONNECT: case CURLE_OPERATION_TIMEOUTED: case CURLE_SSL_CONNECT_ERROR: - throw new RequestException('curl error ' . curl_error($this->ch), $request); + throw new RequestException('curl error '.curl_error($this->ch), $request); + default: throw new RequestException('curl error: network error', $request); } curl_close($this->ch); + $result = $response->getResponse(); + + $this->logger->info((string) $result->getBody(), [ + 'path' => $request->getUri()->getPath(), + 'query' => $request->getUri()->getQuery(), + 'type' => \get_class($result), + ]); + // Get the response - return $response->getResponse(); + return $result; + } + + /** + * Retrieve a callback request from API. + * + * @throws RuntimeException Failure to create stream + * + * @return AbstractResponse + */ + public function retrieveWebhookResponse() + { + try { + $this->stream = new Stream(); + $content = fopen('php://input', 'r+'); + if (false === $content) { + $body = $this->stream->create(); + } else { + $body = $this->stream->create($content); + } + } catch (InvalidArgumentException $e) { + throw new RuntimeException('Unable to create stream "php://input"'); + } + + $message = DefaultResponse::getInstance(WebhookResponse::class)->withBody($body); + + return (new ResponseBuilder($message))->getResponse(); } /** - * Create a new http response + * Set credentials. + * + * @param string $clientId api client key + * @param string $clientSecret api client secret + * + * @return self + */ + public function setCredentials($clientId, $clientSecret) + { + $this->clientId = $clientId; + $this->clientSecret = $clientSecret; + + return $this; + } + + /** + * @param string $version + * + * @return Client + */ + public function setVersion($version) + { + $this->version = $version; + + return $this; + } + + /** + * @param LoggerInterface $logger + * + * @return Client + */ + public function setLogger($logger) + { + $this->logger = $logger; + + return $this; + } + + /** + * Create a new http response. * * @param AbstractRequest $request * - * @return ResponseBuilder + * @throws RuntimeException Failure to create stream * - * @throws RuntimeException Failure to create stream + * @return ResponseBuilder */ protected function createResponse($request) { try { $this->stream = new Stream(); - $content = fopen('php://temp', 'w+b'); - if ($content === false) { + $content = fopen('php://temp', 'w+'); + if (false === $content) { $body = $this->stream->create(); } else { $body = $this->stream->create($content); @@ -163,7 +245,8 @@ protected function createResponse($request) } $responseObject = $request->getResponseObject(); $message = DefaultResponse::getInstance($responseObject) - ->withBody($body); + ->withBody($body) + ; return new ResponseBuilder( $message @@ -171,10 +254,10 @@ protected function createResponse($request) } /** - * Create array of headers to pass to CURLOPT_HTTPHEADER + * Create array of headers to pass to CURLOPT_HTTPHEADER. * * @param RequestInterface $request Request object - * @param array $options cURL options + * @param array $options cURL options * * @return array Array of http header lines */ @@ -187,21 +270,21 @@ protected function createHeaders(RequestInterface $request, array $options) $header = strtoupper($name); // cURL does not support 'Expect-Continue', skip all 'EXPECT' headers - if ($header === 'EXPECT') { + if ('EXPECT' === $header) { continue; } - if ($header === 'CONTENT-LENGTH') { - if (array_key_exists(CURLOPT_POSTFIELDS, $options)) { - $values = [strlen($options[CURLOPT_POSTFIELDS])]; + if ('CONTENT-LENGTH' === $header) { + if (\array_key_exists(CURLOPT_POSTFIELDS, $options)) { + $values = [\strlen($options[CURLOPT_POSTFIELDS])]; } // Force content length to '0' if body is empty - elseif (!array_key_exists(CURLOPT_READFUNCTION, $options)) { + elseif (!\array_key_exists(CURLOPT_READFUNCTION, $options)) { $values = [0]; } } foreach ($values as $value) { - $headers[] = $name . ': ' . $value; + $headers[] = $name.': '.$value; } } @@ -213,16 +296,13 @@ protected function createHeaders(RequestInterface $request, array $options) } /** - * Create cURL request options - * - * @param RequestInterface $request - * @param ResponseBuilder $response + * Create cURL request options. * - * @return array cURL options + * @throws RequestException Invalid request + * @throws InvalidArgumentException Invalid header names and/or values + * @throws RuntimeException Unable to read request body * - * @throws RequestException Invalid request - * @throws InvalidArgumentException Invalid header names and/or values - * @throws RuntimeException Unable to read request body + * @return array cURL options */ protected function createOptions(RequestInterface $request, ResponseBuilder $response) { @@ -253,21 +333,22 @@ protected function createOptions(RequestInterface $request, ResponseBuilder $res $options[CURLOPT_HEADERFUNCTION] = function ($ch, $data) use ($response) { $clean_data = trim($data); - if ($clean_data !== '') { - if (strpos(strtoupper($clean_data), 'HTTP/') === 0) { + if ('' !== $clean_data) { + if (str_starts_with(strtoupper($clean_data), 'HTTP/')) { $response->setStatus($clean_data)->getResponse(); } else { $response->addHeader($clean_data); } } - return strlen($data); + return \strlen($data); }; $options[CURLOPT_WRITEFUNCTION] = function ($ch, $data) use ($response) { - if (empty($response->getResponse()->getBody()) === false) { + if (false === empty($response->getResponse()->getBody())) { return $response->getResponse()->getBody()->write($data); } + return 0; }; @@ -275,10 +356,10 @@ protected function createOptions(RequestInterface $request, ResponseBuilder $res } /** - * Add cURL options related to the request body + * Add cURL options related to the request body. * * @param RequestInterface $request Request object - * @param array $options cURL options + * @param array $options cURL options * * @return mixed */ @@ -297,17 +378,17 @@ protected function addRequestBodyOptions(RequestInterface $request, array $optio 'HEAD', 'TRACE', ]; - if (!in_array($request->getMethod(), $http_methods, true)) { + if (!\in_array($request->getMethod(), $http_methods, true)) { $body = $request->getBody(); $body_size = $body->getSize(); - if ($body_size !== 0) { + if (0 !== $body_size) { if ($body->isSeekable()) { $body->rewind(); } - if ($body_size === null || $body_size > self::$MAX_BODY_SIZE) { + if (null === $body_size || $body_size > self::$MAX_BODY_SIZE) { $options[CURLOPT_UPLOAD] = true; - if ($body_size !== null) { + if (null !== $body_size) { $options[CURLOPT_INFILESIZE] = $body_size; } @@ -320,9 +401,9 @@ protected function addRequestBodyOptions(RequestInterface $request, array $optio } } - if ($request->getMethod() === 'HEAD') { + if ('HEAD' === $request->getMethod()) { $options[CURLOPT_NOBODY] = true; - } elseif ($request->getMethod() !== 'GET') { + } elseif ('GET' !== $request->getMethod()) { $options[CURLOPT_CUSTOMREQUEST] = $request->getMethod(); } @@ -330,22 +411,25 @@ protected function addRequestBodyOptions(RequestInterface $request, array $optio } /** - * Get cURL constant for request http protocol version + * Get cURL constant for request http protocol version. * * @param string $requestProtocolVersion Request http protocol version - * @return int cURL constant for request http protocol version * - * @throws UnexpectedValueException Unsupported cURL http protocol version + * @throws UnexpectedValueException Unsupported cURL http protocol version + * + * @return int cURL constant for request http protocol version */ protected function getProtocolVersion($requestProtocolVersion) { switch ($requestProtocolVersion) { case '1.0': return CURL_HTTP_VERSION_1_0; + case '1.1': return CURL_HTTP_VERSION_1_1; + case '2.0': - if (defined('CURL_HTTP_VERSION_2_0')) { + if (\defined('CURL_HTTP_VERSION_2_0')) { return CURL_HTTP_VERSION_2_0; } @@ -354,94 +438,4 @@ protected function getProtocolVersion($requestProtocolVersion) return CURL_HTTP_VERSION_NONE; } - - /** - * Retrieve a callback request from API - * - * @return ResponseInterface - * - * @throws RuntimeException Failure to create stream - */ - public function retrieveCallbackResponse() - { - try { - $this->stream = new Stream(); - $content = fopen('php://temp', 'w+b'); - if ($content === false) { - $body = $this->stream->create(); - } else { - $body = $this->stream->create($content); - } - } catch (InvalidArgumentException $e) { - throw new RuntimeException('Unable to create stream "php://temp"'); - } - - $message = DefaultResponse::getInstance(CallbackResponse::class)->withBody($body); - - $response = (new ResponseBuilder($message))->getResponse(); - - if ($response->hasHeader('X-YC-Signature-256') === false || $response->hasHeader('X-YC-DateTime') === false) { - $response->withStatus(401); - } - - $headerSignatureRequest = $response->getHeader('X-YC-Signature-256'); - $headerDatetimeRequest = $response->getHeader('X-YC-DateTime'); - - if (empty($headerSignatureRequest) === true || empty($headerDatetimeRequest) === true) { - $response->withStatus(401); - } - - $currentWebhookUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; - $payload = file_get_contents('php://input'); - - $hashData = implode('|', [ - $currentWebhookUrl, - $payload, - $headerDatetimeRequest - ]); - - $expectedSignature = hash_hmac('sha256', $hashData, $this->clientSecret); - - if ($headerSignatureRequest !== $expectedSignature) { - $response->withStatus(401); - } - - return $response; - } - - /** - * Set credentials - * - * @param string $clientId api client key - * @param string $clientSecret api client secret - * - * @return self - */ - public function setCredentials($clientId, $clientSecret) - { - $this->clientId = $clientId; - $this->clientSecret = $clientSecret; - - return $this; - } - - /** - * @param string $version - * @return Client - */ - public function setVersion($version) - { - $this->version = $version; - return $this; - } - - /** - * @param LoggerInterface $logger - * @return Client - */ - public function setLogger($logger) - { - $this->logger = $logger; - return $this; - } } diff --git a/src/Constant/BankCapability.php b/src/Constant/BankCapability.php old mode 100644 new mode 100755 index dba6495..59831a4 --- a/src/Constant/BankCapability.php +++ b/src/Constant/BankCapability.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -17,7 +17,13 @@ class BankCapability { - public const SINGLE_TRANSFER = 'single_transfer'; + /** + * @var string + */ + const SINGLE_TRANSFER = 'single_transfer'; - public const SINGLE_PAYMENT = 'single_payment'; + /** + * @var string + */ + const SINGLE_PAYMENT = 'single_payment'; } diff --git a/src/Constant/PaymentStatuses.php b/src/Constant/PaymentStatuses.php old mode 100644 new mode 100755 index 415c792..adf2677 --- a/src/Constant/PaymentStatuses.php +++ b/src/Constant/PaymentStatuses.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -18,8 +18,9 @@ class PaymentStatuses { /** - * Status created : CREA, ACTC, ACCP - * @var array + * Status created : CREA, ACTC, ACCP. + * + * @var array */ const CREATED_PAYMENTS = [ 'CREA', @@ -28,8 +29,9 @@ class PaymentStatuses ]; /** - * Status success : PDNG, ACSP, PART or ACSC - * @var array + * Status success : PDNG, ACSP, PART or ACSC. + * + * @var array */ const SUCCESS_PAYMENTS = [ 'PDNG', @@ -39,8 +41,9 @@ class PaymentStatuses ]; /** - * Status done : PART or ACSC - * @var array + * Status done : PART or ACSC. + * + * @var array */ const DONE_PAYMENTS = [ 'PART', @@ -48,14 +51,30 @@ class PaymentStatuses ]; /** - * Status rejected : CANC, RJCT - * @var array + * Status rejected : CANC, RJCT. + * + * @var array */ const REJECTED_PAYMENTS = [ 'CANC', 'RJCT', ]; + /** + * Status not found (error response). + * + * @var string + */ + const ERROR_NOT_FOUND = 'errorstatus'; + + /** + * @var string + */ + const PROCESS_IN_PROGRESS = 'inprogress'; + + /** + * @return string[] + */ public static function getAllStatuses() { return array_merge( @@ -65,12 +84,4 @@ public static function getAllStatuses() self::REJECTED_PAYMENTS ); } - - /** - * Status not found (error response) - * @var string - */ - const ERROR_NOT_FOUND = 'errorstatus'; - - const PROCESS_IN_PROGRESS = 'inprogress'; } diff --git a/src/Constant/WebhookIP.php b/src/Constant/WebhookIP.php new file mode 100755 index 0000000..f3d54f4 --- /dev/null +++ b/src/Constant/WebhookIP.php @@ -0,0 +1,30 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Constant; + +class WebhookIP +{ + /** + * IP authorized for Bridge WebHooks. + * + * @var array + */ + const AUTHORIZED_IP = [ + '63.32.31.5', + '52.215.247.62', + '34.249.92.209', + ]; +} diff --git a/src/Exception/RequestException.php b/src/Exception/RequestException.php old mode 100644 new mode 100755 index 7ac4d85..942e004 --- a/src/Exception/RequestException.php +++ b/src/Exception/RequestException.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -15,30 +15,30 @@ namespace BridgeSDK\Exception; -use RuntimeException; use Exception; use Psr\Http\Message\RequestInterface; +use RuntimeException; /** - * Request Exception + * Request Exception. * * Failed http request exception class */ class RequestException extends RuntimeException { /** - * Request object + * Request object. * * @var RequestInterface */ private $request; /** - * Create request exception object + * Create request exception object. * - * @param string $message Exception message - * @param RequestInterface $request Request object - * @param \Exception|null $lastException Previous exception object + * @param string $message Exception message + * @param RequestInterface $request Request object + * @param null|\Exception $lastException Previous exception object */ public function __construct($message, RequestInterface $request, Exception $lastException = null) { @@ -48,7 +48,7 @@ public function __construct($message, RequestInterface $request, Exception $last } /** - * Get the request object + * Get the request object. * * @return RequestInterface */ diff --git a/src/Logger/NullLogger.php b/src/Logger/NullLogger.php old mode 100644 new mode 100755 index f25f3d9..b11a783 --- a/src/Logger/NullLogger.php +++ b/src/Logger/NullLogger.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -19,39 +19,39 @@ class NullLogger implements LoggerInterface { - public function emergency($message, array $context = array()) + public function emergency($message, array $context = []) { } - public function alert($message, array $context = array()) + public function alert($message, array $context = []) { } - public function critical($message, array $context = array()) + public function critical($message, array $context = []) { } - public function error($message, array $context = array()) + public function error($message, array $context = []) { } - public function warning($message, array $context = array()) + public function warning($message, array $context = []) { } - public function notice($message, array $context = array()) + public function notice($message, array $context = []) { } - public function info($message, array $context = array()) + public function info($message, array $context = []) { } - public function debug($message, array $context = array()) + public function debug($message, array $context = []) { } - public function log($level, $message, array $context = array()) + public function log($level, $message, array $context = []) { } } diff --git a/src/Model/AbstractModel.php b/src/Model/AbstractModel.php old mode 100644 new mode 100755 index cc1f19c..ccc5c11 --- a/src/Model/AbstractModel.php +++ b/src/Model/AbstractModel.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -24,12 +24,12 @@ abstract class AbstractModel implements JsonSerializable */ public function jsonSerialize() { - $getterName = get_class_methods(get_class($this)); + $getterName = get_class_methods(static::class); $gettableAttributes = []; foreach ($getterName as $value) { - if (substr($value, 0, 3) === 'get') { - $key = lcfirst(substr($value, 3, strlen($value))); - $gettableAttributes[$this->transformToPascalCase($key)] = $this->$value(); + if ('get' === substr($value, 0, 3)) { + $key = lcfirst(substr($value, 3, \strlen($value))); + $gettableAttributes[$this->transformToPascalCase($key)] = $this->{$value}(); } } @@ -37,21 +37,21 @@ public function jsonSerialize() } /** - * hydrate from array + * hydrate from array. * * @param array $content * - * @return self + * @return null|static */ public function hydrate(array $content) { - $setterName = get_class_methods(get_class($this)); + $setterName = get_class_methods(static::class); foreach ($setterName as $value) { - if (substr($value, 0, 3) === 'set') { - $key = lcfirst(substr($value, 3, strlen($value))); + if ('set' === substr($value, 0, 3)) { + $key = lcfirst(substr($value, 3, \strlen($value))); $apiKey = $this->transformToPascalCase($key); if (isset($content[$apiKey])) { - $this->$value($content[$apiKey]); + $this->{$value}($content[$apiKey]); } } } @@ -59,8 +59,15 @@ public function hydrate(array $content) return $this; } + /** + * @param string $key + * + * @return string + */ protected function transformToPascalCase($key) { - return ltrim(strtolower(preg_replace('/[A-Z]([A-Z](?![a-z]))*/', '_$0', $key)), '_'); + $modifiedKey = (string) preg_replace('/[A-Z]([A-Z](?![a-z]))*/', '_$0', $key); + + return ltrim(strtolower($modifiedKey), '_'); } } diff --git a/src/Model/ArrayCollection.php b/src/Model/ArrayCollection.php old mode 100644 new mode 100755 index 95b62cf..350fb51 --- a/src/Model/ArrayCollection.php +++ b/src/Model/ArrayCollection.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -18,7 +18,7 @@ use ArrayObject; /** - * ArrayCollection + * ArrayCollection. */ class ArrayCollection extends ArrayObject { diff --git a/src/Model/Bank/Bank.php b/src/Model/Bank/Bank.php old mode 100644 new mode 100755 index 4ea36ce..1ecd1f7 --- a/src/Model/Bank/Bank.php +++ b/src/Model/Bank/Bank.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -41,7 +41,7 @@ class Bank extends AbstractModel protected $logoUrl; /** - * @var bool + * @var null|bool */ protected $isHighlighted; @@ -61,17 +61,17 @@ class Bank extends AbstractModel protected $parentName; /** - * @var array + * @var array */ protected $capabilities = []; /** - * @var array + * @var array */ protected $form = []; /** - * @var array + * @var array */ protected $channelType = []; @@ -90,17 +90,19 @@ public function getId() /** * @param int $id + * * @return Bank */ public function setId($id) { - if (is_int($id) === true) { + if (true === \is_int($id)) { $this->id = $id; + return $this; } throw new InvalidArgumentException( - 'Id must be an int, ' . gettype($id) . ' is given.' + 'Id must be an int, '.\gettype($id).' is given.' ); } @@ -114,17 +116,19 @@ public function getName() /** * @param string $name + * * @return Bank */ public function setName($name) { - if (is_string($name) === true) { + if (true === \is_string($name)) { $this->name = $name; + return $this; } throw new InvalidArgumentException( - 'Name must be a string, ' . gettype($name) . ' is given.' + 'Name must be a string, '.\gettype($name).' is given.' ); } @@ -138,17 +142,19 @@ public function getCountryCode() /** * @param string $countryCode + * * @return Bank */ public function setCountryCode($countryCode) { - if (is_string($countryCode) === true) { + if (true === \is_string($countryCode)) { $this->countryCode = $countryCode; + return $this; } throw new InvalidArgumentException( - 'Country code must be a string, ' . gettype($countryCode) . ' is given.' + 'Country code must be a string, '.\gettype($countryCode).' is given.' ); } @@ -162,22 +168,24 @@ public function getLogoUrl() /** * @param string $logoUrl + * * @return Bank */ public function setLogoUrl($logoUrl) { - if (is_string($logoUrl) === true) { + if (true === \is_string($logoUrl)) { $this->logoUrl = $logoUrl; + return $this; } throw new InvalidArgumentException( - 'Logo url must be a string, ' . gettype($logoUrl) . ' is given.' + 'Logo url must be a string, '.\gettype($logoUrl).' is given.' ); } /** - * @return bool + * @return null|bool */ public function isHighlighted() { @@ -185,23 +193,25 @@ public function isHighlighted() } /** - * @param bool|null $isHighlighted + * @param null|bool $isHighlighted + * * @return Bank */ public function setIsHighlighted($isHighlighted) { - if (is_bool($isHighlighted) === true || is_null($isHighlighted)) { + if (true === \is_bool($isHighlighted) || null === $isHighlighted) { $this->isHighlighted = $isHighlighted; + return $this; } throw new InvalidArgumentException( - 'Is highlighted must be a string or null, ' . gettype($isHighlighted) . ' is given.' + 'Is highlighted must be a string or null, '.\gettype($isHighlighted).' is given.' ); } /** - * @return string|null + * @return null|string */ public function getPrimaryColor() { @@ -209,23 +219,25 @@ public function getPrimaryColor() } /** - * @param string|null $primaryColor + * @param null|string $primaryColor + * * @return Bank */ public function setPrimaryColor($primaryColor) { - if (is_string($primaryColor) === true || is_null($primaryColor)) { + if (true === \is_string($primaryColor) || null === $primaryColor) { $this->primaryColor = $primaryColor; + return $this; } throw new InvalidArgumentException( - 'Primary color must be a string or null, ' . gettype($primaryColor) . ' is given.' + 'Primary color must be a string or null, '.\gettype($primaryColor).' is given.' ); } /** - * @return string|null + * @return null|string */ public function getSecondaryColor() { @@ -233,23 +245,25 @@ public function getSecondaryColor() } /** - * @param string|null $secondaryColor + * @param null|string $secondaryColor + * * @return Bank */ public function setSecondaryColor($secondaryColor) { - if (is_string($secondaryColor) === true || is_null($secondaryColor)) { + if (true === \is_string($secondaryColor) || null === $secondaryColor) { $this->secondaryColor = $secondaryColor; + return $this; } throw new InvalidArgumentException( - 'Secondary color must be a string or null, ' . gettype($secondaryColor) . ' is given.' + 'Secondary color must be a string or null, '.\gettype($secondaryColor).' is given.' ); } /** - * @return string|null + * @return null|string */ public function getParentName() { @@ -257,23 +271,25 @@ public function getParentName() } /** - * @param string|null $parentName + * @param null|string $parentName + * * @return Bank */ public function setParentName($parentName) { - if (is_string($parentName) === true || is_null($parentName)) { + if (true === \is_string($parentName) || null === $parentName) { $this->parentName = $parentName; + return $this; } throw new InvalidArgumentException( - 'Parent name must be a string or null, ' . gettype($parentName) . ' is given.' + 'Parent name must be a string or null, '.\gettype($parentName).' is given.' ); } /** - * @return array + * @return array */ public function getCapabilities() { @@ -281,23 +297,25 @@ public function getCapabilities() } /** - * @param array $capabilities + * @param array $capabilities + * * @return Bank */ public function setCapabilities($capabilities) { - if (is_array($capabilities) === true) { + if (true === \is_array($capabilities)) { $this->capabilities = $capabilities; + return $this; } throw new InvalidArgumentException( - 'Capabilities must be an array, ' . gettype($capabilities) . ' is given.' + 'Capabilities must be an array, '.\gettype($capabilities).' is given.' ); } /** - * @return array + * @return array */ public function getForm() { @@ -305,23 +323,25 @@ public function getForm() } /** - * @param array $form + * @param array $form + * * @return Bank */ public function setForm($form) { - if (is_array($form) === true) { + if (true === \is_array($form)) { $this->form = $form; + return $this; } throw new InvalidArgumentException( - 'Form must be an array, ' . gettype($form) . ' is given.' + 'Form must be an array, '.\gettype($form).' is given.' ); } /** - * @return array + * @return array */ public function getChannelType() { @@ -329,23 +349,25 @@ public function getChannelType() } /** - * @param array $channelType + * @param array $channelType + * * @return Bank */ public function setChannelType($channelType) { - if (is_array($channelType) === true) { + if (true === \is_array($channelType)) { $this->channelType = $channelType; + return $this; } throw new InvalidArgumentException( - 'Channel type must be an array, ' . gettype($channelType) . ' is given.' + 'Channel type must be an array, '.\gettype($channelType).' is given.' ); } /** - * @return int|null + * @return null|int */ public function getDisplayOrder() { @@ -353,18 +375,20 @@ public function getDisplayOrder() } /** - * @param int|null $displayOrder + * @param null|int $displayOrder + * * @return Bank */ public function setDisplayOrder($displayOrder) { - if (is_int($displayOrder) === true || is_null($displayOrder)) { + if (true === \is_int($displayOrder) || null === $displayOrder) { $this->displayOrder = $displayOrder; + return $this; } throw new InvalidArgumentException( - 'Display order must be an int or null, ' . gettype($displayOrder) . ' is given.' + 'Display order must be an int or null, '.\gettype($displayOrder).' is given.' ); } } diff --git a/src/Model/Bank/ListBanks.php b/src/Model/Bank/ListBanks.php old mode 100644 new mode 100755 index 5abd99c..4f26a04 --- a/src/Model/Bank/ListBanks.php +++ b/src/Model/Bank/ListBanks.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -20,7 +20,7 @@ class ListBanks extends AbstractModel { /** - * @var array + * @var array */ protected $banks = []; @@ -31,11 +31,11 @@ class ListBanks extends AbstractModel public function hydrate(array $content) { - if (empty($content['pagination']) === false && empty($content['pagination']['next_uri']) === false) { + if (false === empty($content['pagination']) && false === empty($content['pagination']['next_uri'])) { $this->after = $this->getAfterParam($content['pagination']['next_uri']); } - if (!empty($content['resources']) && is_array($content['resources'])) { + if (!empty($content['resources']) && \is_array($content['resources'])) { foreach ($content['resources'] as $resource) { $bank = (new Bank())->hydrate($resource); if (empty($bank)) { @@ -48,21 +48,8 @@ public function hydrate(array $content) return $this; } - protected function getAfterParam($url) - { - $paramsString = explode('?', $url); - $allParams = explode('&', $paramsString[1]); - foreach ($allParams as $aParam) { - if (strpos($aParam, 'after=') !== false) { - return str_replace('after=', '', $aParam); - } - } - - return ''; - } - /** - * @return array + * @return array */ public function getBanks() { @@ -70,12 +57,14 @@ public function getBanks() } /** - * @param array $banks + * @param array $banks + * * @return ListBanks */ public function setBanks($banks) { $this->banks = $banks; + return $this; } @@ -86,4 +75,22 @@ public function getAfter() { return $this->after; } + + /** + * @param string $url + * + * @return array|mixed|string|string[] + */ + protected function getAfterParam($url) + { + $paramsString = explode('?', $url); + $allParams = explode('&', $paramsString[1]); + foreach ($allParams as $aParam) { + if (str_contains($aParam, 'after=')) { + return str_replace('after=', '', $aParam); + } + } + + return ''; + } } diff --git a/src/Model/Callback.php b/src/Model/Callback.php deleted file mode 100644 index 4655261..0000000 --- a/src/Model/Callback.php +++ /dev/null @@ -1,196 +0,0 @@ - - * @copyright 2022 (c) 202-ecommerce - * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) - * @link https://docs.bridgeapi.io/ - */ - -namespace BridgeSDK\Model; - -use InvalidArgumentException; -use JsonSerializable; - -class Callback extends AbstractModel implements JsonSerializable -{ - // PROPERTIES - - /** - * @var string|null - */ - private $contractReference; - - /** - * @var string|null - */ - private $merchantReference; - - /** - * @var string|null - */ - private $merchantOrderId; - - /** - * @var string - */ - private $eventDate; - - /** - * @var int - */ - private $triggeredForStatus; - - // GETTERS & SETTERS - - /** - * Get Contract Reference - * - * @return string|null - */ - public function getContractReference() - { - return $this->contractReference; - } - - /** - * Set Contract Reference - * - * @param string|null $contractReference - * - * @return self - */ - public function setContractReference($contractReference) - { - if (is_string($contractReference) === true || is_null($contractReference) === true) { - $this->contractReference = $contractReference; - return $this; - } - - throw new InvalidArgumentException( - 'Contract Reference must be a string or null but ' . gettype($contractReference) . ' is given.' - ); - } - - /** - * Get Merchant Reference - * - * @return string|null - */ - public function getMerchantReference() - { - return $this->merchantReference; - } - - /** - * Set Merchant Reference - * - * @param string|null $merchantReference - * - * @return self - */ - public function setMerchantReference($merchantReference) - { - if (is_string($merchantReference) === true || is_null($merchantReference) === true) { - $this->merchantReference = $merchantReference; - return $this; - } - - throw new InvalidArgumentException( - 'Merchant Reference must be a string or null but ' . gettype($merchantReference) . ' is given.' - ); - } - - /** - * Get Merchant Order Id - * - * @return string|null - */ - public function getMerchantOrderId() - { - return $this->merchantOrderId; - } - - /** - * Set Merchant Order Id - * - * @param string|null $merchantOrderId - * - * @return self - */ - public function setMerchantOrderId($merchantOrderId) - { - if (is_string($merchantOrderId) === true || is_null($merchantOrderId) === true) { - $this->merchantOrderId = $merchantOrderId; - return $this; - } - - throw new InvalidArgumentException( - 'Merchant Order Id must be a string or null but ' . gettype($merchantOrderId) . ' is given.' - ); - } - - /** - * Get Event Date - * - * @return string - */ - public function getEventDate() - { - return $this->eventDate; - } - - /** - * Set Event Date - * - * @param string $eventDate - * - * @return self - */ - public function setEventDate($eventDate) - { - if (is_string($eventDate) === true) { - $this->eventDate = $eventDate; - return $this; - } - - throw new InvalidArgumentException( - 'Event Date must be a string but ' . gettype($eventDate) . ' is given.' - ); - } - - /** - * Get Triggered For Status - * - * @return int - */ - public function getTriggeredForStatus() - { - return $this->triggeredForStatus; - } - - /** - * Set Triggered For Status - * - * @param int $triggeredForStatus - * - * @return self - */ - public function setTriggeredForStatus($triggeredForStatus) - { - if (is_int($triggeredForStatus) === true) { - $this->triggeredForStatus = $triggeredForStatus; - return $this; - } - - throw new InvalidArgumentException( - 'Triggered For Status must be an integer but ' . gettype($triggeredForStatus) . ' is given.' - ); - } -} diff --git a/src/Model/Error.php b/src/Model/Error.php old mode 100644 new mode 100755 index 4614a9e..6c69979 --- a/src/Model/Error.php +++ b/src/Model/Error.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -21,22 +21,22 @@ class Error extends AbstractModel implements JsonSerializable { /** - * @var string|null + * @var null|string */ private $type; /** - * @var string|null + * @var null|string */ private $message; /** - * @var string|null + * @var null|string */ private $documentationUrl; /** - * @return string|null + * @return null|string */ public function getType() { @@ -44,23 +44,25 @@ public function getType() } /** - * @param string|null $type + * @param null|string $type + * * @return Error */ public function setType($type) { - if (is_string($type) === true || is_null($type) === true) { + if (true === \is_string($type) || (null === $type) === true) { $this->type = $type; + return $this; } throw new InvalidArgumentException( - 'Type must be a string or null but ' . gettype($type) . ' is given.' + 'Type must be a string or null but '.\gettype($type).' is given.' ); } /** - * @return string|null + * @return null|string */ public function getMessage() { @@ -68,23 +70,25 @@ public function getMessage() } /** - * @param string|null $message + * @param null|string $message + * * @return Error */ public function setMessage($message) { - if (is_string($message) === true || is_null($message) === true) { + if (true === \is_string($message) || (null === $message) === true) { $this->message = $message; + return $this; } throw new InvalidArgumentException( - 'Message must be a string or null but ' . gettype($message) . ' is given.' + 'Message must be a string or null but '.\gettype($message).' is given.' ); } /** - * @return string|null + * @return null|string */ public function getDocumentationUrl() { @@ -92,18 +96,20 @@ public function getDocumentationUrl() } /** - * @param string|null $documentationUrl + * @param null|string $documentationUrl + * * @return Error */ public function setDocumentationUrl($documentationUrl) { - if (is_string($documentationUrl) === true || is_null($documentationUrl) === true) { + if (true === \is_string($documentationUrl) || (null === $documentationUrl) === true) { $this->documentationUrl = $documentationUrl; + return $this; } throw new InvalidArgumentException( - 'Documentation url must be a string or null but ' . gettype($documentationUrl) . ' is given.' + 'Documentation url must be a string or null but '.\gettype($documentationUrl).' is given.' ); } } diff --git a/src/Model/Payment/CreatePayment.php b/src/Model/Payment/CreatePayment.php old mode 100644 new mode 100755 index 2d7296d..6253fdb --- a/src/Model/Payment/CreatePayment.php +++ b/src/Model/Payment/CreatePayment.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -16,7 +16,6 @@ namespace BridgeSDK\Model\Payment; use BridgeSDK\Model\AbstractModel; -use BridgeSDK\Model\ArrayCollection; use InvalidArgumentException; class CreatePayment extends AbstractModel @@ -56,17 +55,19 @@ public function getSuccessfulCallbackUrl() /** * @param string $successfulCallbackUrl + * * @return CreatePayment */ public function setSuccessfulCallbackUrl($successfulCallbackUrl) { - if (is_string($successfulCallbackUrl) === true) { + if (true === \is_string($successfulCallbackUrl)) { $this->successfulCallbackUrl = $successfulCallbackUrl; + return $this; } throw new InvalidArgumentException( - 'Successful callback url must be a string ' . gettype($successfulCallbackUrl) . ' is given.' + 'Successful callback url must be a string '.\gettype($successfulCallbackUrl).' is given.' ); } @@ -80,17 +81,19 @@ public function getUnsuccessfulCallbackUrl() /** * @param string $unsuccessfulCallbackUrl + * * @return CreatePayment */ public function setUnsuccessfulCallbackUrl($unsuccessfulCallbackUrl) { - if (is_string($unsuccessfulCallbackUrl) === true) { + if (true === \is_string($unsuccessfulCallbackUrl)) { $this->unsuccessfulCallbackUrl = $unsuccessfulCallbackUrl; + return $this; } throw new InvalidArgumentException( - 'Unsuccessful callback url must be a string ' . gettype($unsuccessfulCallbackUrl) . ' is given.' + 'Unsuccessful callback url must be a string '.\gettype($unsuccessfulCallbackUrl).' is given.' ); } @@ -104,17 +107,19 @@ public function getBankId() /** * @param int $bankId + * * @return CreatePayment */ public function setBankId($bankId) { - if (is_int($bankId) === true) { + if (true === \is_int($bankId)) { $this->bankId = $bankId; + return $this; } throw new InvalidArgumentException( - 'Bank id must be an int ' . gettype($bankId) . ' is given.' + 'Bank id must be an int '.\gettype($bankId).' is given.' ); } @@ -128,17 +133,19 @@ public function getTransactions() /** * @param array $transactions + * * @return CreatePayment */ public function setTransactions($transactions) { - if (is_array($transactions)) { + if (\is_array($transactions)) { $this->transactions = $transactions; + return $this; } throw new InvalidArgumentException( - 'Transactions must be an array ' . gettype($transactions) . ' is given.' + 'Transactions must be an array '.\gettype($transactions).' is given.' ); } @@ -152,17 +159,19 @@ public function getUser() /** * @param PaymentUser $user + * * @return CreatePayment */ public function setUser($user) { if ($user instanceof PaymentUser) { $this->user = $user; + return $this; } throw new InvalidArgumentException( - 'User must be an ArrayCollection ' . gettype($user) . ' is given.' + 'User must be an ArrayCollection '.\gettype($user).' is given.' ); } diff --git a/src/Model/Payment/CreatePaymentTransaction.php b/src/Model/Payment/CreatePaymentTransaction.php old mode 100644 new mode 100755 index 37513ed..46ee531 --- a/src/Model/Payment/CreatePaymentTransaction.php +++ b/src/Model/Payment/CreatePaymentTransaction.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -55,17 +55,19 @@ public function getCurrency() /** * @param string $currency + * * @return CreatePaymentTransaction */ public function setCurrency($currency) { - if (is_string($currency) === true) { + if (true === \is_string($currency)) { $this->currency = $currency; + return $this; } throw new InvalidArgumentException( - 'Currency must be a string ' . gettype($currency) . ' is given.' + 'Currency must be a string '.\gettype($currency).' is given.' ); } @@ -79,17 +81,19 @@ public function getLabel() /** * @param string $label + * * @return CreatePaymentTransaction */ public function setLabel($label) { - if (is_string($label) === true) { + if (true === \is_string($label)) { $this->label = $label; + return $this; } throw new InvalidArgumentException( - 'Label must be a string ' . gettype($label) . ' is given.' + 'Label must be a string '.\gettype($label).' is given.' ); } @@ -103,17 +107,19 @@ public function getAmount() /** * @param float $amount + * * @return CreatePaymentTransaction */ public function setAmount($amount) { - if (is_float($amount) === true) { + if (true === \is_float($amount)) { $this->amount = $amount; + return $this; } throw new InvalidArgumentException( - 'Amount must be a float ' . gettype($amount) . ' is given.' + 'Amount must be a float '.\gettype($amount).' is given.' ); } @@ -127,17 +133,19 @@ public function getClientReference() /** * @param string $clientReference + * * @return CreatePaymentTransaction */ public function setClientReference($clientReference) { - if (is_string($clientReference) === true) { + if (true === \is_string($clientReference)) { $this->clientReference = $clientReference; + return $this; } throw new InvalidArgumentException( - 'Client reference must be a string ' . gettype($clientReference) . ' is given.' + 'Client reference must be a string '.\gettype($clientReference).' is given.' ); } @@ -151,17 +159,19 @@ public function getEndToEndId() /** * @param string $endToEndId + * * @return CreatePaymentTransaction */ public function setEndToEndId($endToEndId) { - if (is_string($endToEndId) === true) { + if (true === \is_string($endToEndId)) { $this->endToEndId = $endToEndId; + return $this; } throw new InvalidArgumentException( - 'End to end id must be a string ' . gettype($endToEndId) . ' is given.' + 'End to end id must be a string '.\gettype($endToEndId).' is given.' ); } } diff --git a/src/Model/Payment/CreatePaymentUrl.php b/src/Model/Payment/CreatePaymentUrl.php old mode 100644 new mode 100755 index e121137..4d29b7e --- a/src/Model/Payment/CreatePaymentUrl.php +++ b/src/Model/Payment/CreatePaymentUrl.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -40,17 +40,19 @@ public function getId() /** * @param string $id + * * @return CreatePaymentUrl */ public function setId($id) { - if (is_string($id) === true) { + if (true === \is_string($id)) { $this->id = $id; + return $this; } throw new InvalidArgumentException( - 'Id must be a string ' . gettype($id) . ' is given.' + 'Id must be a string '.\gettype($id).' is given.' ); } @@ -64,17 +66,19 @@ public function getConsentUrl() /** * @param string $consentUrl + * * @return CreatePaymentUrl */ public function setConsentUrl($consentUrl) { - if (is_string($consentUrl) === true) { + if (true === \is_string($consentUrl)) { $this->consentUrl = $consentUrl; + return $this; } throw new InvalidArgumentException( - 'Consent url must be a string ' . gettype($consentUrl) . ' is given.' + 'Consent url must be a string '.\gettype($consentUrl).' is given.' ); } } diff --git a/src/Model/Payment/Payment.php b/src/Model/Payment/Payment.php old mode 100644 new mode 100755 index 5e9a919..f89592b --- a/src/Model/Payment/Payment.php +++ b/src/Model/Payment/Payment.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -71,11 +71,13 @@ public function getId() /** * @param string $id + * * @return Payment */ public function setId($id) { $this->id = $id; + return $this; } @@ -89,11 +91,13 @@ public function getStatus() /** * @param string $status + * * @return Payment */ public function setStatus($status) { $this->status = $status; + return $this; } @@ -107,17 +111,19 @@ public function getStatusReason() /** * @param string $statusReason + * * @return Payment */ public function setStatusReason($statusReason) { - if (is_string($statusReason) === true) { + if (true === \is_string($statusReason)) { $this->statusReason = $statusReason; + return $this; } throw new InvalidArgumentException( - 'Status reason must be a string ' . gettype($statusReason) . ' is given.' + 'Status reason must be a string '.\gettype($statusReason).' is given.' ); } @@ -131,17 +137,19 @@ public function getBankId() /** * @param int $bankId + * * @return Payment */ public function setBankId($bankId) { - if (is_int($bankId) === true) { + if (true === \is_int($bankId)) { $this->bankId = $bankId; + return $this; } throw new InvalidArgumentException( - 'Bank id must be an int ' . gettype($bankId) . ' is given.' + 'Bank id must be an int '.\gettype($bankId).' is given.' ); } @@ -155,17 +163,19 @@ public function getCreatedAt() /** * @param string $createdAt + * * @return Payment */ public function setCreatedAt($createdAt) { - if (is_string($createdAt) === true) { + if (true === \is_string($createdAt)) { $this->createdAt = $createdAt; + return $this; } throw new InvalidArgumentException( - 'Created at must be a string ' . gettype($createdAt) . ' is given.' + 'Created at must be a string '.\gettype($createdAt).' is given.' ); } @@ -179,17 +189,19 @@ public function getUpdatedAt() /** * @param string $updatedAt + * * @return Payment */ public function setUpdatedAt($updatedAt) { - if (is_string($updatedAt) === true) { + if (true === \is_string($updatedAt)) { $this->updatedAt = $updatedAt; + return $this; } throw new InvalidArgumentException( - 'Updated at must be a string ' . gettype($updatedAt) . ' is given.' + 'Updated at must be a string '.\gettype($updatedAt).' is given.' ); } @@ -203,22 +215,24 @@ public function getUser() /** * @param PaymentUser $user + * * @return Payment */ public function setUser($user) { if ($user instanceof PaymentUser) { $this->user = $user; + return $this; } throw new InvalidArgumentException( - 'User must be a string ' . gettype($user) . ' is given.' + 'User must be a string '.\gettype($user).' is given.' ); } /** - * @return ArrayCollection + * @return ArrayCollection */ public function getTransactions() { @@ -226,23 +240,25 @@ public function getTransactions() } /** - * @param ArrayCollection $transactions + * @param ArrayCollection $transactions + * * @return Payment */ public function setTransactions($transactions) { if ($transactions instanceof ArrayCollection) { $this->transactions = $transactions; + return $this; } throw new InvalidArgumentException( - 'Transactions must be an ArrayCollection ' . gettype($transactions) . ' is given.' + 'Transactions must be an ArrayCollection '.\gettype($transactions).' is given.' ); } /** - * hydrate from array + * hydrate from array. * * @param array $content * @@ -250,25 +266,29 @@ public function setTransactions($transactions) */ public function hydrate(array $content) { - $setterName = get_class_methods(get_class($this)); + $setterName = get_class_methods(static::class); foreach ($setterName as $value) { - if (substr($value, 0, 3) === 'set') { - $key = lcfirst(substr($value, 3, strlen($value))); + if ('set' === substr($value, 0, 3)) { + $key = lcfirst(substr($value, 3, \strlen($value))); $apiKey = $this->transformToPascalCase($key); if (isset($content[$apiKey])) { switch ($key) { case 'user': - $this->$value((new PaymentUser())->hydrate($content[$apiKey])); + $this->{$value}((new PaymentUser())->hydrate($content[$apiKey])); + break; + case 'transactions': $collection = new ArrayCollection(); foreach ($content[$apiKey] as $transaction) { $collection->append((new Transaction())->hydrate($transaction)); } $this->transactions = $collection; + break; + default: - $this->$value($content[$apiKey]); + $this->{$value}($content[$apiKey]); } } } diff --git a/src/Model/Payment/PaymentError.php b/src/Model/Payment/PaymentError.php old mode 100644 new mode 100755 index 14def53..c61f2e7 --- a/src/Model/Payment/PaymentError.php +++ b/src/Model/Payment/PaymentError.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -40,17 +40,19 @@ public function getCode() /** * @param string $code + * * @return PaymentError */ public function setCode($code) { - if (is_string($code) === true) { + if (true === \is_string($code)) { $this->code = $code; + return $this; } throw new InvalidArgumentException( - 'Code must be a string ' . gettype($code) . ' is given.' + 'Code must be a string '.\gettype($code).' is given.' ); } @@ -64,17 +66,19 @@ public function getMessage() /** * @param string $message + * * @return PaymentError */ public function setMessage($message) { - if (is_string($message) === true) { + if (true === \is_string($message)) { $this->message = $message; + return $this; } throw new InvalidArgumentException( - 'Message must be a string ' . gettype($message) . ' is given.' + 'Message must be a string '.\gettype($message).' is given.' ); } } diff --git a/src/Model/Payment/PaymentErrors.php b/src/Model/Payment/PaymentErrors.php old mode 100644 new mode 100755 index 82d8f39..949caac --- a/src/Model/Payment/PaymentErrors.php +++ b/src/Model/Payment/PaymentErrors.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -41,17 +41,19 @@ public function getErrors() /** * @param ArrayCollection $errors + * * @return PaymentErrors */ public function setErrors($errors) { if ($errors instanceof ArrayCollection) { $this->errors = $errors; + return $this; } throw new InvalidArgumentException( - 'Errors must be an Array collection ' . gettype($errors) . ' is given.' + 'Errors must be an Array collection '.\gettype($errors).' is given.' ); } diff --git a/src/Model/Payment/PaymentUser.php b/src/Model/Payment/PaymentUser.php old mode 100644 new mode 100755 index af4b554..a66cc52 --- a/src/Model/Payment/PaymentUser.php +++ b/src/Model/Payment/PaymentUser.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -50,17 +50,19 @@ public function getFirstName() /** * @param string $firstName + * * @return PaymentUser */ public function setFirstName($firstName) { - if (is_string($firstName) === true) { + if (true === \is_string($firstName)) { $this->firstName = $firstName; + return $this; } throw new InvalidArgumentException( - 'First name must be a string ' . gettype($firstName) . ' is given.' + 'First name must be a string '.\gettype($firstName).' is given.' ); } @@ -74,17 +76,19 @@ public function getLastName() /** * @param string $lastName + * * @return PaymentUser */ public function setLastName($lastName) { - if (is_string($lastName) === true) { + if (true === \is_string($lastName)) { $this->lastName = $lastName; + return $this; } throw new InvalidArgumentException( - 'Last name must be a string ' . gettype($lastName) . ' is given.' + 'Last name must be a string '.\gettype($lastName).' is given.' ); } @@ -98,17 +102,19 @@ public function getExternalReference() /** * @param string $externalReference + * * @return PaymentUser */ public function setExternalReference($externalReference) { - if (is_string($externalReference) === true) { + if (true === \is_string($externalReference)) { $this->externalReference = $externalReference; + return $this; } throw new InvalidArgumentException( - 'External reference must be a string ' . gettype($externalReference) . ' is given.' + 'External reference must be a string '.\gettype($externalReference).' is given.' ); } @@ -122,17 +128,19 @@ public function getIpAddress() /** * @param string $ipAddress + * * @return PaymentUser */ public function setIpAddress($ipAddress) { - if (is_string($ipAddress) === true) { + if (true === \is_string($ipAddress)) { $this->ipAddress = $ipAddress; + return $this; } throw new InvalidArgumentException( - 'Ip address must be a string ' . gettype($ipAddress) . ' is given.' + 'Ip address must be a string '.\gettype($ipAddress).' is given.' ); } } diff --git a/src/Model/Payment/PaymentWebhook.php b/src/Model/Payment/PaymentWebhook.php new file mode 100755 index 0000000..74cc799 --- /dev/null +++ b/src/Model/Payment/PaymentWebhook.php @@ -0,0 +1,98 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Model\Payment; + +use BridgeSDK\Model\AbstractModel; +use InvalidArgumentException; + +class PaymentWebhook extends AbstractModel +{ + /** + * @var string + */ + protected $type; + + /** + * @var null|PaymentWebhookTransactionUpdated + */ + protected $content; + + /** + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * @param string $type + * + * @return PaymentWebhook + */ + public function setType($type) + { + if (true === \is_string($type)) { + $this->type = $type; + + return $this; + } + + throw new InvalidArgumentException( + 'Type must be a string '.\gettype($type).' is given.' + ); + } + + /** + * @return null|PaymentWebhookTransactionUpdated + */ + public function getContent() + { + return $this->content; + } + + /** + * @param null|PaymentWebhookTransactionUpdated $content + * + * @return PaymentWebhook + */ + public function setContent($content) + { + if (null === $content || $content instanceof PaymentWebhookTransactionUpdated) { + $this->content = $content; + + return $this; + } + + throw new InvalidArgumentException( + 'Content must be a PaymentWebhookTransactionUpdated or null, '.\gettype($content).' is given.' + ); + } + + public function hydrate(array $content) + { + if (!empty($content['type'])) { + $this->setType($content['type']); + } + + if (!empty($content['content'])) { + $paymentWebhookTransaction = (new PaymentWebhookTransactionUpdated())->hydrate($content['content']); + $this->setContent($paymentWebhookTransaction); + } + + return $this; + } +} diff --git a/src/Model/Payment/PaymentWebhookTransactionUpdated.php b/src/Model/Payment/PaymentWebhookTransactionUpdated.php new file mode 100755 index 0000000..7275fa3 --- /dev/null +++ b/src/Model/Payment/PaymentWebhookTransactionUpdated.php @@ -0,0 +1,240 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Model\Payment; + +use BridgeSDK\Constant\PaymentStatuses; +use BridgeSDK\Model\AbstractModel; +use InvalidArgumentException; + +class PaymentWebhookTransactionUpdated extends AbstractModel +{ + /** + * @var string + */ + private $paymentTransactionId; + + /** + * @var string + */ + private $paymentRequestId; + + /** + * @var ?string + */ + private $paymentLinkId; + + /** + * @var ?string + */ + private $clientReference; + + /** + * @var ?string + */ + private $endToEndId; + + /** + * @var string + */ + private $status; + + /** + * @var ?string + */ + private $statusReason; + + /** + * @return string + */ + public function getPaymentTransactionId() + { + return $this->paymentTransactionId; + } + + /** + * @param string $paymentTransactionId + * + * @return PaymentWebhookTransactionUpdated + */ + public function setPaymentTransactionId($paymentTransactionId) + { + if (true === \is_string($paymentTransactionId)) { + $this->paymentTransactionId = $paymentTransactionId; + + return $this; + } + + throw new InvalidArgumentException( + 'Payment transaction ID must be a string '.\gettype($paymentTransactionId).' is given.' + ); + } + + /** + * @return string + */ + public function getPaymentRequestId() + { + return $this->paymentRequestId; + } + + /** + * @param string $paymentRequestId + * + * @return PaymentWebhookTransactionUpdated + */ + public function setPaymentRequestId($paymentRequestId) + { + if (true === \is_string($paymentRequestId)) { + $this->paymentRequestId = $paymentRequestId; + + return $this; + } + + throw new InvalidArgumentException( + 'Payment request ID must be a string '.\gettype($paymentRequestId).' is given.' + ); + } + + /** + * @return null|string + */ + public function getPaymentLinkId() + { + return $this->paymentLinkId; + } + + /** + * @param null|string $paymentLinkId + * + * @return PaymentWebhookTransactionUpdated + */ + public function setPaymentLinkId($paymentLinkId) + { + if (true === \is_string($paymentLinkId) || null === $paymentLinkId) { + $this->paymentLinkId = $paymentLinkId; + + return $this; + } + + throw new InvalidArgumentException( + 'Payment link ID must be a string '.\gettype($paymentLinkId).' is given.' + ); + } + + /** + * @return null|string + */ + public function getClientReference() + { + return $this->clientReference; + } + + /** + * @param null|string $clientReference + * + * @return PaymentWebhookTransactionUpdated + */ + public function setClientReference($clientReference) + { + if (true === \is_string($clientReference) || null === $clientReference) { + $this->clientReference = $clientReference; + + return $this; + } + + throw new InvalidArgumentException( + 'Client reference must be a string '.\gettype($clientReference).' is given.' + ); + } + + /** + * @return null|string + */ + public function getEndToEndId() + { + return $this->endToEndId; + } + + /** + * @param null|string $endToEndId + * + * @return PaymentWebhookTransactionUpdated + */ + public function setEndToEndId($endToEndId) + { + if (true === \is_string($endToEndId) || null === $endToEndId) { + $this->endToEndId = $endToEndId; + + return $this; + } + + throw new InvalidArgumentException( + 'End to end id be a string '.\gettype($endToEndId).' is given.' + ); + } + + /** + * @return string + */ + public function getStatus() + { + return $this->status; + } + + /** + * @param string $status + * + * @return PaymentWebhookTransactionUpdated + */ + public function setStatus($status) + { + if (true === \is_string($status) && \in_array($status, PaymentStatuses::getAllStatuses(), true)) { + $this->status = $status; + + return $this; + } + + throw new InvalidArgumentException( + 'Status must be a string '.\gettype($status).' is given or status is not valid.' + ); + } + + /** + * @return null|string + */ + public function getStatusReason() + { + return $this->statusReason; + } + + /** + * @param null|string $statusReason + * + * @return PaymentWebhookTransactionUpdated + */ + public function setStatusReason($statusReason) + { + if (true === \is_string($statusReason) || null === $statusReason) { + $this->statusReason = $statusReason; + + return $this; + } + + throw new InvalidArgumentException( + 'Status reason must be a string '.\gettype($statusReason).' is given.' + ); + } +} diff --git a/src/Model/Payment/Transaction.php b/src/Model/Payment/Transaction.php old mode 100644 new mode 100755 index 43f8eb0..35d94fa --- a/src/Model/Payment/Transaction.php +++ b/src/Model/Payment/Transaction.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -16,7 +16,6 @@ namespace BridgeSDK\Model\Payment; use BridgeSDK\Constant\PaymentStatuses; -use BridgeSDK\Model\AbstractModel; use InvalidArgumentException; class Transaction extends CreatePaymentTransaction @@ -41,17 +40,19 @@ public function getId() /** * @param string $id + * * @return Transaction */ public function setId($id) { - if (is_string($id) === true) { + if (true === \is_string($id)) { $this->id = $id; + return $this; } throw new InvalidArgumentException( - 'Id must be a string ' . gettype($id) . ' is given.' + 'Id must be a string '.\gettype($id).' is given.' ); } @@ -65,17 +66,19 @@ public function getStatus() /** * @param string $status + * * @return Transaction */ public function setStatus($status) { - if (is_string($status) === true && in_array($status, PaymentStatuses::getAllStatuses())) { + if (true === \is_string($status) && \in_array($status, PaymentStatuses::getAllStatuses(), true)) { $this->status = $status; + return $this; } throw new InvalidArgumentException( - 'Status must be a string ' . gettype($status) . ' is given or status is not valid.' + 'Status must be a string '.\gettype($status).' is given or status is not valid.' ); } } diff --git a/src/Request/AbstractRequest.php b/src/Request/AbstractRequest.php old mode 100644 new mode 100755 index 5dd46a3..399e0e2 --- a/src/Request/AbstractRequest.php +++ b/src/Request/AbstractRequest.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -15,43 +15,44 @@ namespace BridgeSDK\Request; -use JsonSerializable; -use Psr\Http\Message\RequestInterface; use BridgeSDK\Model\AbstractModel; use BridgeSDK\Stream; use BridgeSDK\Uri\ApiUri; +use JsonSerializable; +use Psr\Http\Message\RequestInterface; /** - * API client + * API client. */ abstract class AbstractRequest implements RequestInterface, JsonSerializable { use MessageTrait; use RequestTrait; - /** - * @var AbstractModel - */ - private $body; - /** * @var string */ protected $response; /** - * @var array + * @var array */ protected $query = []; + /** + * @var AbstractModel + */ + private $body; + /** * @param array $headers Request headers - * @param string $version protocol version + * @param string $version protocol version + * @param mixed $query */ public function __construct(array $headers = [], $version = '1.1', $query = []) { $this->uri = new ApiUri(); - $this->uri = $this->uri->withPath('/v2' . $this->requestTarget); + $this->uri = $this->uri->withPath('/v2'.$this->requestTarget); $this->setQuery($query); if (!empty($this->getQuery())) { @@ -71,8 +72,7 @@ public function __construct(array $headers = [], $version = '1.1', $query = []) } /** - * Set Body From Model - * @param AbstractModel $body + * Set Body From Model. * * @return self */ @@ -81,7 +81,7 @@ public function setModel(AbstractModel $body) $json = json_encode($body->jsonSerialize(), JSON_PRETTY_PRINT); if (JSON_ERROR_NONE !== json_last_error()) { throw new \InvalidArgumentException( - 'json_encode error: ' . json_last_error_msg() + 'json_encode error: '.json_last_error_msg() ); } $new = clone $this; @@ -91,7 +91,7 @@ public function setModel(AbstractModel $body) } /** - * Set Body From Model + * Set Body From Model. * * @return string */ @@ -109,7 +109,7 @@ public function jsonSerialize() } /** - * @return array + * @return array */ public function getQuery() { @@ -117,18 +117,21 @@ public function getQuery() } /** - * @param array $query + * @param array $query + * * @return AbstractRequest */ protected function setQuery($query) { $this->query = $this->filterQuery(array_merge($this->query, $query)); + return $this; } /** - * @param array $query - * @return array + * @param array $query + * + * @return array */ protected function filterQuery($query) { diff --git a/src/Request/BankRequest.php b/src/Request/BankRequest.php old mode 100644 new mode 100755 index 67a8677..f68902c --- a/src/Request/BankRequest.php +++ b/src/Request/BankRequest.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -29,18 +29,18 @@ class BankRequest extends AbstractRequest protected $response = BankResponse::class; /** - * @param AbstractModel $body * @return AbstractRequest */ public function setModel(AbstractModel $body) { if ($body instanceof Bank) { - $this->uri = $this->uri->withPath(str_replace(':idBank', $body->getId(), $this->uri->getPath())) ; + $this->uri = $this->uri->withPath(str_replace(':idBank', (string) $body->getId(), $this->uri->getPath())); + return parent::setModel($body); } throw new InvalidArgumentException( - 'Body must be an instance of ' . Bank::class . ' ' . get_class($body) . ' given.' + 'Body must be an instance of '.Bank::class.' '.\get_class($body).' given.' ); } } diff --git a/src/Request/CreatePaymentRequest.php b/src/Request/CreatePaymentRequest.php old mode 100644 new mode 100755 index 89eb390..3f487f7 --- a/src/Request/CreatePaymentRequest.php +++ b/src/Request/CreatePaymentRequest.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -35,7 +35,7 @@ public function setModel(AbstractModel $body) } throw new InvalidArgumentException( - 'Body must be an instance of ' . CreatePayment::class . ' ' . get_class($body) . ' given.' + 'Body must be an instance of '.CreatePayment::class.' '.\get_class($body).' given.' ); } } diff --git a/src/Request/ListBanksRequest.php b/src/Request/ListBanksRequest.php old mode 100644 new mode 100755 index e2566c7..083a390 --- a/src/Request/ListBanksRequest.php +++ b/src/Request/ListBanksRequest.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -31,7 +31,7 @@ class ListBanksRequest extends AbstractRequest protected $method = 'GET'; /** - * @var array + * @var array */ protected $query = [ 'limit' => 500, @@ -45,12 +45,13 @@ class ListBanksRequest extends AbstractRequest protected $response = ListBanksResponse::class; /** - * @param array $query - * @return array + * @param array $query + * + * @return array */ protected function filterQuery($query) { - if ($query['after'] == '') { + if ('' === $query['after']) { unset($query['after']); } diff --git a/src/Request/MessageTrait.php b/src/Request/MessageTrait.php old mode 100644 new mode 100755 index dd67d5f..f91d230 --- a/src/Request/MessageTrait.php +++ b/src/Request/MessageTrait.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -15,8 +15,8 @@ namespace BridgeSDK\Request; -use Psr\Http\Message\StreamInterface; use BridgeSDK\Stream; +use Psr\Http\Message\StreamInterface; /** * Trait implementing functionality common to requests and responses. @@ -38,7 +38,7 @@ trait MessageTrait /** @var string */ protected $protocol = '1.1'; - /** @var StreamInterface|null */ + /** @var null|StreamInterface */ protected $stream; /** @@ -51,6 +51,8 @@ public function getProtocolVersion() /** * @inherit + * + * @param mixed $version */ public function withProtocolVersion($version) { @@ -74,18 +76,22 @@ public function getHeaders() /** * @inherit + * + * @param mixed $header */ public function hasHeader($header) { - return isset($this->headerNames[\strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')]); + return isset($this->headerNames[strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')]); } /** * @inherit + * + * @param mixed $header */ public function getHeader($header) { - $header = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); + $header = strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); if (!isset($this->headerNames[$header])) { return []; } @@ -97,19 +103,24 @@ public function getHeader($header) /** * @inherit + * + * @param mixed $header */ public function getHeaderLine($header) { - return \implode(', ', $this->getHeader($header)); + return implode(', ', $this->getHeader($header)); } /** * @inherit + * + * @param mixed $header + * @param mixed $value */ public function withHeader($header, $value) { $value = $this->validateAndTrimHeader($header, $value); - $normalized = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); + $normalized = strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); $new = clone $this; if (isset($new->headerNames[$normalized])) { @@ -123,6 +134,9 @@ public function withHeader($header, $value) /** * @inherit + * + * @param mixed $header + * @param mixed $value */ public function withAddedHeader($header, $value) { @@ -138,10 +152,12 @@ public function withAddedHeader($header, $value) /** * @inherit + * + * @param mixed $header */ public function withoutHeader($header) { - $normalized = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); + $normalized = strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); if (!isset($this->headerNames[$normalized])) { return $this; } @@ -181,7 +197,7 @@ public function withBody(StreamInterface $body) } /** - * Set headers + * Set headers. * * @param array $headers * @@ -196,10 +212,10 @@ public function setHeaders(array $headers) $header = (string) $header; } $value = $this->validateAndTrimHeader($header, $value); - $normalized = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); + $normalized = strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); if (isset($this->headerNames[$normalized])) { $header = $this->headerNames[$normalized]; - $this->headers[$header] = \array_merge($this->headers[$header], $value); + $this->headers[$header] = array_merge($this->headers[$header], $value); } else { $this->headerNames[$normalized] = $header; $this->headers[$header] = $value; @@ -224,6 +240,7 @@ public function setHeaders(array $headers) * field-value = *( ( %x21-7E / %x80-FF ) [ 1*( SP / HTAB ) ( %x21-7E / %x80-FF ) ] ) * * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 + * * @param mixed $header * @param mixed $values * @@ -231,17 +248,17 @@ public function setHeaders(array $headers) */ protected function validateAndTrimHeader($header, $values) { - if (!\is_string($header) || 1 !== \preg_match("@^[!#$%&'*+.^_`|~0-9A-Za-z-]+$@", $header)) { + if (!\is_string($header) || 1 !== preg_match("@^[!#$%&'*+.^_`|~0-9A-Za-z-]+$@", $header)) { throw new \InvalidArgumentException('Header name must be an RFC 7230 compatible string.'); } if (!\is_array($values)) { // This is simple, just one value. - if ((!\is_numeric($values) && !\is_string($values)) || 1 !== \preg_match("@^[ \t\x21-\x7E\x80-\xFF]*$@", (string) $values)) { + if ((!is_numeric($values) && !\is_string($values)) || 1 !== preg_match("@^[ \t\x21-\x7E\x80-\xFF]*$@", (string) $values)) { throw new \InvalidArgumentException('Header values must be RFC 7230 compatible strings.'); } - return [\trim((string) $values, " \t")]; + return [trim((string) $values, " \t")]; } if (empty($values)) { @@ -251,11 +268,11 @@ protected function validateAndTrimHeader($header, $values) // Assert Non empty array $returnValues = []; foreach ($values as $v) { - if ((!\is_numeric($v) && !\is_string($v)) || 1 !== \preg_match("@^[ \t\x21-\x7E\x80-\xFF]*$@", (string) $v)) { + if ((!is_numeric($v) && !\is_string($v)) || 1 !== preg_match("@^[ \t\x21-\x7E\x80-\xFF]*$@", (string) $v)) { throw new \InvalidArgumentException('Header values must be RFC 7230 compatible strings.'); } - $returnValues[] = \trim((string) $v, " \t"); + $returnValues[] = trim((string) $v, " \t"); } return $returnValues; diff --git a/src/Request/PaymentRequest.php b/src/Request/PaymentRequest.php old mode 100644 new mode 100755 index 1cebd78..271e927 --- a/src/Request/PaymentRequest.php +++ b/src/Request/PaymentRequest.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -32,11 +32,12 @@ public function setModel(AbstractModel $body) { if ($body instanceof Payment) { $this->uri = $this->uri->withPath(str_replace(':idPayment', $body->getId(), $this->uri->getPath())); + return parent::setModel($body); } throw new InvalidArgumentException( - 'Body must be an instance of ' . Payment::class . ' ' . get_class($body) . ' given.' + 'Body must be an instance of '.Payment::class.' '.\get_class($body).' given.' ); } } diff --git a/src/Request/RequestTrait.php b/src/Request/RequestTrait.php old mode 100644 new mode 100755 index 1f7aadb..4cc09dc --- a/src/Request/RequestTrait.php +++ b/src/Request/RequestTrait.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -25,7 +25,7 @@ trait RequestTrait /** @var string */ protected $method; - /** @var string|null */ + /** @var null|string */ protected $requestTarget; /** @var UriInterface */ @@ -41,7 +41,7 @@ public function getRequestTarget() $target = '/'; } if ('' !== $this->uri->getQuery()) { - $target .= '?' . $this->uri->getQuery(); + $target .= '?'.$this->uri->getQuery(); } return $target; @@ -49,7 +49,7 @@ public function getRequestTarget() public function withRequestTarget($requestTarget) { - if (\preg_match('#\s#', $requestTarget)) { + if (preg_match('#\s#', $requestTarget)) { throw new \InvalidArgumentException('Invalid request target provided; cannot contain whitespace'); } @@ -97,7 +97,7 @@ public function withUri(UriInterface $uri, $preserveHost = false) } /** - * update host from uri + * update host from uri. * * @return void */ @@ -108,7 +108,7 @@ protected function updateHostFromUri() } if (null !== ($port = $this->uri->getPort())) { - $host .= ':' . $port; + $host .= ':'.$port; } if (isset($this->headerNames['host'])) { diff --git a/src/Response/AbstractResponse.php b/src/Response/AbstractResponse.php old mode 100644 new mode 100755 index 6e5d826..0e50cc4 --- a/src/Response/AbstractResponse.php +++ b/src/Response/AbstractResponse.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -15,16 +15,16 @@ namespace BridgeSDK\Response; -use JsonSerializable; -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\StreamInterface; use BridgeSDK\Model\AbstractModel; -use BridgeSDK\Request\MessageTrait; use BridgeSDK\Model\ArrayCollection; +use BridgeSDK\Request\MessageTrait; use BridgeSDK\Stream; +use JsonSerializable; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\StreamInterface; /** - * API client + * API client. */ abstract class AbstractResponse implements ResponseInterface, JsonSerializable { @@ -35,38 +35,6 @@ abstract class AbstractResponse implements ResponseInterface, JsonSerializable */ protected $body; - /** - * Get body - * - * @return AbstractModel|ArrayCollection - */ - abstract public function getModel(); - - /** - * Gets the body of the message. - * - * @return StreamInterface|null Returns the body as a stream. - */ - public function getBody() - { - return $this->stream; - } - - /** - * Set body - * - * @param string $body - * - * @return self - */ - public function setBody($body) - { - $jsonBody = json_decode($body, true); - $this->body = $jsonBody; - - return $this; - } - /** @var array Map of standard HTTP status code/reason phrases */ private static $PHRASES = [ 100 => 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', @@ -83,11 +51,11 @@ public function setBody($body) private $statusCode; /** - * @param int $status Status code - * @param array $headers Response headers - * @param string|resource|StreamInterface|null $body Response body - * @param string $version Protocol version - * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) + * @param int $status Status code + * @param array $headers Response headers + * @param null|resource|StreamInterface|string $body Response body + * @param string $version Protocol version + * @param null|string $reason Reason phrase (when empty a default will be used based on the status code) */ public function __construct($status = 200, array $headers = [], $body = null, $version = '1.1', $reason = null) { @@ -107,6 +75,38 @@ public function __construct($status = 200, array $headers = [], $body = null, $v $this->protocol = $version; } + /** + * Get body. + * + * @return null|AbstractModel|ArrayCollection + */ + abstract public function getModel(); + + /** + * Gets the body of the message. + * + * @return null|StreamInterface returns the body as a stream + */ + public function getBody() + { + return $this->stream; + } + + /** + * Set body. + * + * @param string $body + * + * @return self + */ + public function setBody($body) + { + $jsonBody = json_decode($body, true); + $this->body = $jsonBody; + + return $this; + } + /** * @inherit */ @@ -125,17 +125,20 @@ public function getReasonPhrase() /** * @inherit + * + * @param mixed $code + * @param mixed $reasonPhrase */ public function withStatus($code, $reasonPhrase = '') { $code = (int) $code; if ($code < 100 || $code > 599) { - throw new \InvalidArgumentException(\sprintf('Status code has to be an integer between 100 and 599. A status code of %d was given', $code)); + throw new \InvalidArgumentException(sprintf('Status code has to be an integer between 100 and 599. A status code of %d was given', $code)); } $new = clone $this; $new->statusCode = $code; - if (empty($reasonPhrase) === true && isset(self::$PHRASES[$new->statusCode])) { + if (true === empty($reasonPhrase) && isset(self::$PHRASES[$new->statusCode])) { $reasonPhrase = self::$PHRASES[$new->statusCode]; } $new->reasonPhrase = $reasonPhrase; diff --git a/src/Response/BankResponse.php b/src/Response/BankResponse.php old mode 100644 new mode 100755 index 3f431ee..ff817fc --- a/src/Response/BankResponse.php +++ b/src/Response/BankResponse.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -24,21 +24,21 @@ class BankResponse extends AbstractResponse { /** - * @return AbstractModel|ArrayCollection + * @return null|AbstractModel|ArrayCollection */ public function getModel() { $content = (string) $this->stream; - if (empty($content) === true) { + if (true === empty($content)) { return new ArrayCollection(); } $output = json_decode($content, true); if (JSON_ERROR_NONE !== json_last_error()) { throw new InvalidArgumentException( - 'json_decode error: ' . json_last_error_msg() + 'json_decode error: '.json_last_error_msg() ); } - if (empty($output) === true) { + if (true === empty($output)) { return new Bank(); } diff --git a/src/Response/CallbackResponse.php b/src/Response/CallbackResponse.php deleted file mode 100644 index dd2b440..0000000 --- a/src/Response/CallbackResponse.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2022 (c) 202-ecommerce - * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) - * @link https://docs.bridgeapi.io/ - */ - -namespace BridgeSDK\Response; - -use InvalidArgumentException; -use BridgeSDK\Model\ArrayCollection; -use BridgeSDK\Model\Callback; -use BridgeSDK\Model\Error; - -class CallbackResponse extends AbstractResponse -{ - /** - * @inherit - */ - public function getModel() - { - $content = (string) $this->stream; - if (empty($content) === true) { - return new ArrayCollection(); - } - $output = json_decode($content, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new InvalidArgumentException( - 'json_decode error: ' . json_last_error_msg() - ); - } - if (empty($output) === true) { - return new ArrayCollection(); - } - - if ($this->getStatusCode() < 200 || $this->getStatusCode() > 299) { - $errorDetail = null; - - if ($this->getStatusCode() === 401) { - $errorDetail = 'Callback processing could not be execute because he does not come from YounitedPay API'; - } elseif ($this->getStatusCode() === 408) { - $errorDetail = 'Callback processing could not complete in a timely manner, callback will be retried later'; - } elseif ($this->getStatusCode() >= 400 && $this->getStatusCode() <= 499) { - $errorDetail = 'Callback processing failed due to a non transient error, callback will not be retried.'; - } elseif ($this->getStatusCode() >= 500 && $this->getStatusCode() <= 599) { - $errorDetail = 'Callback processing failed due to a transient error, callback will be retried later.'; - } - - return (new Error()) - ->setTitle($this->getReasonPhrase()) - ->setStatus($this->getStatusCode()) - ->setDetail($errorDetail); - } - - return (new Callback())->hydrate($output); - } -} diff --git a/src/Response/CreatePaymentResponse.php b/src/Response/CreatePaymentResponse.php old mode 100644 new mode 100755 index b8679a3..c3089bb --- a/src/Response/CreatePaymentResponse.php +++ b/src/Response/CreatePaymentResponse.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -23,28 +23,28 @@ class CreatePaymentResponse extends AbstractResponse { - public function getModel() { $content = (string) $this->stream; - if (empty($content) === true) { + if (true === empty($content)) { return new ArrayCollection(); } $output = json_decode($content, true); if (JSON_ERROR_NONE !== json_last_error()) { throw new InvalidArgumentException( - 'json_decode error: ' . json_last_error_msg() + 'json_decode error: '.json_last_error_msg() ); } - if (empty($output) === true) { + if (true === empty($output)) { return new CreatePaymentUrl(); } - if ($this->getStatusCode() == 400) { + if (400 === $this->getStatusCode()) { $errors = (new PaymentErrors())->hydrate($output); - if (!is_null($errors)) { + if (null !== $errors) { return $errors; } + return (new Error())->hydrate($output); } diff --git a/src/Response/DefaultResponse.php b/src/Response/DefaultResponse.php old mode 100644 new mode 100755 index 3da4070..7d8c1c5 --- a/src/Response/DefaultResponse.php +++ b/src/Response/DefaultResponse.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -18,12 +18,13 @@ use BridgeSDK\Model\Error; /** - * Default Response + * Default Response. */ class DefaultResponse extends AbstractResponse { /** - * Get isntance of a response + * Get isntance of a response. + * * @param string $classname * * @return DefaultResponse @@ -38,8 +39,6 @@ public static function getInstance($classname) */ public function getModel() { - $model = new Error(); - - return $model; + return new Error(); } } diff --git a/src/Response/ErrorResponse.php b/src/Response/ErrorResponse.php old mode 100644 new mode 100755 index 5460616..f1a42f1 --- a/src/Response/ErrorResponse.php +++ b/src/Response/ErrorResponse.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -18,7 +18,7 @@ use BridgeSDK\Model\Error; /** - * API client + * API client. */ class ErrorResponse extends AbstractResponse { diff --git a/src/Response/ListBanksResponse.php b/src/Response/ListBanksResponse.php old mode 100644 new mode 100755 index f6a9f8e..b478652 --- a/src/Response/ListBanksResponse.php +++ b/src/Response/ListBanksResponse.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -24,21 +24,21 @@ class ListBanksResponse extends AbstractResponse { /** - * @return AbstractModel|ArrayCollection + * @return null|AbstractModel|ArrayCollection */ public function getModel() { $content = (string) $this->stream; - if (empty($content) === true) { + if (true === empty($content)) { return new ArrayCollection(); } $output = json_decode($content, true); if (JSON_ERROR_NONE !== json_last_error()) { throw new InvalidArgumentException( - 'json_decode error: ' . json_last_error_msg() + 'json_decode error: '.json_last_error_msg() ); } - if (empty($output) === true) { + if (true === empty($output)) { return new ListBanks(); } diff --git a/src/Response/PaymentResponse.php b/src/Response/PaymentResponse.php old mode 100644 new mode 100755 index 92f0172..d977730 --- a/src/Response/PaymentResponse.php +++ b/src/Response/PaymentResponse.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -15,7 +15,6 @@ namespace BridgeSDK\Response; - use BridgeSDK\Model\AbstractModel; use BridgeSDK\Model\ArrayCollection; use BridgeSDK\Model\Error; @@ -26,29 +25,29 @@ class PaymentResponse extends AbstractResponse { /** - * Get body + * Get body. * - * @return AbstractModel|ArrayCollection + * @return null|AbstractModel|ArrayCollection */ public function getModel() { $content = (string) $this->stream; - if (empty($content) === true) { + if (true === empty($content)) { return new ArrayCollection(); } $output = json_decode($content, true); if (JSON_ERROR_NONE !== json_last_error()) { throw new InvalidArgumentException( - 'json_decode error: ' . json_last_error_msg() + 'json_decode error: '.json_last_error_msg() ); } - if (empty($output) === true) { + if (true === empty($output)) { return new Payment(); } - if ($this->getStatusCode() == 404) { + if (404 === $this->getStatusCode()) { $errors = (new PaymentErrors())->hydrate($output); - if (!is_null($errors)) { + if (null !== $errors) { return $errors; } @@ -61,4 +60,4 @@ public function getModel() return (new Payment())->hydrate($output); } -} \ No newline at end of file +} diff --git a/src/Response/ResponseBuilder.php b/src/Response/ResponseBuilder.php old mode 100644 new mode 100755 index 1c94f87..c2759de --- a/src/Response/ResponseBuilder.php +++ b/src/Response/ResponseBuilder.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -18,23 +18,21 @@ use InvalidArgumentException; /** - * Response Builder + * Response Builder. * * Build a PSR-7 Response object */ class ResponseBuilder { /** - * PSR-7 Response + * PSR-7 Response. * * @var AbstractResponse */ protected $response; /** - * Create a Response Builder - * - * @param AbstractResponse $response + * Create a Response Builder. */ public function __construct(AbstractResponse $response) { @@ -42,7 +40,7 @@ public function __construct(AbstractResponse $response) } /** - * Return the response + * Return the response. * * @return AbstractResponse */ @@ -52,9 +50,9 @@ public function getResponse() } /** - * Set the response + * Set the response. * - * @param AbstractResponse $response Response object + * @param AbstractResponse $response Response object * * @return void */ @@ -64,22 +62,23 @@ public function setResponse(AbstractResponse $response) } /** - * Add response header from header line string + * Add response header from header line string. * - * @param string $header_line Response header line string + * @param string $header_line Response header line string * - * @return self $this - * @throws InvalidArgumentException Invalid header line argument + * @throws InvalidArgumentException Invalid header line argument + * + * @return static */ public function addHeader($header_line) { $header_parts = explode(':', $header_line, 2); - if (count($header_parts) !== 2) { - throw new InvalidArgumentException("'$header_line' is not a valid HTTP header line"); + if (2 !== \count($header_parts)) { + throw new InvalidArgumentException("'{$header_line}' is not a valid HTTP header line"); } - $header_name = trim($header_parts[0]); + $header_name = trim($header_parts[0]); $header_value = trim($header_parts[1]); if ($this->response->hasHeader($header_name)) { @@ -92,12 +91,13 @@ public function addHeader($header_line) } /** - * Set response headers from header line array + * Set response headers from header line array. * * @param array $headers Array of header lines * + * @throws InvalidArgumentException Invalid status code argument value + * * @return self $this - * @throws InvalidArgumentException Invalid status code argument value */ public function setHeadersFromArray(array $headers) { @@ -108,7 +108,7 @@ public function setHeadersFromArray(array $headers) foreach ($headers as $header) { $header_line = trim($header); - if ($header_line === '') { + if ('' === $header_line) { continue; } @@ -119,27 +119,29 @@ public function setHeadersFromArray(array $headers) } /** - * Set reponse status + * Set reponse status. * - * @param string $statusLine Response status line string + * @param string $statusLine Response status line string * - * @return self $this * @throws InvalidArgumentException Invalid status line argument + * + * @return self $this */ public function setStatus($statusLine) { $statusParts = explode(' ', $statusLine, 3); - $partsCount = count($statusParts); + $partsCount = \count($statusParts); - if ($partsCount < 2 || strpos(strtoupper($statusParts[0]), 'HTTP/') !== 0) { - throw new InvalidArgumentException("'$statusLine' is not a valid HTTP status line"); + if ($partsCount < 2 || !str_starts_with(strtoupper($statusParts[0]), 'HTTP/')) { + throw new InvalidArgumentException("'{$statusLine}' is not a valid HTTP status line"); } $reasonPhrase = ($partsCount > 2 ? $statusParts[2] : ''); $this->response = $this->response - ->withStatus((int)$statusParts[1], $reasonPhrase) - ->withProtocolVersion(substr($statusParts[0], 5)); + ->withStatus((int) $statusParts[1], $reasonPhrase) + ->withProtocolVersion(substr($statusParts[0], 5)) + ; return $this; } diff --git a/src/Response/WebhookResponse.php b/src/Response/WebhookResponse.php new file mode 100755 index 0000000..980c1a0 --- /dev/null +++ b/src/Response/WebhookResponse.php @@ -0,0 +1,47 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace BridgeSDK\Response; + +use BridgeSDK\Model\ArrayCollection; +use BridgeSDK\Model\Error; +use BridgeSDK\Model\Payment\PaymentWebhook; +use InvalidArgumentException; + +class WebhookResponse extends AbstractResponse +{ + public function getModel() + { + $content = (string) $this->stream; + if (true === empty($content)) { + return new ArrayCollection(); + } + $output = json_decode($content, true); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new InvalidArgumentException( + 'json_decode error: '.json_last_error_msg() + ); + } + if (true === empty($output)) { + return new ArrayCollection(); + } + + if ($this->getStatusCode() < 200 || $this->getStatusCode() > 299) { + return (new Error())->hydrate($output); + } + + return (new PaymentWebhook())->hydrate($output); + } +} diff --git a/src/Service/AbstractClientApiService.php b/src/Service/AbstractClientApiService.php old mode 100644 new mode 100755 index b4d5e92..4a7f200 --- a/src/Service/AbstractClientApiService.php +++ b/src/Service/AbstractClientApiService.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -15,11 +15,11 @@ namespace BridgeSDK\Service; -use Psr\Http\Message\ResponseInterface; use BridgeSDK\Client; use BridgeSDK\Model\AbstractModel; use BridgeSDK\Request\AbstractRequest; use BridgeSDK\Response\ErrorResponse; +use Psr\Http\Message\ResponseInterface; abstract class AbstractClientApiService { @@ -28,49 +28,25 @@ abstract class AbstractClientApiService */ protected $client; - /** - * @var bool - */ - protected $enableTest = false; - - /** - * @return $this - */ - public function enableTest() - { - $new = clone $this; - - $new->enableTest = true; - - return $new; - } - - /** - * @param Client $client - */ public function __construct(Client $client) { $this->client = $client; } /** - * @param AbstractModel|null $body - * @param AbstractRequest $request + * @param null|AbstractModel $body * * @return ResponseInterface */ protected function call($body, AbstractRequest $request) { try { - if (empty($body) === false) { + if (false === empty($body)) { $request = $request->setModel($body); } - if ($this->enableTest) { - $request = $request->enableSandbox(); - } $response = $this->client->sendRequest($request); } catch (\Exception $e) { - $message = $e->getMessage() . $e->getFile() . ':' . $e->getLine(). $e->getTraceAsString(); + $message = $e->getMessage().$e->getFile().':'.$e->getLine().$e->getTraceAsString(); $response = (new ErrorResponse(400, [], null, '1.1', $message)); } diff --git a/src/Service/ClientApiService.php b/src/Service/ClientApiService.php old mode 100644 new mode 100755 index 0765b67..fdb0a2d --- a/src/Service/ClientApiService.php +++ b/src/Service/ClientApiService.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -15,143 +15,70 @@ namespace BridgeSDK\Service; +use BridgeSDK\Model\Bank\Bank; +use BridgeSDK\Model\Payment\CreatePayment; +use BridgeSDK\Model\Payment\Payment; +use BridgeSDK\Request\BankRequest; +use BridgeSDK\Request\CreatePaymentRequest; +use BridgeSDK\Request\ListBanksRequest; +use BridgeSDK\Request\PaymentRequest; +use BridgeSDK\Response\ErrorResponse; use Psr\Http\Message\ResponseInterface; -use BridgeSDK\Model\Basket; -use BridgeSDK\Model\BestPrice; -use BridgeSDK\Model\CancelContract; -use BridgeSDK\Model\ConfirmContract; -use BridgeSDK\Model\InitializeContract; -use BridgeSDK\Model\LoadContract; -use BridgeSDK\Model\MerchantOrderContext; -use BridgeSDK\Model\MerchantUrls; -use BridgeSDK\Model\PersonalInformation; -use BridgeSDK\Model\WithdrawContract; -use BridgeSDK\Request\AvailableMaturitiesRequest; -use BridgeSDK\Request\BestPriceRequest; -use BridgeSDK\Request\CancelContractRequest; -use BridgeSDK\Request\ConfirmContractRequest; -use BridgeSDK\Request\InitializeContractRequest; -use BridgeSDK\Request\LoadContractRequest; -use BridgeSDK\Request\WithdrawContractRequest; /** - * Client Api Service Class + * Client Api Service Class. */ class ClientApiService extends AbstractClientApiService { /** - * @param float $borrowedAmount - * - * @return ResponseInterface + * @return ErrorResponse|ResponseInterface */ - public function getBestPrice($borrowedAmount) + public function getListBanks() { - $model = (new BestPrice()) - ->setBorrowedAmount($borrowedAmount); - - $request = new BestPriceRequest(); + $request = new ListBanksRequest(); - return $this->call($model, $request); + return $this->call(null, $request); } /** - * @param int $requestMaturity - * @param PersonalInformation $personalInformation - * @param Basket $basket - * @param MerchantUrls $merchantUrls - * @param MerchantOrderContext $merchantOrderContext + * @param int $id * - * @return ResponseInterface + * @return ErrorResponse|ResponseInterface */ - public function initializeContract($requestMaturity, PersonalInformation $personalInformation, Basket $basket, MerchantUrls $merchantUrls, MerchantOrderContext $merchantOrderContext) + public function getBankById($id) { - $model = (new InitializeContract()) - ->setRequestedMaturity($requestMaturity) - ->setPersonalInformation($personalInformation) - ->setBasket($basket) - ->setMerchantUrls($merchantUrls) - ->setMerchantOrderContext($merchantOrderContext); + $model = (new Bank()) + ->setId($id) + ; - $request = new InitializeContractRequest(); + $request = new BankRequest(); return $this->call($model, $request); } /** - * @param string $contractReference - * @param string|null $merchantOrderId + * @param string $id * - * @return ResponseInterface + * @return ErrorResponse|ResponseInterface */ - public function confirmContract($contractReference, $merchantOrderId = null) + public function getPayment($id) { - $model = (new ConfirmContract()) - ->setContractReference($contractReference) - ->setMerchantOrderId($merchantOrderId); + $model = (new Payment()) + ->setId($id) + ; - $request = new ConfirmContractRequest(); + $request = new PaymentRequest(); return $this->call($model, $request); } /** - * @param string $contractReference - * - * @return ResponseInterface + * @return ErrorResponse|ResponseInterface */ - public function cancelContract($contractReference) + public function createPayment(CreatePayment $createPayment) { - $model = (new CancelContract()) - ->setContractReference($contractReference); - - $request = new CancelContractRequest(); + $request = new CreatePaymentRequest(); - return $this->call($model, $request); - } - - /** - * Set amount to null for a complete withdraw or set a value for a partial withdraw. - * - * @param string $contractReference - * @param float|null $amount - * - * @return ResponseInterface - */ - public function withdrawContract($contractReference, $amount = null) - { - $model = (new WithdrawContract()) - ->setContractReference($contractReference) - ->setAmount($amount); - - $request = new WithdrawContractRequest(); - - return $this->call($model, $request); - } - - /** - * @param string $contractReference - * - * @return ResponseInterface - */ - public function loadContract($contractReference) - { - $model = (new LoadContract()) - ->setContractReference($contractReference); - - $request = new LoadContractRequest(); - - return $this->call($model, $request); - } - - /** - * @return ResponseInterface - */ - public function getAvailableMaturities() - { - $model = null; - - $request = new AvailableMaturitiesRequest(); - - return $this->call($model, $request); + return $this->call($createPayment, $request); } } diff --git a/src/Stream.php b/src/Stream.php old mode 100644 new mode 100755 index fd0e3c3..a5112e9 --- a/src/Stream.php +++ b/src/Stream.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -15,30 +15,32 @@ namespace BridgeSDK; +use function clearstatcache; + use Exception; -use InvalidArgumentException; -use Psr\Http\Message\StreamInterface; -use Psr\Http\Message\UriInterface; -use RuntimeException; -use function clearstatcache; use function fclose; use function feof; use function fseek; use function fstat; use function ftell; -use function is_resource; -use function var_export; + +use InvalidArgumentException; +use Psr\Http\Message\StreamInterface; +use Psr\Http\Message\UriInterface; +use RuntimeException; use const SEEK_CUR; use const SEEK_SET; +use function var_export; + /** * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md */ class Stream implements StreamInterface { - /** @var resource|null A resource reference */ + /** @var null|resource A resource reference */ private $stream; /** @var bool */ @@ -50,10 +52,10 @@ class Stream implements StreamInterface /** @var bool */ private $writable; - /** @var array|mixed|void|bool|null */ + /** @var null|array|bool|mixed|void */ private $uri; - /** @var int|null */ + /** @var null|int */ private $size; /** @var array Hash of readable and writable stream types */ @@ -72,10 +74,32 @@ class Stream implements StreamInterface ], ]; + /** + * Closes the stream when the destructed. + */ + public function __destruct() + { + $this->close(); + } + + /** + * @throws Exception + * + * @return string + */ + public function __toString() + { + if ($this->isSeekable()) { + $this->seek(0); + } + + return $this->getContents(); + } + /** * Creates a new PSR-7 stream. * - * @param string|resource|StreamInterface $body + * @param resource|StreamInterface|string $body * * @return StreamInterface */ @@ -84,9 +108,9 @@ public static function create($body = '') if ($body instanceof StreamInterface) { return $body; } - if (is_string($body)) { + if (\is_string($body)) { $resource = fopen('php://temp', 'rw+'); - if ($resource === false) { + if (false === $resource) { $new = new self(); $new->stream = null; @@ -96,7 +120,7 @@ public static function create($body = '') $body = $resource; } - if (is_resource($body)) { + if (\is_resource($body)) { $new = new self(); $new->stream = $body; $meta = stream_get_meta_data($new->stream); @@ -108,40 +132,14 @@ public static function create($body = '') } throw new InvalidArgumentException( - 'Body must be a ressource but ' . gettype($body) . ' is given.' + 'Body must be a resource but '.\gettype($body).' is given.' ); } - /** - * Closes the stream when the destructed. - * - * @return void - */ - public function __destruct() - { - $this->close(); - } - - /** - * @return string - * @throws Exception - */ - public function __toString() - { - if ($this->isSeekable()) { - $this->seek(0); - } - - return $this->getContents(); - } - - /** - * @return void - */ public function close() { if (isset($this->stream)) { - if (is_resource($this->stream)) { + if (\is_resource($this->stream)) { fclose($this->stream); } $this->detach(); @@ -149,7 +147,7 @@ public function close() } /** - * @return resource|null + * @return null|resource */ public function detach() { @@ -158,28 +156,15 @@ public function detach() } $result = $this->stream; - unset($this->stream); + $this->stream = null; $this->size = $this->uri = null; $this->readable = $this->writable = $this->seekable = false; return $result; } - /** - * get Uri - * - * @return UriInterface - */ - private function getUri() - { - if (false !== $this->uri) { - $this->uri = empty($this->getMetadata('uri')) ? false : $this->getMetadata('uri'); - } - - return $this->uri; - } /** - * @return int|mixed|null + * @return null|int|mixed */ public function getSize() { @@ -192,12 +177,12 @@ public function getSize() } // Clear the stat cache if the stream has a URI - if (empty($uri = $this->getUri()) === false) { + if (false === empty($uri = $this->getUri())) { clearstatcache(true, $uri); } $stats = (array) fstat($this->stream); - if (empty($stats['size']) === false) { + if (false === empty($stats['size'])) { $this->size = $stats['size']; return $this->size; @@ -219,7 +204,7 @@ public function tell() throw new RuntimeException( sprintf( 'Unable to determine stream position: %s', - empty(error_get_last()) === false ? error_get_last()['message'] : '' + false === empty(error_get_last()) ? error_get_last()['message'] : '' ) ); } @@ -244,14 +229,14 @@ public function isSeekable() } /** - * Seek on stream + * Seek on stream. * * @param int $offset * @param int $whence * - * @return void - * * @throws RuntimeException + * + * @return void */ public function seek($offset, $whence = SEEK_SET) { @@ -264,12 +249,12 @@ public function seek($offset, $whence = SEEK_SET) } if (-1 === fseek($this->stream, $offset, $whence)) { - throw new RuntimeException('Unable to seek to stream position "' . $offset . '" with whence ' . var_export($whence, true)); + throw new RuntimeException('Unable to seek to stream position "'.$offset.'" with whence '.var_export($whence, true)); } } /** - * Rewind stream + * Rewind stream. * * @return void */ @@ -289,9 +274,9 @@ public function isWritable() /** * @param string $string * - * @return false|int - * * @throws RuntimeException + * + * @return false|int */ public function write($string) { @@ -310,7 +295,7 @@ public function write($string) throw new RuntimeException( sprintf( 'Unable to write stream position: %s', - empty(error_get_last()) === false ? error_get_last()['message'] : '' + false === empty(error_get_last()) ? error_get_last()['message'] : '' ) ); } @@ -329,9 +314,9 @@ public function isReadable() /** * @param int $length * - * @return false|string - * * @throws RuntimeException + * + * @return false|string */ public function read($length) { @@ -347,7 +332,7 @@ public function read($length) throw new RuntimeException( sprintf( 'Unable to read from stream: %s', - empty(error_get_last()) === false ? error_get_last()['message'] : '' + false === empty(error_get_last()) ? error_get_last()['message'] : '' ) ); } @@ -367,7 +352,7 @@ public function getContents() throw new RuntimeException( sprintf( 'Unable to read from stream: %s', - empty(error_get_last()) === false ? error_get_last()['message'] : '' + false === empty(error_get_last()) ? error_get_last()['message'] : '' ) ); } @@ -378,7 +363,7 @@ public function getContents() /** * @param string $key * - * @return array|mixed|null + * @return null|array|mixed */ public function getMetadata($key = null) { @@ -394,4 +379,18 @@ public function getMetadata($key = null) return $meta[$key] ? null : $meta[$key]; } + + /** + * get Uri. + * + * @return UriInterface + */ + private function getUri() + { + if (false !== $this->uri) { + $this->uri = empty($this->getMetadata('uri')) ? false : $this->getMetadata('uri'); + } + + return $this->uri; + } } diff --git a/src/Uri/AbstractUri.php b/src/Uri/AbstractUri.php old mode 100644 new mode 100755 index 80964d2..9b598fc --- a/src/Uri/AbstractUri.php +++ b/src/Uri/AbstractUri.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -18,19 +18,10 @@ use Psr\Http\Message\UriInterface; /** - * Uri + * Uri. */ abstract class AbstractUri implements UriInterface { - /** @var array SCHEMES. */ - private static $SCHEMES = ['http' => 80, 'https' => 443]; - - /** @var string CHAR_UNRESERVED. */ - private static $CHAR_UNRESERVED = 'a-zA-Z0-9_\-\.~'; - - /** @var string CHAR_SUB_DELIMS. */ - private static $CHAR_SUB_DELIMS = '!\$&\'\(\)\*\+,;='; - /** @var string Uri scheme. */ protected $scheme = 'https'; @@ -52,36 +43,48 @@ abstract class AbstractUri implements UriInterface /** @var string Uri fragment. */ protected $fragment = ''; + /** + * @var string + */ protected $version = ''; + /** @var array SCHEMES. */ + private static $SCHEMES = ['http' => 80, 'https' => 443]; + + /** @var string CHAR_UNRESERVED. */ + private static $CHAR_UNRESERVED = 'a-zA-Z0-9_\-\.~'; + + /** @var string CHAR_SUB_DELIMS. */ + private static $CHAR_SUB_DELIMS = '!\$&\'\(\)\*\+,;='; + /** - * Constructor + * Constructor. * * @param string $uri uri */ public function __construct($uri = '') { if ('' !== $uri) { - if (false === $parts = \parse_url($uri)) { - throw new \InvalidArgumentException(\sprintf('Unable to parse URI: "%s"', $uri)); + if (false === $parts = parse_url($uri)) { + throw new \InvalidArgumentException(sprintf('Unable to parse URI: "%s"', $uri)); } // Apply parse_url parts to a URI. - $this->scheme = isset($parts['scheme']) ? \strtr($parts['scheme'], 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : ''; + $this->scheme = isset($parts['scheme']) ? strtr($parts['scheme'], 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : ''; $this->userInfo = empty($parts['user']) ? '' : $parts['user']; - $this->host = isset($parts['host']) ? \strtr($parts['host'], 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : ''; + $this->host = isset($parts['host']) ? strtr($parts['host'], 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : ''; $this->port = isset($parts['port']) ? $this->filterPort($parts['port']) : null; $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : ''; $this->query = isset($parts['query']) ? $this->filterQueryAndFragment($parts['query']) : ''; $this->fragment = isset($parts['fragment']) ? $this->filterQueryAndFragment($parts['fragment']) : ''; if (isset($parts['pass'])) { - $this->userInfo .= ':' . $parts['pass']; + $this->userInfo .= ':'.$parts['pass']; } } } /** - * __toString + * __toString. * * @return string */ @@ -91,7 +94,7 @@ public function __toString() } /** - * Get Scheme + * Get Scheme. * * @return string */ @@ -111,11 +114,11 @@ public function getAuthority() $authority = $this->host; if ('' !== $this->userInfo) { - $authority = $this->userInfo . '@' . $authority; + $authority = $this->userInfo.'@'.$authority; } if (null !== $this->port) { - $authority .= ':' . $this->port; + $authority .= ':'.$this->port; } return $authority; @@ -171,6 +174,8 @@ public function getFragment() /** * @inherit + * + * @param mixed $scheme */ public function withScheme($scheme) { @@ -178,7 +183,7 @@ public function withScheme($scheme) throw new \InvalidArgumentException('Scheme must be a string'); } - if ($this->scheme === $scheme = \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')) { + if ($this->scheme === $scheme = strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')) { return $this; } @@ -191,12 +196,15 @@ public function withScheme($scheme) /** * @inherit + * + * @param mixed $user + * @param null|mixed $password */ public function withUserInfo($user, $password = null) { $info = $user; if (null !== $password && '' !== $password) { - $info .= ':' . $password; + $info .= ':'.$password; } if ($this->userInfo === $info) { @@ -211,6 +219,8 @@ public function withUserInfo($user, $password = null) /** * @inherit + * + * @param mixed $host */ public function withHost($host) { @@ -218,7 +228,7 @@ public function withHost($host) throw new \InvalidArgumentException('Host must be a string'); } - if ($this->host === $host = \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')) { + if ($this->host === $host = strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')) { return $this; } @@ -230,6 +240,8 @@ public function withHost($host) /** * @inherit + * + * @param mixed $port */ public function withPort($port) { @@ -245,6 +257,8 @@ public function withPort($port) /** * @inherit + * + * @param mixed $path */ public function withPath($path) { @@ -260,6 +274,8 @@ public function withPath($path) /** * @inherit + * + * @param mixed $query */ public function withQuery($query) { @@ -275,6 +291,8 @@ public function withQuery($query) /** * @inherit + * + * @param mixed $fragment */ public function withFragment($fragment) { @@ -289,7 +307,7 @@ public function withFragment($fragment) } /** - * create Uri String + * create Uri String. * * @param string $scheme * @param string $authority @@ -303,24 +321,24 @@ protected static function createUriString($scheme, $authority, $path, $query, $f { $uri = ''; if ('' !== $scheme) { - $uri .= $scheme . ':'; + $uri .= $scheme.':'; } if ('' !== $authority) { - $uri .= '//' . $authority; + $uri .= '//'.$authority; } if ('' !== $path) { if (!empty($path[0]) && '/' !== $path[0]) { if ('' !== $authority) { // If the path is rootless and an authority is present, the path MUST be prefixed by "/" - $path = '/' . $path; + $path = '/'.$path; } } elseif (isset($path[1]) && '/' === $path[1]) { if ('' === $authority) { // If the path is starting with more than one "/" and no authority is present, the // starting slashes MUST be reduced to one. - $path = '/' . \ltrim($path, '/'); + $path = '/'.ltrim($path, '/'); } } @@ -328,20 +346,20 @@ protected static function createUriString($scheme, $authority, $path, $query, $f } if ('' !== $query) { - $uri .= '?' . $query; + $uri .= '?'.$query; } if ('' !== $fragment) { - $uri .= '#' . $fragment; + $uri .= '#'.$fragment; } return $uri; } /** - * Validate port + * Validate port. * - * @param string $scheme + * @param string $scheme * @param null|int $port * * @return bool @@ -352,12 +370,13 @@ protected static function isNonStandardPort($scheme, $port) } /** - * Validate port + * Validate port. * * @param null|int $port * - * @return int|null * @throws \InvalidArgumentException + * + * @return null|int */ protected function filterPort($port) { @@ -366,20 +385,21 @@ protected function filterPort($port) } $port = (int) $port; - if (0 > $port || 0xffff < $port) { - throw new \InvalidArgumentException(\sprintf('Invalid port: %d. Must be between 0 and 65535', $port)); + if (0 > $port || 0xFFFF < $port) { + throw new \InvalidArgumentException(sprintf('Invalid port: %d. Must be between 0 and 65535', $port)); } return self::isNonStandardPort($this->scheme, $port) ? $port : null; } /** - * Validate QueryAndFragment + * Validate QueryAndFragment. * * @param string $path * - * @return string * @throws \InvalidArgumentException + * + * @return string */ protected function filterPath($path) { @@ -387,16 +407,17 @@ protected function filterPath($path) throw new \InvalidArgumentException('Path must be a string'); } - return (string) \preg_replace_callback('/(?:[^' . self::$CHAR_UNRESERVED . self::$CHAR_SUB_DELIMS . '%:@\/]++|%(?![A-Fa-f0-9]{2}))/', [__CLASS__, 'rawurlencodeMatchZero'], $path); + return (string) preg_replace_callback('/(?:[^'.self::$CHAR_UNRESERVED.self::$CHAR_SUB_DELIMS.'%:@\/]++|%(?![A-Fa-f0-9]{2}))/', [__CLASS__, 'rawurlencodeMatchZero'], $path); } /** - * Validate QueryAndFragment + * Validate QueryAndFragment. * * @param string $str * - * @return string * @throws \InvalidArgumentException + * + * @return string */ protected function filterQueryAndFragment($str) { @@ -404,11 +425,11 @@ protected function filterQueryAndFragment($str) throw new \InvalidArgumentException('Query and fragment must be a string'); } - return (string) \preg_replace_callback('/(?:[^' . self::$CHAR_UNRESERVED . self::$CHAR_SUB_DELIMS . '%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/', [__CLASS__, 'rawurlencodeMatchZero'], $str); + return (string) preg_replace_callback('/(?:[^'.self::$CHAR_UNRESERVED.self::$CHAR_SUB_DELIMS.'%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/', [__CLASS__, 'rawurlencodeMatchZero'], $str); } /** - * Raw urlencode Match Zero + * Raw urlencode Match Zero. * * @param array $match * @@ -416,6 +437,6 @@ protected function filterQueryAndFragment($str) */ protected static function rawurlencodeMatchZero(array $match) { - return \rawurlencode($match[0]); + return rawurlencode($match[0]); } } diff --git a/src/Uri/ApiUri.php b/src/Uri/ApiUri.php old mode 100644 new mode 100755 index d486fad..6dc524f --- a/src/Uri/ApiUri.php +++ b/src/Uri/ApiUri.php @@ -6,7 +6,7 @@ * PHP version 5.6+ * * @category BridgeSDK - * @package EcommerceBridgeSDK + * @package Ecommercebridgesdk * @author 202-ecommerce * @copyright 2022 (c) 202-ecommerce * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) @@ -16,10 +16,10 @@ namespace BridgeSDK\Uri; /** - * Sandbox Uri + * Sandbox Uri. */ class ApiUri extends AbstractUri { - /** @var string $host */ + /** @var string */ protected $host = 'api.bridgeapi.io'; } diff --git a/tests/Integration/IntegrationTestCase.php b/tests/Integration/IntegrationTestCase.php old mode 100644 new mode 100755 diff --git a/tests/Integration/Request/BankRequestTest.php b/tests/Integration/Request/BankRequestIntegrationTest.php old mode 100644 new mode 100755 similarity index 97% rename from tests/Integration/Request/BankRequestTest.php rename to tests/Integration/Request/BankRequestIntegrationTest.php index 450c560..ade4a77 --- a/tests/Integration/Request/BankRequestTest.php +++ b/tests/Integration/Request/BankRequestIntegrationTest.php @@ -21,7 +21,7 @@ use BridgeSDK\Request\BankRequest; use Tests\Integration\IntegrationTestCase; -class BankRequestTest extends IntegrationTestCase +class BankRequestIntegrationTest extends IntegrationTestCase { /** * @dataProvider getApiCallBankOkDataProvider diff --git a/tests/Integration/Request/CreatePaymentRequestTest.php b/tests/Integration/Request/CreatePaymentRequestIntegrationTest.php old mode 100644 new mode 100755 similarity index 97% rename from tests/Integration/Request/CreatePaymentRequestTest.php rename to tests/Integration/Request/CreatePaymentRequestIntegrationTest.php index 1a0f322..2332ef4 --- a/tests/Integration/Request/CreatePaymentRequestTest.php +++ b/tests/Integration/Request/CreatePaymentRequestIntegrationTest.php @@ -13,7 +13,7 @@ * @link https://docs.bridgeapi.io/ */ -namespace Integration\Request; +namespace Tests\Integration\Request; use BridgeSDK\Client; use BridgeSDK\Model\Error; @@ -25,7 +25,7 @@ use BridgeSDK\Request\CreatePaymentRequest; use Tests\Integration\IntegrationTestCase; -class CreatePaymentRequestTest extends IntegrationTestCase +class CreatePaymentRequestIntegrationTest extends IntegrationTestCase { public function testApiCallCreatePaymentOk() { diff --git a/tests/Integration/Request/ListBanksRequestTest.php b/tests/Integration/Request/ListBanksRequestIntegrationTest.php old mode 100644 new mode 100755 similarity index 95% rename from tests/Integration/Request/ListBanksRequestTest.php rename to tests/Integration/Request/ListBanksRequestIntegrationTest.php index 17622a6..d3c2633 --- a/tests/Integration/Request/ListBanksRequestTest.php +++ b/tests/Integration/Request/ListBanksRequestIntegrationTest.php @@ -13,7 +13,7 @@ * @link https://docs.bridgeapi.io/ */ -namespace Integration\Request; +namespace Tests\Integration\Request; use BridgeSDK\Client; use BridgeSDK\Model\Error; @@ -21,7 +21,7 @@ use BridgeSDK\Request\ListBanksRequest; use Tests\Integration\IntegrationTestCase; -class ListBanksRequestTest extends IntegrationTestCase +class ListBanksRequestIntegrationTest extends IntegrationTestCase { public function testApiCallBanksOk() { diff --git a/tests/Integration/Request/PaymentRequestTest.php b/tests/Integration/Request/PaymentRequestIntegrationTest.php old mode 100644 new mode 100755 similarity index 94% rename from tests/Integration/Request/PaymentRequestTest.php rename to tests/Integration/Request/PaymentRequestIntegrationTest.php index 34a45ba..55fa43b --- a/tests/Integration/Request/PaymentRequestTest.php +++ b/tests/Integration/Request/PaymentRequestIntegrationTest.php @@ -13,7 +13,7 @@ * @link https://docs.bridgeapi.io/ */ -namespace Integration\Request; +namespace Tests\Integration\Request; use BridgeSDK\Client; use BridgeSDK\Constant\PaymentStatuses; @@ -21,7 +21,7 @@ use BridgeSDK\Request\PaymentRequest; use Tests\Integration\IntegrationTestCase; -class PaymentRequestTest extends IntegrationTestCase +class PaymentRequestIntegrationTest extends IntegrationTestCase { /** * @dataProvider getApiCallPaymentOkDataProvider diff --git a/tests/Request/BankRequestTest.php b/tests/Request/BankRequestTest.php new file mode 100755 index 0000000..15dd0aa --- /dev/null +++ b/tests/Request/BankRequestTest.php @@ -0,0 +1,99 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace Tests\Request; + +use BridgeSDK\Client; +use BridgeSDK\Model\Bank\Bank; +use BridgeSDK\Request\BankRequest; +use BridgeSDK\Response\BankResponse; +use BridgeSDK\Model\Error; +use PHPUnit\Framework\TestCase; + +class BankRequestTest extends TestCase +{ + /** + * @dataProvider getCallBankOkDataProvider + * @param $id + * @param $expectedResult + * @param $expectedName + * @return void + */ + public function testCallBankOk($id, $expectedResult, $expectedName) + { + $request = (new BankRequest()) + ->setModel((new Bank()) + ->setId($id) + ); + $client = $this->createMock(Client::class); + $response = new BankResponse(200, [], $expectedResult); + + $client->expects($this->once()) + ->method('sendRequest') + ->willReturn($response); + + $response = $client->sendRequest($request); + + $model = $response->getModel(); + + $this->assertInstanceOf(Bank::class, $model); + $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals($id, $model->getId()); + $this->assertEquals($expectedName, $model->getName()); + } + + /** + * @dataProvider getCallBanksErrorDataProvider + * @return void + */ + public function testCallBanksError($id, $clientId, $clientSecret, $version, $expectedErrorType, $expectedOutput, $errorCode) + { + $request = (new BankRequest()) + ->setModel((new Bank()) + ->setId($id) + ); + + $client = $this->createMock(Client::class); + $response = new BankResponse($errorCode, [], $expectedOutput); + $client->expects($this->once()) + ->method('sendRequest') + ->willReturn($response); + $response = $client->sendRequest($request); + + $model = $response->getModel(); + + $this->assertInstanceOf(Error::class, $model); + $this->assertEquals($expectedErrorType, $model->getType()); + } + + public function getCallBanksErrorDataProvider() + { + return [ + [1111111, 'valid', 'valid', 'valid', 'not_found', '{"type":"not_found","message":"The requested resource doesn\'t exist","documentation_url":"https://docs.bridgeapi.io/"}', 404], + [563, 'invalid', 'valid', 'valid', 'invalid_client_credentials', '{"type":"invalid_client_credentials","message":"client_id and client_secret are invalid","documentation_url":"https://docs.bridgeapi.io/"}', 401], + [563, 'valid', 'invalid', 'valid', 'invalid_client_credentials', '{"type":"invalid_client_credentials","message":"client_id and client_secret are invalid","documentation_url":"https://docs.bridgeapi.io/"}', 401], + [563, 'invalid', 'invalid', 'valid', 'invalid_client_credentials', '{"type":"invalid_client_credentials","message":"client_id and client_secret are invalid","documentation_url":"https://docs.bridgeapi.io/"}', 401], + [563, 'valid', 'valid', 'invalid', 'invalid_version_header', '{"type":"invalid_version_header","message":"API version Bridge-Version is invalid","documentation_url":"https://docs.bridgeapi.io/"}', 400], + ]; + } + + public function getCallBankOkDataProvider() + { + return [ + [563, '{"id":563,"name":"Memo Bank","country_code":"FR","logo_url":"https://web.bankin.com/img/banks-logo/fr/memo-bank.png","authentication_type":"WEBVIEW","url":"https://sync.bankin.com/v2/banks/563/connect-item","is_highlighted":false,"primary_color":null,"secondary_color":null,"parent_name":null,"capabilities":["ais"],"channel_type":["dsp2"],"display_order":null,"deeplink_ios":null,"deeplink_android":null,"form":[{"label":"Identifiant","type":"USER","isNum":"0","maxLength":null},{"label":"Mot de passe","type":"PWD","isNum":"1","maxLength":null}]}', 'Memo Bank'], + [543, '{"id":543,"name":"BTP Banque (Lecteur sans fil)","country_code":"FR","logo_url":"https://web.bankin.com/img/banks-logo/fr/btp.png","authentication_type":"INTERNAL_CREDS","is_highlighted":false,"primary_color":null,"secondary_color":null,"parent_name":"BTP Banque","capabilities":["ais","account_check"],"channel_type":["dsp2"],"display_order":null,"deeplink_ios":null,"deeplink_android":null,"form":[{"label":"Identifiant client","type":"USER","isNum":"1","maxLength":null},{"label":"Numéro d\'usager","type":"PWD","isNum":"0","maxLength":null}]}', 'BTP Banque (Lecteur sans fil)'], + ]; + } +} diff --git a/tests/Request/CreatePaymentRequestTest.php b/tests/Request/CreatePaymentRequestTest.php new file mode 100755 index 0000000..6e2e9b6 --- /dev/null +++ b/tests/Request/CreatePaymentRequestTest.php @@ -0,0 +1,143 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace Tests\Request; + +use BridgeSDK\Client; +use BridgeSDK\Model\Error; +use BridgeSDK\Model\Payment\CreatePayment; +use BridgeSDK\Model\Payment\CreatePaymentTransaction; +use BridgeSDK\Model\Payment\CreatePaymentUrl; +use BridgeSDK\Model\Payment\PaymentErrors; +use BridgeSDK\Model\Payment\PaymentUser; +use BridgeSDK\Request\CreatePaymentRequest; +use BridgeSDK\Response\CreatePaymentResponse; +use PHPUnit\Framework\TestCase; + +class CreatePaymentRequestTest extends TestCase +{ + public function testCallCreatePaymentOk() + { + $body = $this->getValidBody(); + + $request = (new CreatePaymentRequest()) + ->setModel($body); + + $client = $this->createMock(Client::class); + $response = new CreatePaymentResponse(200, [], '{"id":"test_id","consent_url":"https://pay.bridgeapi.io/payment/test_id/initiate"}'); + + $client->expects($this->once()) + ->method('sendRequest') + ->willReturn($response); + + $response = $client->sendRequest($request); + $model = $response->getModel(); + + $this->assertInstanceOf(CreatePaymentUrl::class, $model); + $this->assertEquals(200, $response->getStatusCode()); + } + + /** + * @dataProvider getCallCreatePaymentErrorDataProvider + * @return void + */ + public function testCallCreatePaymentError($clientId, $clientSecret, $version, $expectedErrorType, $expectedOutput, $errorCode) + { + $body = $this->getValidBody(); + $request = (new CreatePaymentRequest()) + ->setModel($body); + + $client = $this->createMock(Client::class); + $response = new CreatePaymentResponse($errorCode, [], $expectedOutput); + $client->expects($this->once()) + ->method('sendRequest') + ->willReturn($response); + $response = $client->sendRequest($request); + + $model = $response->getModel(); + + $this->assertInstanceOf(Error::class, $model); + $this->assertEquals($expectedErrorType, $model->getType()); + } + + /** + * @dataProvider getCallCreatePaymentPaymentErrorDataProvider + * @param $bankId + * @param $error + * @return void + */ + public function testCallCreatePaymentPaymentError($bankId, $error, $expectedOutput, $errorCode) + { + $body = $this->getValidBody(); + $body->setBankId($bankId); + + $request = (new CreatePaymentRequest()) + ->setModel($body); + + $client = $this->createMock(Client::class); + $response = new CreatePaymentResponse($errorCode, [], $expectedOutput); + $client->expects($this->once()) + ->method('sendRequest') + ->willReturn($response); + $response = $client->sendRequest($request); + + $model = $response->getModel(); + + $this->assertInstanceOf(PaymentErrors::class, $model); + $this->assertNotEmpty($model->getErrors()); + $this->assertEquals($error, $model->getErrors()[0]->getCode()); + } + + public function getCallCreatePaymentErrorDataProvider() + { + return [ + ['invalid', 'valid', 'valid', 'invalid_client_credentials', '{"type":"invalid_client_credentials","message":"client_id and client_secret are invalid","documentation_url":"https://docs.bridgeapi.io/"}', 401], + ['valid', 'invalid', 'valid', 'invalid_client_credentials', '{"type":"invalid_client_credentials","message":"client_id and client_secret are invalid","documentation_url":"https://docs.bridgeapi.io/"}', 401], + ['invalid', 'invalid', 'valid', 'invalid_client_credentials', '{"type":"invalid_client_credentials","message":"client_id and client_secret are invalid","documentation_url":"https://docs.bridgeapi.io/"}', 401], + ['valid', 'valid', 'invalid', 'invalid_version_header', '{"type":"invalid_version_header","message":"API version Bridge-Version is invalid","documentation_url":"https://docs.bridgeapi.io/"}', 400], + ]; + } + + public function getCallCreatePaymentPaymentErrorDataProvider() + { + return [ + [14, 'bank.unsupported_operation', '{"errors":[{"code":"bank.unsupported_operation","message":"The selected bank does not support payment from a sandbox application, please try with another bank or from your production application"}]}', 400], + [22213, 'payment.bank_not_found', '{"errors":[{"code":"payment.bank_not_found","message":"This bank does not exist or accept payments"}]}', 400], + ]; + } + + protected function getValidBody() + { + return (new CreatePayment()) + ->setBankId(6) + ->setSuccessfulCallbackUrl('http://prestashop171.denys.tot/?success') + ->setUnsuccessfulCallbackUrl('http://prestashop171.denys.tot/?error') + ->setTransactions([ + (new CreatePaymentTransaction()) + ->setCurrency('EUR') + ->setLabel('Label Unit test') + ->setAmount(10.50) + ->setClientReference('unit_test') + ->setEndToEndId('unit_test') + ]) + ->setUser( + (new PaymentUser()) + ->setFirstName('Unit') + ->setLastName('Test') + ->setExternalReference('unit_test') + ->setIpAddress('192.168.1.1') + ); + } +} diff --git a/tests/Request/ListBanksRequestTest.php b/tests/Request/ListBanksRequestTest.php new file mode 100755 index 0000000..36411ed --- /dev/null +++ b/tests/Request/ListBanksRequestTest.php @@ -0,0 +1,77 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace Tests\Request; + +use BridgeSDK\Client; +use BridgeSDK\Model\Error; +use BridgeSDK\Model\Bank\ListBanks; +use BridgeSDK\Request\ListBanksRequest; +use BridgeSDK\Response\ListBanksResponse; +use PHPUnit\Framework\TestCase; + +class ListBanksRequestTest extends TestCase +{ + public function testCallBanksOk() + { + $request = new ListBanksRequest(); + + $client = $this->createMock(Client::class); + $response = new ListBanksResponse(200, [], '{"resources": [{"id": 563,"name": "Memo Bank","country_code": "FR","logo_url": "https://web.bankin.com/img/banks-logo/fr/memo-bank.png","authentication_type": "WEBVIEW","url": "https://sync.bankin.com/v2/banks/563/connect-item","is_highlighted": false,"primary_color": null,"secondary_color": null,"parent_name": null,"capabilities": ["ais"],"channel_type": ["dsp2"],"display_order": null}],"pagination": { "next_uri": "/v2/banks?after=NDc2&limit=50" }}'); + + $client->expects($this->once()) + ->method('sendRequest') + ->willReturn($response); + + $response = $client->sendRequest($request); + + $model = $response->getModel(); + + $this->assertInstanceOf(ListBanks::class, $model); + $this->assertEquals(200, $response->getStatusCode()); + $this->assertCount(1, $model->getBanks()); + } + + /** + * @dataProvider getCallBanksErrorDataProvider + * @return void + */ + public function testCallBanksError($clientId, $clientSecret, $version, $expectedErrorType, $expectedOutput, $errorCode) + { + $request = new ListBanksRequest(); + + $client = $this->createMock(Client::class); + $response = new ListBanksResponse($errorCode, [], $expectedOutput); + $client->expects($this->once()) + ->method('sendRequest') + ->willReturn($response); + $response = $client->sendRequest($request); + + $model = $response->getModel(); + + $this->assertInstanceOf(Error::class, $model); + $this->assertEquals($expectedErrorType, $model->getType()); + } + + public function getCallBanksErrorDataProvider() + { + return [ + ['invalid', 'valid', 'valid', 'invalid_client_credentials', '{"type":"invalid_client_credentials","message":"client_id and client_secret are invalid","documentation_url":"https://docs.bridgeapi.io/"}', 401], + ['valid', 'invalid', 'valid', 'invalid_client_credentials', '{"type":"invalid_client_credentials","message":"client_id and client_secret are invalid","documentation_url":"https://docs.bridgeapi.io/"}', 401], + ['invalid', 'invalid', 'valid', 'invalid_client_credentials', '{"type":"invalid_client_credentials","message":"client_id and client_secret are invalid","documentation_url":"https://docs.bridgeapi.io/"}', 401], + ['valid', 'valid', 'invalid', 'invalid_version_header', '{"type":"invalid_version_header","message":"API version Bridge-Version is invalid","documentation_url":"https://docs.bridgeapi.io/"}', 400], + ]; + } +} diff --git a/tests/Request/PaymentRequestTest.php b/tests/Request/PaymentRequestTest.php new file mode 100755 index 0000000..56e009c --- /dev/null +++ b/tests/Request/PaymentRequestTest.php @@ -0,0 +1,66 @@ + + * @copyright 2022 (c) 202-ecommerce + * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) + * @link https://docs.bridgeapi.io/ + */ + +namespace Tests\Integration\Request; + +use BridgeSDK\Client; +use BridgeSDK\Constant\PaymentStatuses; +use BridgeSDK\Model\Payment\Payment; +use BridgeSDK\Request\PaymentRequest; +use BridgeSDK\Response\PaymentResponse; +use Tests\Integration\IntegrationTestCase; + +class PaymentRequestTest extends IntegrationTestCase +{ + /** + * @dataProvider getCallPaymentOkDataProvider + * @param $id + * @param $status + * @param $bankId + * @return void + */ + public function testCallPaymentOk($id, $status, $bankId, $amount, $expectedOutput) + { + $request = (new PaymentRequest()) + ->setModel((new Payment()) + ->setId($id) + ); + + $client = $this->createMock(Client::class); + $response = new PaymentResponse(200, [], $expectedOutput); + $client->expects($this->once()) + ->method('sendRequest') + ->willReturn($response); + $response = $client->sendRequest($request); + + $model = $response->getModel(); + + $this->assertInstanceOf(Payment::class, $model); + $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals($id, $model->getId()); + $this->assertEquals($status, $model->getStatus()); + $this->assertEquals($bankId, $model->getBankId()); + $this->assertEquals($amount, $model->getTransactions()[0]->getAmount()); + } + + public function getCallPaymentOkDataProvider() + { + return [ + ['e815420d4b414a9c8b007c57196c19b5', PaymentStatuses::REJECTED_PAYMENTS[1], 6, 10.5, '{"id":"e815420d4b414a9c8b007c57196c19b5","status":"RJCT","status_reason":"CUST","user":{"first_name":"Unit","last_name":"Test","external_reference":"testApiCallBanksOk","ip_address":"78.203.165.12"},"sender":{},"transactions":[{"id":"8b9a9c6bca8f4e85b5f0b027efce5599","status":"RJCT","status_reason":"CUST","beneficiary":{"iban":"FR76XXXXXXXXXXXXXXXXXXXX185","name":"Denys Bridge","company_name":"Denys Bridge"},"amount":10.5,"currency":"EUR","label":"Label Unit test","client_reference":"testApiCallBanksOk","execution_date":"2022-07-29","end_to_end_id":"testApiCallBanksOk"}],"created_at":"2022-07-29T12:15:06.211Z","updated_at":"2022-07-29T12:33:58.277Z","bank_id":6}'], + ['bf80034b41764d88b0bb4eef9017e6bb', PaymentStatuses::REJECTED_PAYMENTS[1], 6, 10.5, '{"id":"bf80034b41764d88b0bb4eef9017e6bb","status":"RJCT","status_reason":"NOAS","user":{"first_name":"Thomas","last_name":"Pichet","external_reference":"AEF142536-890","ip_address":"192.168.1.1"},"sender":{},"transactions":[{"id":"79d05eb1684f4afaa8f5e703669e84fb","status":"RJCT","status_reason":"NOAS","beneficiary":{"iban":"FR76XXXXXXXXXXXXXXXXXXXX185","name":"Denys Bridge","company_name":"Denys Bridge"},"amount":10.5,"currency":"EUR","label":"label test","client_reference":"ABCDE-EEEE_9398848","end_to_end_id":"E2E_TEST-123"}],"created_at":"2022-07-29T10:08:39.631Z","updated_at":"2022-07-29T11:09:27.535Z","bank_id":6}'], + ['2dd3d0b2abe443b98f0e6a2763c37bca', PaymentStatuses::REJECTED_PAYMENTS[1], 17, 12, '{"id":"2dd3d0b2abe443b98f0e6a2763c37bca","status":"RJCT","status_reason":"NOAS","user":{"name":"User name","ip_address":"0.0.0.0"},"sender":{},"transactions":[{"id":"f988f40979554876ab6e375274ba8aee","status":"RJCT","status_reason":"NOAS","beneficiary":{"iban":"FR76XXXXXXXXXXXXXXXXXXXX185","name":"Denys Bridge","company_name":"Denys Bridge"},"amount":12.0,"currency":"EUR","label":"label test","client_reference":"ABCDE-EEEE_9398848","end_to_end_id":"E2E_TEST-123"}],"created_at":"2022-03-15T15:16:35.249Z","updated_at":"2022-03-15T16:17:20.347Z","bank_id":17}'], + ]; + } +} diff --git a/tests/phpunit.xml b/tests/phpunit.xml old mode 100644 new mode 100755 index 81f8fe8..a55c85d --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -10,6 +10,8 @@ + + diff --git a/tests/phpunit_bootstrap.php b/tests/phpunit_bootstrap.php old mode 100644 new mode 100755 From 55a6d9ac3d587d73ed992fc57539d9a91eb5d75c Mon Sep 17 00:00:00 2001 From: Denys Date: Fri, 5 Aug 2022 10:00:35 +0200 Subject: [PATCH 08/21] Phpstan; refs #35898 --- phpstan.neon.dist | 2 +- src/Model/AbstractModel.php | 1 + src/Request/AbstractRequest.php | 1 + src/Response/AbstractResponse.php | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 10cfcc3..44ee19e 100755 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -26,7 +26,7 @@ parameters: # the use of this functions is intended. # @see https://phpstan.org/user-guide/ignoring-errors ignoreErrors: - - '#Property BridgeSDK\\Client::\$ch has unknown class CurlHandle as its type\.#' +# - '#Property BridgeSDK\\Client::\$ch has unknown class CurlHandle as its type\.#' # - '#Should not use node with type "Expr_Exit", please change the code.#' # warnings for "die()" # - '#Should not use node with type "Stmt_Echo", please change the code.#' # warnings for "echo()" # - '#Should not use function "print_r", please change the code.#' # warnings for "print_r()" diff --git a/src/Model/AbstractModel.php b/src/Model/AbstractModel.php index ccc5c11..6bdd777 100755 --- a/src/Model/AbstractModel.php +++ b/src/Model/AbstractModel.php @@ -22,6 +22,7 @@ abstract class AbstractModel implements JsonSerializable /** * {@inheritdoc} */ + #[\ReturnTypeWillChange] public function jsonSerialize() { $getterName = get_class_methods(static::class); diff --git a/src/Request/AbstractRequest.php b/src/Request/AbstractRequest.php index 399e0e2..c6c4490 100755 --- a/src/Request/AbstractRequest.php +++ b/src/Request/AbstractRequest.php @@ -103,6 +103,7 @@ public function getResponseObject() /** * {@inheritdoc} */ + #[\ReturnTypeWillChange] public function jsonSerialize() { return get_object_vars($this); diff --git a/src/Response/AbstractResponse.php b/src/Response/AbstractResponse.php index 0e50cc4..fe5c7c3 100755 --- a/src/Response/AbstractResponse.php +++ b/src/Response/AbstractResponse.php @@ -149,6 +149,7 @@ public function withStatus($code, $reasonPhrase = '') /** * {@inheritdoc} */ + #[\ReturnTypeWillChange] public function jsonSerialize() { return get_object_vars($this); From 74222892acace5d91afbc58f35d99d3d0a536ee3 Mon Sep 17 00:00:00 2001 From: Denys Date: Mon, 22 Aug 2022 10:22:10 +0200 Subject: [PATCH 09/21] Fixed phpunit variables; refs #35898 --- .github/workflows/phpunit.yml | 4 ---- tests/phpunit.xml | 2 -- 2 files changed, 6 deletions(-) diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index 502d27c..a22a975 100755 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -22,10 +22,6 @@ jobs: - name: Install dependencies run: composer update --ignore-platform-reqs - - name: Get runner ip addresses - id: ip - uses: haythem/public-ip@v1.2 - - name: Unit tests (PHPUnit) env: BRIDGE_CLIENT_ID: ${{ secrets.BRIDGE_CLIENT_ID }} diff --git a/tests/phpunit.xml b/tests/phpunit.xml index a55c85d..81f8fe8 100755 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -10,8 +10,6 @@ - - From ed50650c4d0bdfafff4c094c2134972e0f503e88 Mon Sep 17 00:00:00 2001 From: kgleizes Date: Mon, 10 Oct 2022 13:22:05 +0200 Subject: [PATCH 10/21] refs #36459 - Updates for Magento2 Add errors for responses Small compatibility fixes (PHP 7.1) - str_starts_with --- composer.json | 9 ++++--- src/Client.php | 28 ++++++++++++++++++-- src/Model/AbstractModel.php | 2 +- src/Model/Bank/ListBanks.php | 4 +++ src/Model/Payment/PaymentUser.php | 43 +++---------------------------- src/Response/AbstractResponse.php | 37 +++++++++++++++++++------- src/Response/ResponseBuilder.php | 2 +- 7 files changed, 68 insertions(+), 57 deletions(-) diff --git a/composer.json b/composer.json index 94dcd5d..1116fa3 100755 --- a/composer.json +++ b/composer.json @@ -1,7 +1,8 @@ { "name": "202ecommerce/bridge-sdk", + "version": "1.0.0", "description": "Bridge API SDK", - "homepage": "https://docs.bridgeapi.io/", + "homepage": "https://docs.bridgeapi.io/", "license": "AFL-3.0", "authors": [ { @@ -29,14 +30,14 @@ ] }, "require": { - "psr/log": "^1.0", - "psr/http-message": "^1.0", - "psr/cache": "^1.0.0", "ext-json": "*", "ext-curl": "*" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.4", + "psr/log": "^1.0", + "psr/http-message": "^1.0", + "psr/cache": "^1.0.0", "phpunit/phpunit": "^9.0", "phpstan/phpstan": "^0.12.81" }, diff --git a/src/Client.php b/src/Client.php index c2e7905..6a27563 100755 --- a/src/Client.php +++ b/src/Client.php @@ -96,7 +96,7 @@ public function __construct() * @throws InvalidArgumentException Invalid header names and/or values * @throws RuntimeException Failure to create stream * - * @return ResponseInterface + * @return AbstractResponse */ public function sendRequest(AbstractRequest $request) { @@ -117,6 +117,7 @@ public function sendRequest(AbstractRequest $request) ]); $response = $this->createResponse($request); + $options = $this->createOptions($request, $response); $this->ch = curl_init(); @@ -143,18 +144,40 @@ public function sendRequest(AbstractRequest $request) } curl_close($this->ch); + $errors = []; $result = $response->getResponse(); + $body = $result->getBody(false); + if (isset($body['errors'])) { + $errors = $body['errors']; + } + $this->setErrorsOnResponse($result, $errors); $this->logger->info((string) $result->getBody(), [ 'path' => $request->getUri()->getPath(), 'query' => $request->getUri()->getQuery(), 'type' => \get_class($result), + 'response' => json_encode($response), ]); // Get the response return $result; } + /** + * @param AbstractResponse $response + * @param array $errors + */ + private function setErrorsOnResponse($response, $errors) + { + $errorsToSet = []; + foreach ($errors as $oneError) { + if (isset($oneError['message'])) { + $errorsToSet[] = $oneError['message']; + } + } + $response->setError($errorsToSet); + } + /** * Retrieve a callback request from API. * @@ -334,7 +357,7 @@ protected function createOptions(RequestInterface $request, ResponseBuilder $res $clean_data = trim($data); if ('' !== $clean_data) { - if (str_starts_with(strtoupper($clean_data), 'HTTP/')) { + if (strpos(strtoupper($clean_data), 'HTTP/') === 0) { $response->setStatus($clean_data)->getResponse(); } else { $response->addHeader($clean_data); @@ -346,6 +369,7 @@ protected function createOptions(RequestInterface $request, ResponseBuilder $res $options[CURLOPT_WRITEFUNCTION] = function ($ch, $data) use ($response) { if (false === empty($response->getResponse()->getBody())) { + $response->getResponse()->setBody($data); return $response->getResponse()->getBody()->write($data); } diff --git a/src/Model/AbstractModel.php b/src/Model/AbstractModel.php index 6bdd777..7248f13 100755 --- a/src/Model/AbstractModel.php +++ b/src/Model/AbstractModel.php @@ -28,7 +28,7 @@ public function jsonSerialize() $getterName = get_class_methods(static::class); $gettableAttributes = []; foreach ($getterName as $value) { - if ('get' === substr($value, 0, 3)) { + if ('get' === substr($value, 0, 3) && $value !== 'getAfterParam') { $key = lcfirst(substr($value, 3, \strlen($value))); $gettableAttributes[$this->transformToPascalCase($key)] = $this->{$value}(); } diff --git a/src/Model/Bank/ListBanks.php b/src/Model/Bank/ListBanks.php index 4f26a04..bcbf474 100755 --- a/src/Model/Bank/ListBanks.php +++ b/src/Model/Bank/ListBanks.php @@ -83,6 +83,10 @@ public function getAfter() */ protected function getAfterParam($url) { + if (empty($url) === true) { + return ''; + } + $paramsString = explode('?', $url); $allParams = explode('&', $paramsString[1]); foreach ($allParams as $aParam) { diff --git a/src/Model/Payment/PaymentUser.php b/src/Model/Payment/PaymentUser.php index a66cc52..25142c5 100755 --- a/src/Model/Payment/PaymentUser.php +++ b/src/Model/Payment/PaymentUser.php @@ -30,11 +30,6 @@ class PaymentUser extends AbstractModel */ private $lastName; - /** - * @var string - */ - private $externalReference; - /** * @var string */ @@ -61,9 +56,7 @@ public function setFirstName($firstName) return $this; } - throw new InvalidArgumentException( - 'First name must be a string '.\gettype($firstName).' is given.' - ); + throw new InvalidArgumentException('First name must be a string ' . \gettype($firstName) . ' is given.'); } /** @@ -87,35 +80,7 @@ public function setLastName($lastName) return $this; } - throw new InvalidArgumentException( - 'Last name must be a string '.\gettype($lastName).' is given.' - ); - } - - /** - * @return string - */ - public function getExternalReference() - { - return $this->externalReference; - } - - /** - * @param string $externalReference - * - * @return PaymentUser - */ - public function setExternalReference($externalReference) - { - if (true === \is_string($externalReference)) { - $this->externalReference = $externalReference; - - return $this; - } - - throw new InvalidArgumentException( - 'External reference must be a string '.\gettype($externalReference).' is given.' - ); + throw new InvalidArgumentException('Last name must be a string ' . \gettype($lastName) . ' is given.'); } /** @@ -139,8 +104,6 @@ public function setIpAddress($ipAddress) return $this; } - throw new InvalidArgumentException( - 'Ip address must be a string '.\gettype($ipAddress).' is given.' - ); + throw new InvalidArgumentException('Ip address must be a string ' . \gettype($ipAddress) . ' is given.'); } } diff --git a/src/Response/AbstractResponse.php b/src/Response/AbstractResponse.php index fe5c7c3..1b0d97f 100755 --- a/src/Response/AbstractResponse.php +++ b/src/Response/AbstractResponse.php @@ -47,15 +47,18 @@ abstract class AbstractResponse implements ResponseInterface, JsonSerializable /** @var string */ private $reasonPhrase = ''; + /** @var string[] */ + private $error = []; + /** @var int */ private $statusCode; /** - * @param int $status Status code - * @param array $headers Response headers - * @param null|resource|StreamInterface|string $body Response body - * @param string $version Protocol version - * @param null|string $reason Reason phrase (when empty a default will be used based on the status code) + * @param int $status Status code + * @param array $headers Response headers + * @param resource|StreamInterface|string|null body Response body + * @param string $version Protocol version + * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) */ public function __construct($status = 200, array $headers = [], $body = null, $version = '1.1', $reason = null) { @@ -78,18 +81,18 @@ public function __construct($status = 200, array $headers = [], $body = null, $v /** * Get body. * - * @return null|AbstractModel|ArrayCollection + * @return AbstractModel|ArrayCollection|null */ abstract public function getModel(); /** * Gets the body of the message. * - * @return null|StreamInterface returns the body as a stream + * @return StreamInterface|null returns the body as a stream */ - public function getBody() + public function getBody($returnStream = true) { - return $this->stream; + return $returnStream === true ? $this->stream : $this->body; } /** @@ -123,6 +126,22 @@ public function getReasonPhrase() return $this->reasonPhrase; } + /** + * @inherit + */ + public function getError() + { + return $this->error; + } + + /** + * @inherit + */ + public function setError($errors) + { + $this->error = $errors; + } + /** * @inherit * diff --git a/src/Response/ResponseBuilder.php b/src/Response/ResponseBuilder.php index c2759de..85f8e54 100755 --- a/src/Response/ResponseBuilder.php +++ b/src/Response/ResponseBuilder.php @@ -132,7 +132,7 @@ public function setStatus($statusLine) $statusParts = explode(' ', $statusLine, 3); $partsCount = \count($statusParts); - if ($partsCount < 2 || !str_starts_with(strtoupper($statusParts[0]), 'HTTP/')) { + if ($partsCount < 2 || strpos(strtoupper($statusParts[0]), 'HTTP/') !== 0) { throw new InvalidArgumentException("'{$statusLine}' is not a valid HTTP status line"); } From 8f28e4a9355ab35635cf73ad52117210c9b70915 Mon Sep 17 00:00:00 2001 From: kgleizes Date: Mon, 10 Oct 2022 16:26:43 +0200 Subject: [PATCH 11/21] refs #36459 - Fix tests and CS-FIXER --- src/Client.php | 54 +++++++++---------- src/Model/AbstractModel.php | 2 +- src/Model/Bank/ListBanks.php | 4 +- src/Model/Payment/PaymentUser.php | 6 +-- src/Response/AbstractResponse.php | 19 ++++--- src/Response/ResponseBuilder.php | 14 ++--- src/Stream.php | 16 +++--- src/Uri/AbstractUri.php | 12 ++--- .../CreatePaymentRequestIntegrationTest.php | 1 - tests/Request/CreatePaymentRequestTest.php | 1 - 10 files changed, 66 insertions(+), 63 deletions(-) diff --git a/src/Client.php b/src/Client.php index 6a27563..0d19381 100755 --- a/src/Client.php +++ b/src/Client.php @@ -24,7 +24,6 @@ use InvalidArgumentException; use Logger\NullLogger; use Psr\Http\Message\RequestInterface; -use Psr\Http\Message\ResponseInterface; use Psr\Log\LoggerInterface; use RuntimeException; use UnexpectedValueException; @@ -92,11 +91,11 @@ public function __construct() /** * Send a PSR-7 Request. * + * @return AbstractResponse + * * @throws RequestException Invalid request * @throws InvalidArgumentException Invalid header names and/or values * @throws RuntimeException Failure to create stream - * - * @return AbstractResponse */ public function sendRequest(AbstractRequest $request) { @@ -163,27 +162,12 @@ public function sendRequest(AbstractRequest $request) return $result; } - /** - * @param AbstractResponse $response - * @param array $errors - */ - private function setErrorsOnResponse($response, $errors) - { - $errorsToSet = []; - foreach ($errors as $oneError) { - if (isset($oneError['message'])) { - $errorsToSet[] = $oneError['message']; - } - } - $response->setError($errorsToSet); - } - /** * Retrieve a callback request from API. * - * @throws RuntimeException Failure to create stream - * * @return AbstractResponse + * + * @throws RuntimeException Failure to create stream */ public function retrieveWebhookResponse() { @@ -249,9 +233,9 @@ public function setLogger($logger) * * @param AbstractRequest $request * - * @throws RuntimeException Failure to create stream - * * @return ResponseBuilder + * + * @throws RuntimeException Failure to create stream */ protected function createResponse($request) { @@ -321,11 +305,11 @@ protected function createHeaders(RequestInterface $request, array $options) /** * Create cURL request options. * + * @return array cURL options + * * @throws RequestException Invalid request * @throws InvalidArgumentException Invalid header names and/or values * @throws RuntimeException Unable to read request body - * - * @return array cURL options */ protected function createOptions(RequestInterface $request, ResponseBuilder $response) { @@ -357,7 +341,7 @@ protected function createOptions(RequestInterface $request, ResponseBuilder $res $clean_data = trim($data); if ('' !== $clean_data) { - if (strpos(strtoupper($clean_data), 'HTTP/') === 0) { + if (str_starts_with(strtoupper($clean_data), 'HTTP/')) { $response->setStatus($clean_data)->getResponse(); } else { $response->addHeader($clean_data); @@ -370,6 +354,7 @@ protected function createOptions(RequestInterface $request, ResponseBuilder $res $options[CURLOPT_WRITEFUNCTION] = function ($ch, $data) use ($response) { if (false === empty($response->getResponse()->getBody())) { $response->getResponse()->setBody($data); + return $response->getResponse()->getBody()->write($data); } @@ -439,9 +424,9 @@ protected function addRequestBodyOptions(RequestInterface $request, array $optio * * @param string $requestProtocolVersion Request http protocol version * - * @throws UnexpectedValueException Unsupported cURL http protocol version - * * @return int cURL constant for request http protocol version + * + * @throws UnexpectedValueException Unsupported cURL http protocol version */ protected function getProtocolVersion($requestProtocolVersion) { @@ -462,4 +447,19 @@ protected function getProtocolVersion($requestProtocolVersion) return CURL_HTTP_VERSION_NONE; } + + /** + * @param AbstractResponse $response + * @param array $errors + */ + private function setErrorsOnResponse($response, $errors) + { + $errorsToSet = []; + foreach ($errors as $oneError) { + if (isset($oneError['message'])) { + $errorsToSet[] = $oneError['message']; + } + } + $response->setError($errorsToSet); + } } diff --git a/src/Model/AbstractModel.php b/src/Model/AbstractModel.php index 7248f13..77ffbdf 100755 --- a/src/Model/AbstractModel.php +++ b/src/Model/AbstractModel.php @@ -28,7 +28,7 @@ public function jsonSerialize() $getterName = get_class_methods(static::class); $gettableAttributes = []; foreach ($getterName as $value) { - if ('get' === substr($value, 0, 3) && $value !== 'getAfterParam') { + if ('get' === substr($value, 0, 3) && 'getAfterParam' !== $value) { $key = lcfirst(substr($value, 3, \strlen($value))); $gettableAttributes[$this->transformToPascalCase($key)] = $this->{$value}(); } diff --git a/src/Model/Bank/ListBanks.php b/src/Model/Bank/ListBanks.php index bcbf474..6ab2967 100755 --- a/src/Model/Bank/ListBanks.php +++ b/src/Model/Bank/ListBanks.php @@ -83,10 +83,10 @@ public function getAfter() */ protected function getAfterParam($url) { - if (empty($url) === true) { + if (true === empty($url)) { return ''; } - + $paramsString = explode('?', $url); $allParams = explode('&', $paramsString[1]); foreach ($allParams as $aParam) { diff --git a/src/Model/Payment/PaymentUser.php b/src/Model/Payment/PaymentUser.php index 25142c5..f04bc41 100755 --- a/src/Model/Payment/PaymentUser.php +++ b/src/Model/Payment/PaymentUser.php @@ -56,7 +56,7 @@ public function setFirstName($firstName) return $this; } - throw new InvalidArgumentException('First name must be a string ' . \gettype($firstName) . ' is given.'); + throw new InvalidArgumentException('First name must be a string '.\gettype($firstName).' is given.'); } /** @@ -80,7 +80,7 @@ public function setLastName($lastName) return $this; } - throw new InvalidArgumentException('Last name must be a string ' . \gettype($lastName) . ' is given.'); + throw new InvalidArgumentException('Last name must be a string '.\gettype($lastName).' is given.'); } /** @@ -104,6 +104,6 @@ public function setIpAddress($ipAddress) return $this; } - throw new InvalidArgumentException('Ip address must be a string ' . \gettype($ipAddress) . ' is given.'); + throw new InvalidArgumentException('Ip address must be a string '.\gettype($ipAddress).' is given.'); } } diff --git a/src/Response/AbstractResponse.php b/src/Response/AbstractResponse.php index 1b0d97f..f474d44 100755 --- a/src/Response/AbstractResponse.php +++ b/src/Response/AbstractResponse.php @@ -54,11 +54,12 @@ abstract class AbstractResponse implements ResponseInterface, JsonSerializable private $statusCode; /** - * @param int $status Status code + * @param int $status Status code * @param array $headers Response headers - * @param resource|StreamInterface|string|null body Response body - * @param string $version Protocol version - * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) + * @param null|resource|StreamInterface|string body Response body + * @param string $version Protocol version + * @param null|string $reason Reason phrase (when empty a default will be used based on the status code) + * @param null|mixed $body */ public function __construct($status = 200, array $headers = [], $body = null, $version = '1.1', $reason = null) { @@ -81,18 +82,20 @@ public function __construct($status = 200, array $headers = [], $body = null, $v /** * Get body. * - * @return AbstractModel|ArrayCollection|null + * @return null|AbstractModel|ArrayCollection */ abstract public function getModel(); /** * Gets the body of the message. * - * @return StreamInterface|null returns the body as a stream + * @param mixed $returnStream + * + * @return null|StreamInterface returns the body as a stream */ public function getBody($returnStream = true) { - return $returnStream === true ? $this->stream : $this->body; + return true === $returnStream ? $this->stream : $this->body; } /** @@ -136,6 +139,8 @@ public function getError() /** * @inherit + * + * @param mixed $errors */ public function setError($errors) { diff --git a/src/Response/ResponseBuilder.php b/src/Response/ResponseBuilder.php index 85f8e54..c1e89ff 100755 --- a/src/Response/ResponseBuilder.php +++ b/src/Response/ResponseBuilder.php @@ -66,9 +66,9 @@ public function setResponse(AbstractResponse $response) * * @param string $header_line Response header line string * - * @throws InvalidArgumentException Invalid header line argument - * * @return static + * + * @throws InvalidArgumentException Invalid header line argument */ public function addHeader($header_line) { @@ -95,9 +95,9 @@ public function addHeader($header_line) * * @param array $headers Array of header lines * - * @throws InvalidArgumentException Invalid status code argument value - * * @return self $this + * + * @throws InvalidArgumentException Invalid status code argument value */ public function setHeadersFromArray(array $headers) { @@ -123,16 +123,16 @@ public function setHeadersFromArray(array $headers) * * @param string $statusLine Response status line string * - * @throws InvalidArgumentException Invalid status line argument - * * @return self $this + * + * @throws InvalidArgumentException Invalid status line argument */ public function setStatus($statusLine) { $statusParts = explode(' ', $statusLine, 3); $partsCount = \count($statusParts); - if ($partsCount < 2 || strpos(strtoupper($statusParts[0]), 'HTTP/') !== 0) { + if ($partsCount < 2 || !str_starts_with(strtoupper($statusParts[0]), 'HTTP/')) { throw new InvalidArgumentException("'{$statusLine}' is not a valid HTTP status line"); } diff --git a/src/Stream.php b/src/Stream.php index a5112e9..43653e5 100755 --- a/src/Stream.php +++ b/src/Stream.php @@ -83,9 +83,9 @@ public function __destruct() } /** - * @throws Exception - * * @return string + * + * @throws Exception */ public function __toString() { @@ -234,9 +234,9 @@ public function isSeekable() * @param int $offset * @param int $whence * - * @throws RuntimeException - * * @return void + * + * @throws RuntimeException */ public function seek($offset, $whence = SEEK_SET) { @@ -274,9 +274,9 @@ public function isWritable() /** * @param string $string * - * @throws RuntimeException - * * @return false|int + * + * @throws RuntimeException */ public function write($string) { @@ -314,9 +314,9 @@ public function isReadable() /** * @param int $length * - * @throws RuntimeException - * * @return false|string + * + * @throws RuntimeException */ public function read($length) { diff --git a/src/Uri/AbstractUri.php b/src/Uri/AbstractUri.php index 9b598fc..3f3d1e4 100755 --- a/src/Uri/AbstractUri.php +++ b/src/Uri/AbstractUri.php @@ -374,9 +374,9 @@ protected static function isNonStandardPort($scheme, $port) * * @param null|int $port * - * @throws \InvalidArgumentException - * * @return null|int + * + * @throws \InvalidArgumentException */ protected function filterPort($port) { @@ -397,9 +397,9 @@ protected function filterPort($port) * * @param string $path * - * @throws \InvalidArgumentException - * * @return string + * + * @throws \InvalidArgumentException */ protected function filterPath($path) { @@ -415,9 +415,9 @@ protected function filterPath($path) * * @param string $str * - * @throws \InvalidArgumentException - * * @return string + * + * @throws \InvalidArgumentException */ protected function filterQueryAndFragment($str) { diff --git a/tests/Integration/Request/CreatePaymentRequestIntegrationTest.php b/tests/Integration/Request/CreatePaymentRequestIntegrationTest.php index 2332ef4..ca59f56 100755 --- a/tests/Integration/Request/CreatePaymentRequestIntegrationTest.php +++ b/tests/Integration/Request/CreatePaymentRequestIntegrationTest.php @@ -120,7 +120,6 @@ protected function getValidBody() (new PaymentUser()) ->setFirstName('Unit') ->setLastName('Test') - ->setExternalReference('unit_test') ->setIpAddress('192.168.1.1') ); } diff --git a/tests/Request/CreatePaymentRequestTest.php b/tests/Request/CreatePaymentRequestTest.php index 6e2e9b6..2160acb 100755 --- a/tests/Request/CreatePaymentRequestTest.php +++ b/tests/Request/CreatePaymentRequestTest.php @@ -136,7 +136,6 @@ protected function getValidBody() (new PaymentUser()) ->setFirstName('Unit') ->setLastName('Test') - ->setExternalReference('unit_test') ->setIpAddress('192.168.1.1') ); } From 718ae5bcdb12d3ecbb20e9a232534b7d81a55485 Mon Sep 17 00:00:00 2001 From: kgleizes Date: Mon, 10 Oct 2022 17:15:11 +0200 Subject: [PATCH 12/21] refs #36459 - Fix Unit tests and PHPStan --- src/Client.php | 20 ++++++++++---------- src/Response/AbstractResponse.php | 11 ++++++++--- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/Client.php b/src/Client.php index 0d19381..68ec4cb 100755 --- a/src/Client.php +++ b/src/Client.php @@ -146,12 +146,12 @@ public function sendRequest(AbstractRequest $request) $errors = []; $result = $response->getResponse(); $body = $result->getBody(false); - if (isset($body['errors'])) { - $errors = $body['errors']; + if (isset($body->errors)) { + $errors = $body->errors; } $this->setErrorsOnResponse($result, $errors); - $this->logger->info((string) $result->getBody(), [ + $this->logger->info((string) json_encode($result->getBody()), [ 'path' => $request->getUri()->getPath(), 'query' => $request->getUri()->getQuery(), 'type' => \get_class($result), @@ -352,13 +352,11 @@ protected function createOptions(RequestInterface $request, ResponseBuilder $res }; $options[CURLOPT_WRITEFUNCTION] = function ($ch, $data) use ($response) { - if (false === empty($response->getResponse()->getBody())) { - $response->getResponse()->setBody($data); + /** @var \Psr\Http\Message\StreamInterface $bodyStreamInterface */ + $bodyStreamInterface = $response->getResponse()->getBody(); + $response->getResponse()->setBody($data); - return $response->getResponse()->getBody()->write($data); - } - - return 0; + return $bodyStreamInterface->write($data); }; return $options; @@ -450,7 +448,9 @@ protected function getProtocolVersion($requestProtocolVersion) /** * @param AbstractResponse $response - * @param array $errors + * @param mixed $errors + * + * @return void */ private function setErrorsOnResponse($response, $errors) { diff --git a/src/Response/AbstractResponse.php b/src/Response/AbstractResponse.php index f474d44..554d2e3 100755 --- a/src/Response/AbstractResponse.php +++ b/src/Response/AbstractResponse.php @@ -56,10 +56,9 @@ abstract class AbstractResponse implements ResponseInterface, JsonSerializable /** * @param int $status Status code * @param array $headers Response headers - * @param null|resource|StreamInterface|string body Response body + * @param null|resource|StreamInterface|string $body Response body * @param string $version Protocol version * @param null|string $reason Reason phrase (when empty a default will be used based on the status code) - * @param null|mixed $body */ public function __construct($status = 200, array $headers = [], $body = null, $version = '1.1', $reason = null) { @@ -91,7 +90,7 @@ abstract public function getModel(); * * @param mixed $returnStream * - * @return null|StreamInterface returns the body as a stream + * @return null|AbstractModel|StreamInterface returns the body as a stream */ public function getBody($returnStream = true) { @@ -131,6 +130,8 @@ public function getReasonPhrase() /** * @inherit + * + * @return mixed */ public function getError() { @@ -141,10 +142,14 @@ public function getError() * @inherit * * @param mixed $errors + * + * @return self */ public function setError($errors) { $this->error = $errors; + + return $this; } /** From e19e227081cb008d44683f440faa6344c0321401 Mon Sep 17 00:00:00 2001 From: kgleizes Date: Mon, 10 Oct 2022 17:50:17 +0200 Subject: [PATCH 13/21] refs #36459 - Fix Unit tests and PHPStan Bad couple secret / domain (https) --- src/Client.php | 4 ++-- src/Response/AbstractResponse.php | 14 +++++++------- .../CreatePaymentRequestIntegrationTest.php | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Client.php b/src/Client.php index 68ec4cb..3d4e29e 100755 --- a/src/Client.php +++ b/src/Client.php @@ -353,7 +353,7 @@ protected function createOptions(RequestInterface $request, ResponseBuilder $res $options[CURLOPT_WRITEFUNCTION] = function ($ch, $data) use ($response) { /** @var \Psr\Http\Message\StreamInterface $bodyStreamInterface */ - $bodyStreamInterface = $response->getResponse()->getBody(); + $bodyStreamInterface = $response->getResponse()->getBody(); $response->getResponse()->setBody($data); return $bodyStreamInterface->write($data); @@ -449,7 +449,7 @@ protected function getProtocolVersion($requestProtocolVersion) /** * @param AbstractResponse $response * @param mixed $errors - * + * * @return void */ private function setErrorsOnResponse($response, $errors) diff --git a/src/Response/AbstractResponse.php b/src/Response/AbstractResponse.php index 554d2e3..730a9f1 100755 --- a/src/Response/AbstractResponse.php +++ b/src/Response/AbstractResponse.php @@ -54,11 +54,11 @@ abstract class AbstractResponse implements ResponseInterface, JsonSerializable private $statusCode; /** - * @param int $status Status code - * @param array $headers Response headers - * @param null|resource|StreamInterface|string $body Response body - * @param string $version Protocol version - * @param null|string $reason Reason phrase (when empty a default will be used based on the status code) + * @param int $status Status code + * @param array $headers Response headers + * @param null|resource|StreamInterface|string $body Response body + * @param string $version Protocol version + * @param null|string $reason Reason phrase (when empty a default will be used based on the status code) */ public function __construct($status = 200, array $headers = [], $body = null, $version = '1.1', $reason = null) { @@ -130,7 +130,7 @@ public function getReasonPhrase() /** * @inherit - * + * * @return mixed */ public function getError() @@ -142,7 +142,7 @@ public function getError() * @inherit * * @param mixed $errors - * + * * @return self */ public function setError($errors) diff --git a/tests/Integration/Request/CreatePaymentRequestIntegrationTest.php b/tests/Integration/Request/CreatePaymentRequestIntegrationTest.php index ca59f56..3326ab9 100755 --- a/tests/Integration/Request/CreatePaymentRequestIntegrationTest.php +++ b/tests/Integration/Request/CreatePaymentRequestIntegrationTest.php @@ -106,8 +106,8 @@ protected function getValidBody() { return (new CreatePayment()) ->setBankId(6) - ->setSuccessfulCallbackUrl('http://prestashop171.denys.tot/?success') - ->setUnsuccessfulCallbackUrl('http://prestashop171.denys.tot/?error') + ->setSuccessfulCallbackUrl('https://prestashop178.denys.tot/?success') + ->setUnsuccessfulCallbackUrl('https://prestashop178.denys.tot/?error') ->setTransactions([ (new CreatePaymentTransaction()) ->setCurrency('EUR') From 30af32106308439398e9a4858aa1f0d6e97ee590 Mon Sep 17 00:00:00 2001 From: kgleizes Date: Tue, 11 Oct 2022 01:06:53 +0200 Subject: [PATCH 14/21] refs #36459 - Remove CS-FIXER constraint Magento 2.2.1 - PHP7.1 - cannot use str_starts_with function --- .php-cs-fixer.dist.php | 1 - src/Client.php | 2 +- src/Response/ResponseBuilder.php | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index de366f5..181fd14 100755 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -44,7 +44,6 @@ 'general_phpdoc_annotation_remove' => ['annotations' => ['expectedDeprecation']], // one should use PHPUnit built-in method instead 'header_comment' => ['header' => $header, 'separate' => 'bottom', 'comment_type' => 'PHPDoc'], 'heredoc_indentation' => false, // TODO switch on when # of PR's is lower - 'modernize_strpos' => true, // needs PHP 8+ or polyfill 'use_arrow_functions' => false, // TODO switch on when # of PR's is lower 'visibility_required' => ['elements' => ['property', 'method']], 'declare_strict_types' => false, diff --git a/src/Client.php b/src/Client.php index 3d4e29e..dde36cf 100755 --- a/src/Client.php +++ b/src/Client.php @@ -341,7 +341,7 @@ protected function createOptions(RequestInterface $request, ResponseBuilder $res $clean_data = trim($data); if ('' !== $clean_data) { - if (str_starts_with(strtoupper($clean_data), 'HTTP/')) { + if (0 === strpos(strtoupper($clean_data), 'HTTP/')) { $response->setStatus($clean_data)->getResponse(); } else { $response->addHeader($clean_data); diff --git a/src/Response/ResponseBuilder.php b/src/Response/ResponseBuilder.php index c1e89ff..3aade59 100755 --- a/src/Response/ResponseBuilder.php +++ b/src/Response/ResponseBuilder.php @@ -132,7 +132,7 @@ public function setStatus($statusLine) $statusParts = explode(' ', $statusLine, 3); $partsCount = \count($statusParts); - if ($partsCount < 2 || !str_starts_with(strtoupper($statusParts[0]), 'HTTP/')) { + if ($partsCount < 2 || 0 !== strpos(strtoupper($statusParts[0]), 'HTTP/')) { throw new InvalidArgumentException("'{$statusLine}' is not a valid HTTP status line"); } From 6d6a2d8e3c38deb10000c3a1f80ef5f9db7f63fe Mon Sep 17 00:00:00 2001 From: kgleizes Date: Tue, 11 Oct 2022 09:00:54 +0200 Subject: [PATCH 15/21] refs #36459 - Body format Decode body response in object instead of array --- src/Client.php | 4 ++-- src/Response/AbstractResponse.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Client.php b/src/Client.php index dde36cf..ff84962 100755 --- a/src/Client.php +++ b/src/Client.php @@ -456,8 +456,8 @@ private function setErrorsOnResponse($response, $errors) { $errorsToSet = []; foreach ($errors as $oneError) { - if (isset($oneError['message'])) { - $errorsToSet[] = $oneError['message']; + if (isset($oneError->message)) { + $errorsToSet[] = $oneError->message; } } $response->setError($errorsToSet); diff --git a/src/Response/AbstractResponse.php b/src/Response/AbstractResponse.php index 730a9f1..84f91b5 100755 --- a/src/Response/AbstractResponse.php +++ b/src/Response/AbstractResponse.php @@ -106,7 +106,7 @@ public function getBody($returnStream = true) */ public function setBody($body) { - $jsonBody = json_decode($body, true); + $jsonBody = json_decode($body); $this->body = $jsonBody; return $this; From 6d4e27dc7c28e9e7d9e2d04db1c4419ef97f935e Mon Sep 17 00:00:00 2001 From: kgleizes Date: Thu, 27 Oct 2022 11:41:17 +0200 Subject: [PATCH 16/21] refs #37150 Magento Module submission Fix CS Fixer --- src/Stream.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Stream.php b/src/Stream.php index d468ebd..43653e5 100644 --- a/src/Stream.php +++ b/src/Stream.php @@ -234,9 +234,9 @@ public function isSeekable() * @param int $offset * @param int $whence * - * @throws RuntimeException - * * @return void + * + * @throws RuntimeException */ public function seek($offset, $whence = SEEK_SET) { @@ -274,9 +274,9 @@ public function isWritable() /** * @param string $string * - * @throws RuntimeException - * * @return false|int + * + * @throws RuntimeException */ public function write($string) { @@ -314,9 +314,9 @@ public function isReadable() /** * @param int $length * - * @throws RuntimeException - * * @return false|string + * + * @throws RuntimeException */ public function read($length) { From c9624c51dcb90bec2d15b347548a69c86fb73895 Mon Sep 17 00:00:00 2001 From: Alexandre Fayadas Date: Fri, 1 Aug 2025 14:37:06 +0200 Subject: [PATCH 17/21] refs #53277 : update call for api v3 --- src/Client.php | 2 +- src/Model/Bank/Bank.php | 202 ++------------------------- src/Model/Payment/CreatePayment.php | 63 +++------ src/Model/Payment/Payment.php | 16 +-- src/Model/Payment/PaymentUser.php | 86 ++++++++++++ src/Request/AbstractRequest.php | 2 +- src/Request/BankRequest.php | 4 +- src/Request/CreatePaymentRequest.php | 2 +- src/Request/ListBanksRequest.php | 2 +- 9 files changed, 124 insertions(+), 255 deletions(-) diff --git a/src/Client.php b/src/Client.php index ff84962..5e58ca0 100644 --- a/src/Client.php +++ b/src/Client.php @@ -72,7 +72,7 @@ class Client /** * @var string */ - private $version = '2021-06-01'; + private $version = '2025-01-15'; /** * @var Stream diff --git a/src/Model/Bank/Bank.php b/src/Model/Bank/Bank.php index 1ecd1f7..a63211a 100755 --- a/src/Model/Bank/Bank.php +++ b/src/Model/Bank/Bank.php @@ -40,21 +40,6 @@ class Bank extends AbstractModel */ protected $logoUrl; - /** - * @var null|bool - */ - protected $isHighlighted; - - /** - * @var ?string - */ - protected $primaryColor; - - /** - * @var ?string - */ - protected $secondaryColor; - /** * @var ?string */ @@ -63,22 +48,7 @@ class Bank extends AbstractModel /** * @var array */ - protected $capabilities = []; - - /** - * @var array - */ - protected $form = []; - - /** - * @var array - */ - protected $channelType = []; - - /** - * @var ?int - */ - protected $displayOrder; + protected $environments = []; /** * @return int @@ -184,84 +154,6 @@ public function setLogoUrl($logoUrl) ); } - /** - * @return null|bool - */ - public function isHighlighted() - { - return $this->isHighlighted; - } - - /** - * @param null|bool $isHighlighted - * - * @return Bank - */ - public function setIsHighlighted($isHighlighted) - { - if (true === \is_bool($isHighlighted) || null === $isHighlighted) { - $this->isHighlighted = $isHighlighted; - - return $this; - } - - throw new InvalidArgumentException( - 'Is highlighted must be a string or null, '.\gettype($isHighlighted).' is given.' - ); - } - - /** - * @return null|string - */ - public function getPrimaryColor() - { - return $this->primaryColor; - } - - /** - * @param null|string $primaryColor - * - * @return Bank - */ - public function setPrimaryColor($primaryColor) - { - if (true === \is_string($primaryColor) || null === $primaryColor) { - $this->primaryColor = $primaryColor; - - return $this; - } - - throw new InvalidArgumentException( - 'Primary color must be a string or null, '.\gettype($primaryColor).' is given.' - ); - } - - /** - * @return null|string - */ - public function getSecondaryColor() - { - return $this->secondaryColor; - } - - /** - * @param null|string $secondaryColor - * - * @return Bank - */ - public function setSecondaryColor($secondaryColor) - { - if (true === \is_string($secondaryColor) || null === $secondaryColor) { - $this->secondaryColor = $secondaryColor; - - return $this; - } - - throw new InvalidArgumentException( - 'Secondary color must be a string or null, '.\gettype($secondaryColor).' is given.' - ); - } - /** * @return null|string */ @@ -291,104 +183,26 @@ public function setParentName($parentName) /** * @return array */ - public function getCapabilities() - { - return $this->capabilities; - } - - /** - * @param array $capabilities - * - * @return Bank - */ - public function setCapabilities($capabilities) - { - if (true === \is_array($capabilities)) { - $this->capabilities = $capabilities; - - return $this; - } - - throw new InvalidArgumentException( - 'Capabilities must be an array, '.\gettype($capabilities).' is given.' - ); - } - - /** - * @return array - */ - public function getForm() - { - return $this->form; - } - - /** - * @param array $form - * - * @return Bank - */ - public function setForm($form) - { - if (true === \is_array($form)) { - $this->form = $form; - - return $this; - } - - throw new InvalidArgumentException( - 'Form must be an array, '.\gettype($form).' is given.' - ); - } - - /** - * @return array - */ - public function getChannelType() - { - return $this->channelType; - } - - /** - * @param array $channelType - * - * @return Bank - */ - public function setChannelType($channelType) - { - if (true === \is_array($channelType)) { - $this->channelType = $channelType; - - return $this; - } - - throw new InvalidArgumentException( - 'Channel type must be an array, '.\gettype($channelType).' is given.' - ); - } - - /** - * @return null|int - */ - public function getDisplayOrder() + public function getEnvironments() { - return $this->displayOrder; + return $this->environments; } /** - * @param null|int $displayOrder + * @param array $environments * * @return Bank */ - public function setDisplayOrder($displayOrder) + public function setEnvironments($environments) { - if (true === \is_int($displayOrder) || null === $displayOrder) { - $this->displayOrder = $displayOrder; + if (true === \is_array($environments)) { + $this->environments = $environments; return $this; } throw new InvalidArgumentException( - 'Display order must be an int or null, '.\gettype($displayOrder).' is given.' + 'Environments must be an array, '.\gettype($environments).' is given.' ); } } diff --git a/src/Model/Payment/CreatePayment.php b/src/Model/Payment/CreatePayment.php index 6253fdb..e66e592 100755 --- a/src/Model/Payment/CreatePayment.php +++ b/src/Model/Payment/CreatePayment.php @@ -23,17 +23,12 @@ class CreatePayment extends AbstractModel /** * @var string */ - private $successfulCallbackUrl; - - /** - * @var string - */ - private $unsuccessfulCallbackUrl; + private $callbackUrl; /** * @var int */ - private $bankId; + private $providerId; /** * @var array @@ -48,78 +43,52 @@ class CreatePayment extends AbstractModel /** * @return string */ - public function getSuccessfulCallbackUrl() - { - return $this->successfulCallbackUrl; - } - - /** - * @param string $successfulCallbackUrl - * - * @return CreatePayment - */ - public function setSuccessfulCallbackUrl($successfulCallbackUrl) - { - if (true === \is_string($successfulCallbackUrl)) { - $this->successfulCallbackUrl = $successfulCallbackUrl; - - return $this; - } - - throw new InvalidArgumentException( - 'Successful callback url must be a string '.\gettype($successfulCallbackUrl).' is given.' - ); - } - - /** - * @return string - */ - public function getUnsuccessfulCallbackUrl() + public function getCallbackUrl() { - return $this->unsuccessfulCallbackUrl; + return $this->callbackUrl; } /** - * @param string $unsuccessfulCallbackUrl + * @param string $callbackUrl * * @return CreatePayment */ - public function setUnsuccessfulCallbackUrl($unsuccessfulCallbackUrl) + public function setCallbackUrl($callbackUrl) { - if (true === \is_string($unsuccessfulCallbackUrl)) { - $this->unsuccessfulCallbackUrl = $unsuccessfulCallbackUrl; + if (true === \is_string($callbackUrl)) { + $this->callbackUrl = $callbackUrl; return $this; } throw new InvalidArgumentException( - 'Unsuccessful callback url must be a string '.\gettype($unsuccessfulCallbackUrl).' is given.' + 'Callback url must be a string '.\gettype($callbackUrl).' is given.' ); } /** * @return int */ - public function getBankId() + public function getProviderId() { - return $this->bankId; + return $this->providerId; } /** - * @param int $bankId + * @param int $providerId * * @return CreatePayment */ - public function setBankId($bankId) + public function setProviderId($providerId) { - if (true === \is_int($bankId)) { - $this->bankId = $bankId; + if (true === \is_int($providerId)) { + $this->providerId = $providerId; return $this; } throw new InvalidArgumentException( - 'Bank id must be an int '.\gettype($bankId).' is given.' + 'Provider id must be an int '.\gettype($providerId).' is given.' ); } diff --git a/src/Model/Payment/Payment.php b/src/Model/Payment/Payment.php index f89592b..56db93d 100755 --- a/src/Model/Payment/Payment.php +++ b/src/Model/Payment/Payment.php @@ -39,7 +39,7 @@ class Payment extends AbstractModel /** * @var int */ - private $bankId; + private $providerId; /** * @var string @@ -130,26 +130,26 @@ public function setStatusReason($statusReason) /** * @return int */ - public function getBankId() + public function getProviderId() { - return $this->bankId; + return $this->providerId; } /** - * @param int $bankId + * @param int $providerId * * @return Payment */ - public function setBankId($bankId) + public function setProviderId($providerId) { - if (true === \is_int($bankId)) { - $this->bankId = $bankId; + if (true === \is_int($providerId)) { + $this->providerId = $providerId; return $this; } throw new InvalidArgumentException( - 'Bank id must be an int '.\gettype($bankId).' is given.' + 'Provider id must be an int '.\gettype($providerId).' is given.' ); } diff --git a/src/Model/Payment/PaymentUser.php b/src/Model/Payment/PaymentUser.php index f04bc41..0ac1d9d 100644 --- a/src/Model/Payment/PaymentUser.php +++ b/src/Model/Payment/PaymentUser.php @@ -30,6 +30,21 @@ class PaymentUser extends AbstractModel */ private $lastName; + /** + * @var string + */ + protected $companyName; + + /** + * @var string + */ + protected $email; + + /** + * @var string + */ + protected $externalReference; + /** * @var string */ @@ -83,6 +98,77 @@ public function setLastName($lastName) throw new InvalidArgumentException('Last name must be a string '.\gettype($lastName).' is given.'); } + /** + * @return string + */ + public function getCompanyName(): string + { + return $this->companyName; + } + + /** + * @param string $companyName + * + * @return PaymentUser + */ + public function setCompanyName(string $companyName): PaymentUser + { + if (true === \is_string($companyName)) { + $this->companyName = $companyName; + + return $this; + } + + throw new InvalidArgumentException('Company name must be a string '.\gettype($companyName).' is given.'); } + + /** + * @return string + */ + public function getEmail(): string + { + return $this->email; + } + + /** + * @param string $email + * + * @return PaymentUser + */ + public function setEmail(string $email): PaymentUser + { + if (true === \is_string($email)) { + $this->email = $email; + + return $this; + } + + throw new InvalidArgumentException('Email must be a string '.\gettype($email).' is given.'); + } + + /** + * @return string + */ + public function getExternalReference(): string + { + return $this->externalReference; + } + + /** + * @param string $externalReference + * + * @return PaymentUser + */ + public function setExternalReference(string $externalReference): PaymentUser + { + if (true === \is_string($externalReference)) { + $this->externalReference = $externalReference; + + return $this; + } + + throw new InvalidArgumentException('External reference must be a string '.\gettype($externalReference).' is given.'); + } + /** * @return string */ diff --git a/src/Request/AbstractRequest.php b/src/Request/AbstractRequest.php index c6c4490..3346ee3 100755 --- a/src/Request/AbstractRequest.php +++ b/src/Request/AbstractRequest.php @@ -52,7 +52,7 @@ abstract class AbstractRequest implements RequestInterface, JsonSerializable public function __construct(array $headers = [], $version = '1.1', $query = []) { $this->uri = new ApiUri(); - $this->uri = $this->uri->withPath('/v2'.$this->requestTarget); + $this->uri = $this->uri->withPath('/v3' . $this->requestTarget); $this->setQuery($query); if (!empty($this->getQuery())) { diff --git a/src/Request/BankRequest.php b/src/Request/BankRequest.php index f68902c..e4c5aac 100755 --- a/src/Request/BankRequest.php +++ b/src/Request/BankRequest.php @@ -22,7 +22,7 @@ class BankRequest extends AbstractRequest { - protected $requestTarget = '/banks/:idBank'; + protected $requestTarget = '/providers/:providerId'; protected $method = 'GET'; @@ -34,7 +34,7 @@ class BankRequest extends AbstractRequest public function setModel(AbstractModel $body) { if ($body instanceof Bank) { - $this->uri = $this->uri->withPath(str_replace(':idBank', (string) $body->getId(), $this->uri->getPath())); + $this->uri = $this->uri->withPath(str_replace(':providerId', (string) $body->getId(), $this->uri->getPath())); return parent::setModel($body); } diff --git a/src/Request/CreatePaymentRequest.php b/src/Request/CreatePaymentRequest.php index 3f487f7..63d461e 100755 --- a/src/Request/CreatePaymentRequest.php +++ b/src/Request/CreatePaymentRequest.php @@ -22,7 +22,7 @@ class CreatePaymentRequest extends AbstractRequest { - protected $requestTarget = '/payment-requests'; + protected $requestTarget = '/payment/payment-requests'; protected $method = 'POST'; diff --git a/src/Request/ListBanksRequest.php b/src/Request/ListBanksRequest.php index 083a390..792e5f4 100755 --- a/src/Request/ListBanksRequest.php +++ b/src/Request/ListBanksRequest.php @@ -23,7 +23,7 @@ class ListBanksRequest extends AbstractRequest /** * @var string */ - protected $requestTarget = '/banks'; + protected $requestTarget = '/providers'; /** * @var string From cac9889b44b32fd148caf06d9f48a42282b90508 Mon Sep 17 00:00:00 2001 From: Alexandre Fayadas Date: Fri, 8 Aug 2025 09:43:07 +0200 Subject: [PATCH 18/21] refs #53277 : fix payment call for api v3 --- src/Model/AbstractModel.php | 4 +++- src/Model/Payment/CreatePaymentUrl.php | 16 ++++++++-------- src/Model/Payment/PaymentUser.php | 26 +++++++++++++------------- src/Response/BankResponse.php | 6 ++++++ 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/Model/AbstractModel.php b/src/Model/AbstractModel.php index 77ffbdf..cc75db5 100644 --- a/src/Model/AbstractModel.php +++ b/src/Model/AbstractModel.php @@ -30,7 +30,9 @@ public function jsonSerialize() foreach ($getterName as $value) { if ('get' === substr($value, 0, 3) && 'getAfterParam' !== $value) { $key = lcfirst(substr($value, 3, \strlen($value))); - $gettableAttributes[$this->transformToPascalCase($key)] = $this->{$value}(); + if (false === empty($this->{$value}())) { + $gettableAttributes[$this->transformToPascalCase($key)] = $this->{$value}(); + } } } diff --git a/src/Model/Payment/CreatePaymentUrl.php b/src/Model/Payment/CreatePaymentUrl.php index 4d29b7e..7cdc646 100755 --- a/src/Model/Payment/CreatePaymentUrl.php +++ b/src/Model/Payment/CreatePaymentUrl.php @@ -28,7 +28,7 @@ class CreatePaymentUrl extends AbstractModel /** * @var string */ - private $consentUrl; + private $url; /** * @return string @@ -59,26 +59,26 @@ public function setId($id) /** * @return string */ - public function getConsentUrl() + public function getUrl() { - return $this->consentUrl; + return $this->url; } /** - * @param string $consentUrl + * @param string $url * * @return CreatePaymentUrl */ - public function setConsentUrl($consentUrl) + public function setUrl($url) { - if (true === \is_string($consentUrl)) { - $this->consentUrl = $consentUrl; + if (true === \is_string($url)) { + $this->url = $url; return $this; } throw new InvalidArgumentException( - 'Consent url must be a string '.\gettype($consentUrl).' is given.' + 'Consent url must be a string '.\gettype($url).' is given.' ); } } diff --git a/src/Model/Payment/PaymentUser.php b/src/Model/Payment/PaymentUser.php index 0ac1d9d..6e7a50b 100644 --- a/src/Model/Payment/PaymentUser.php +++ b/src/Model/Payment/PaymentUser.php @@ -31,22 +31,22 @@ class PaymentUser extends AbstractModel private $lastName; /** - * @var string + * @var string|null */ protected $companyName; /** - * @var string + * @var string|null */ protected $email; /** - * @var string + * @var string|null */ protected $externalReference; /** - * @var string + * @var string|null */ private $ipAddress; @@ -99,9 +99,9 @@ public function setLastName($lastName) } /** - * @return string + * @return string|null */ - public function getCompanyName(): string + public function getCompanyName(): ?string { return $this->companyName; } @@ -122,9 +122,9 @@ public function setCompanyName(string $companyName): PaymentUser throw new InvalidArgumentException('Company name must be a string '.\gettype($companyName).' is given.'); } /** - * @return string + * @return string|null */ - public function getEmail(): string + public function getEmail(): ?string { return $this->email; } @@ -146,9 +146,9 @@ public function setEmail(string $email): PaymentUser } /** - * @return string + * @return string|null */ - public function getExternalReference(): string + public function getExternalReference(): ?string { return $this->externalReference; } @@ -170,9 +170,9 @@ public function setExternalReference(string $externalReference): PaymentUser } /** - * @return string + * @return string|null */ - public function getIpAddress() + public function getIpAddress(): ?string { return $this->ipAddress; } @@ -182,7 +182,7 @@ public function getIpAddress() * * @return PaymentUser */ - public function setIpAddress($ipAddress) + public function setIpAddress(string $ipAddress) { if (true === \is_string($ipAddress)) { $this->ipAddress = $ipAddress; diff --git a/src/Response/BankResponse.php b/src/Response/BankResponse.php index ff817fc..0685c70 100755 --- a/src/Response/BankResponse.php +++ b/src/Response/BankResponse.php @@ -46,6 +46,12 @@ public function getModel() return (new Error())->hydrate($output); } + $output['logo_url'] = empty($output['images']) || empty($output['images']['logo']) ? '' : $output['images']['logo']; + $output['parent_name'] = empty($output['group_name']) ? '' : $output['group_name']; + if (isset($response['payment_metadata']['provider_environments'])) { + $output['environments'] = $output['payment_metadata']['provider_environments']; + } + return (new Bank())->hydrate($output); } } From bd723a4a80a3dea319f62703e7df472d0b15ea76 Mon Sep 17 00:00:00 2001 From: Alexandre Fayadas Date: Mon, 18 Aug 2025 15:05:04 +0200 Subject: [PATCH 19/21] refs #53277 : fix get payment request target --- src/Request/PaymentRequest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Request/PaymentRequest.php b/src/Request/PaymentRequest.php index 271e927..e9cbd08 100755 --- a/src/Request/PaymentRequest.php +++ b/src/Request/PaymentRequest.php @@ -22,7 +22,7 @@ class PaymentRequest extends AbstractRequest { - protected $requestTarget = '/payment-requests/:idPayment'; + protected $requestTarget = '/payment/payment-requests/:idPayment'; protected $method = 'GET'; From 37358195bed2db85bcbd833feaf1e2c63fd998d2 Mon Sep 17 00:00:00 2001 From: kgleizes Date: Tue, 14 Oct 2025 15:12:42 +0200 Subject: [PATCH 20/21] refs #53277 - Fix tests --- .github/workflows/main.yml | 7 +------ .github/workflows/phpunit.yml | 2 +- bridgesdk.zip | Bin 0 -> 293004 bytes gitrepo.zip | Bin 0 -> 116835 bytes 4 files changed, 2 insertions(+), 7 deletions(-) create mode 100644 bridgesdk.zip create mode 100644 gitrepo.zip diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 79753a6..8c7f752 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,11 +9,6 @@ jobs: - name: Checkout uses: actions/checkout@v2.0.0 - - name: PHP syntax checker 5.6 - uses: prestashop/github-action-php-lint/5.6@master - with: - folder-to-exclude: "! -path \"./.php-cs-fixer.dist.php\" ! -path \"./tests/*\" ! -path \"./vendor/*\"" - - name: PHP syntax checker 7.4 uses: prestashop/github-action-php-lint/7.4@master with: @@ -38,7 +33,7 @@ jobs: uses: actions/checkout@v2.0.0 - name: Cache dependencies - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: vendor key: php-${{ hashFiles('composer.lock') }} diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index a22a975..29b8ade 100755 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -14,7 +14,7 @@ jobs: uses: actions/checkout@v2.0.0 - name: Cache dependencies - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: vendor key: php-${{ hashFiles('composer.lock') }} diff --git a/bridgesdk.zip b/bridgesdk.zip new file mode 100644 index 0000000000000000000000000000000000000000..f70c55715439f9d5ba886fd2f1738fce1204d173 GIT binary patch literal 293004 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⪚XuU_l8#AD~==>qk)ITY?_PZ`CU6L`M-!g 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�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

PP9%vgCdd!j^p?Ab9&*Fh%(4F2@W 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%0A=J)M7|md!kgG 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 z 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 Date: Tue, 14 Oct 2025 15:37:49 +0200 Subject: [PATCH 21/21] refs #53277 - Improve version --- .github/workflows/main.yml | 2 +- composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8c7f752..ec175bd 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,7 +3,7 @@ on: [push] jobs: # Check there is no syntax errors in the project php-linter: - name: PHP Syntax check 5.6|7.4|8.1 + name: PHP Syntax check 7.4|8.1 runs-on: ubuntu-latest steps: - name: Checkout diff --git a/composer.json b/composer.json index 1116fa3..f0badc3 100755 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "202ecommerce/bridge-sdk", - "version": "1.0.0", + "version": "2.0.0", "description": "Bridge API SDK", "homepage": "https://docs.bridgeapi.io/", "license": "AFL-3.0",