diff --git a/README.md b/README.md index 5dc64e5..9d66930 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,8 @@ To do this we need to transform our payment request to an API request: Now we have an API Request that we can execute using our API Connection: - $apiResponse = $apiConnection->execute($apiRequest); + $requestHeaders = []; // Optional request headers + $apiResponse = $apiConnection->execute($apiRequest, $requestHeaders); ### Handling the responses diff --git a/composer.json b/composer.json index f35e40a..3a28153 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "payvision/payvision-sdk-php", "description": "Payvision PHP SDK", "type": "library", - "version": "4.0.0", + "version": "4.1.0", "license": "MIT", "require": { "php": "^7.0.13|^7.1", diff --git a/src/Application/Payments/Service/Marshaller.php b/src/Application/Payments/Service/Marshaller.php index 7e8ab9d..546c854 100644 --- a/src/Application/Payments/Service/Marshaller.php +++ b/src/Application/Payments/Service/Marshaller.php @@ -61,7 +61,7 @@ private function marshall($object, string $targetObject) return JsonToObject::build($targetObject, $json); } catch (Exception $exception) { throw new Exception( - \sprintf('Error while marshalling object: %1', $exception->getMessage()) + \sprintf('Error while marshalling object: %s', $exception->getMessage()) ); } } diff --git a/src/Infrastructure/ApiConnection.php b/src/Infrastructure/ApiConnection.php index 8436d11..f0db4b5 100644 --- a/src/Infrastructure/ApiConnection.php +++ b/src/Infrastructure/ApiConnection.php @@ -70,15 +70,16 @@ public function __construct( /** * @param Request $request + * @param array $requestHeaders * @return mixed * @throws ApiException * @throws BuilderException * @throws ErrorResponse */ - public function execute(Request $request) + public function execute(Request $request, array $requestHeaders = []) { $this->validateResponseClasses($request); - $jsonResponse = $this->doRequest($request); + $jsonResponse = $this->doRequest($request, $requestHeaders); return $this->handleResponse($jsonResponse, $request); } @@ -103,14 +104,15 @@ public function executeAndReturnArray(Request $request): array /** * @param Request $request + * @param RequestHeaderCollection $requestHeaderCollection * @return array * @throws ApiException */ - private function get(Request $request): array + private function get(Request $request, RequestHeaderCollection $requestHeaderCollection): array { $guzzleResponse = $this->client->get( $request->getUri(), - $this->buildRequestArray($request) + $this->buildRequestArray($request, $requestHeaderCollection) ); $this->lastJsonRequest = $request->getPathParams(); @@ -119,7 +121,7 @@ private function get(Request $request): array $json = \json_decode($contents, true); if (!\is_array($json)) { - $this->logDebugData($this->lastJsonRequest, ['_raw_response' => $contents]); + $this->logDebugData($this->lastJsonRequest, ['_raw_response' => $contents], $requestHeaderCollection); throw new ApiException( \sprintf('Response is not JSON: %1$s', $contents), ApiException::INVALID_RESPONSE @@ -131,16 +133,17 @@ private function get(Request $request): array /** * @param Request $request + * @param RequestHeaderCollection $requestHeaderCollection * @return array * @throws ApiException */ - private function post(Request $request): array + private function post(Request $request, RequestHeaderCollection $requestHeaderCollection): array { // Build request according to request object $jsonRequest = $this->prepareJsonRequest($request); $guzzleResponse = $this->client->post( $request->getUri(), - $this->buildRequestArray($request, $jsonRequest) + $this->buildRequestArray($request, $requestHeaderCollection, $jsonRequest) ); $this->lastJsonRequest = $jsonRequest; @@ -149,7 +152,7 @@ private function post(Request $request): array $json = \json_decode($contents, true); if (!\is_array($json)) { - $this->logDebugData($this->lastJsonRequest, ['_raw_response' => $contents]); + $this->logDebugData($this->lastJsonRequest, ['_raw_response' => $contents], $requestHeaderCollection); throw new ApiException( \sprintf('Response is not JSON: %1$s', $contents), ApiException::INVALID_RESPONSE @@ -162,13 +165,23 @@ private function post(Request $request): array /** * @param array $jsonRequest * @param array $jsonResponse + * @param RequestHeaderCollection $requestHeaderCollection * @return null */ - private function logDebugData(array $jsonRequest, array $jsonResponse) - { + private function logDebugData( + array $jsonRequest, + array $jsonResponse, + RequestHeaderCollection $requestHeaderCollection + ) { $debugData = \sprintf( - '%1$sRequest:%1$s%2$s%1$sResponse:%1$s%3$s%1$s', + '%1$s%2$sRequest:%1$s%3$s%1$sResponse:%1$s%4$s%1$s', \PHP_EOL, + \count($requestHeaderCollection) > 0 ? + \sprintf( + 'Request headers:%1$s%2$s%1$s', + \PHP_EOL, + \json_encode($requestHeaderCollection->getHeaders(), \JSON_PRETTY_PRINT) + ) : '', \json_encode($jsonRequest, \JSON_PRETTY_PRINT), \json_encode($jsonResponse, \JSON_PRETTY_PRINT) ); @@ -237,17 +250,19 @@ private function handleResponse( /** * @param Request $request + * @param array $requestHeaders * @return array * @throws ApiException */ - private function doRequest(Request $request): array + private function doRequest(Request $request, array $requestHeaders = []): array { + $requestHeaderCollection = $this->buildRequestHeaderCollection($requestHeaders); switch ($request->getMethod()) { case Request::METHOD_GET: - $jsonResponse = $this->get($request); + $jsonResponse = $this->get($request, $requestHeaderCollection); break; case Request::METHOD_POST: - $jsonResponse = $this->post($request); + $jsonResponse = $this->post($request, $requestHeaderCollection); break; default: throw new ApiException( @@ -258,7 +273,7 @@ private function doRequest(Request $request): array } if ($this->debug) { - $this->logDebugData($this->lastJsonRequest, $jsonResponse); + $this->logDebugData($this->lastJsonRequest, $jsonResponse, $requestHeaderCollection); } return $jsonResponse; @@ -287,19 +302,40 @@ private function prepareJsonRequest(Request $request): array /** * @param Request $request + * @param RequestHeaderCollection $requestHeaderCollection * @param array $jsonRequest * @return array */ - private function buildRequestArray(Request $request, array $jsonRequest = null): array - { + private function buildRequestArray( + Request $request, + RequestHeaderCollection $requestHeaderCollection, + array $jsonRequest = null + ): array { $returnValue = [ 'query' => $request->getPathParams(), ]; + if (\count($requestHeaderCollection) > 0) { + $returnValue['headers'] = $requestHeaderCollection->getHeaders(); + } + if ($jsonRequest !== null) { $returnValue['json'] = $jsonRequest; } return $returnValue; } + + /** + * @param string[],array $headers + * @return RequestHeaderCollection + */ + private function buildRequestHeaderCollection(array $headers): RequestHeaderCollection + { + $requestHeader = new RequestHeaderCollection(); + foreach ($headers as $key => $value) { + $requestHeader->add($key, $value); + } + return $requestHeader; + } } diff --git a/src/Infrastructure/RequestHeaderCollection.php b/src/Infrastructure/RequestHeaderCollection.php new file mode 100644 index 0000000..957d9bf --- /dev/null +++ b/src/Infrastructure/RequestHeaderCollection.php @@ -0,0 +1,55 @@ + + */ + protected $headers = []; + + /** + * @param string $header + * @param string $value + * @return $this + */ + public function add(string $header, string $value): self + { + $this->headers[$header] = $value; + return $this; + } + + /** + * @return ArrayIterator|Traversable + */ + public function getIterator() + { + return new ArrayIterator($this->headers); + } + + /** + * @return array + */ + public function getHeaders(): array + { + return $this->headers; + } + + /** + * @return int + */ + public function count(): int + { + return \count($this->headers); + } +} diff --git a/tests/Test/Unit/Infrastructure/RequestHeaderCollectionTest.php b/tests/Test/Unit/Infrastructure/RequestHeaderCollectionTest.php new file mode 100644 index 0000000..d9bc31e --- /dev/null +++ b/tests/Test/Unit/Infrastructure/RequestHeaderCollectionTest.php @@ -0,0 +1,37 @@ +assertEquals(0, $requestHeaders->count()); + + $requestHeaders->add(RequestHeaderCollection::HEADER_EXECUTION_MODE, 'test'); + $this->assertEquals(1, $requestHeaders->count()); + + foreach ($requestHeaders as $key => $value) { + $this->assertEquals(RequestHeaderCollection::HEADER_EXECUTION_MODE, $key); + $this->assertEquals('test', $value); + } + + $headers = $requestHeaders->getHeaders(); + $this->assertArrayHasKey(RequestHeaderCollection::HEADER_EXECUTION_MODE, $headers); + $this->assertEquals($headers[RequestHeaderCollection::HEADER_EXECUTION_MODE], 'test'); + } +}