diff --git a/src/Gateway.php b/src/Gateway.php index b61b2a10..228ad7d9 100644 --- a/src/Gateway.php +++ b/src/Gateway.php @@ -106,4 +106,13 @@ public function deleteCard(array $parameters = array()) { return $this->createRequest('\Omnipay\Stripe\Message\DeleteCardRequest', $parameters); } + + /** + * @param array $parameters + * @return \Omnipay\Stripe\Message\FetchTokenRequest + */ + public function fetchToken(array $parameters = array()) + { + return $this->createRequest('\Omnipay\Stripe\Message\FetchTokenRequest', $parameters); + } } diff --git a/src/Message/FetchTokenRequest.php b/src/Message/FetchTokenRequest.php new file mode 100644 index 00000000..b85a1d0e --- /dev/null +++ b/src/Message/FetchTokenRequest.php @@ -0,0 +1,28 @@ +validate('token'); + + $data = array(); + + return $data; + } + + public function getEndpoint() + { + return $this->endpoint.'/tokens/'.$this->getToken(); + } + + public function getHttpMethod() + { + return 'GET'; + } +} diff --git a/src/Message/FetchTransactionRequest.php b/src/Message/FetchTransactionRequest.php index 9d71cbe9..3f95f767 100644 --- a/src/Message/FetchTransactionRequest.php +++ b/src/Message/FetchTransactionRequest.php @@ -20,4 +20,9 @@ public function getEndpoint() { return $this->endpoint.'/charges/'.$this->getTransactionReference(); } + + public function getHttpMethod() + { + return 'GET'; + } } diff --git a/src/Message/Response.php b/src/Message/Response.php index ba92406b..56683cbe 100644 --- a/src/Message/Response.php +++ b/src/Message/Response.php @@ -9,29 +9,71 @@ */ class Response extends AbstractResponse { + /** + * @return bool + */ public function isSuccessful() { return !isset($this->data['error']); } + /** + * @return string|null + */ public function getTransactionReference() { if (isset($this->data['object']) && 'charge' === $this->data['object']) { return $this->data['id']; } + + return null; } + /** + * @return string|null + */ public function getCardReference() { if (isset($this->data['object']) && 'customer' === $this->data['object']) { return $this->data['id']; } + + return null; + } + + /** + * @return string|null + */ + public function getToken() + { + if (isset($this->data['object']) && 'token' === $this->data['object']) { + return $this->data['id']; + } + + return null; } + /** + * @return array|null + */ + public function getCard() + { + if (isset($this->data['card'])) { + return $this->data['card']; + } + + return null; + } + + /** + * @return string|null + */ public function getMessage() { if (!$this->isSuccessful()) { return $this->data['error']['message']; } + + return null; } } diff --git a/tests/GatewayTest.php b/tests/GatewayTest.php index e28ee1be..222d2761 100644 --- a/tests/GatewayTest.php +++ b/tests/GatewayTest.php @@ -52,6 +52,13 @@ public function testFetchTransaction() $this->assertInstanceOf('Omnipay\Stripe\Message\FetchTransactionRequest', $request); } + public function testFetchToken() + { + $request = $this->gateway->fetchToken(array()); + + $this->assertInstanceOf('Omnipay\Stripe\Message\FetchTokenRequest', $request); + } + public function testCreateCard() { $request = $this->gateway->createCard(array('description' => 'foo')); diff --git a/tests/Message/FetchTokenRequestTest.php b/tests/Message/FetchTokenRequestTest.php new file mode 100644 index 00000000..cd5e2599 --- /dev/null +++ b/tests/Message/FetchTokenRequestTest.php @@ -0,0 +1,48 @@ +request = new FetchTokenRequest($this->getHttpClient(), $this->getHttpRequest()); + $this->request->setToken('tok_15Kuns2eZvKYlo2CDt9wRdzS'); + } + + public function testEndpoint() + { + $this->assertSame('https://api.stripe.com/v1/tokens/tok_15Kuns2eZvKYlo2CDt9wRdzS', $this->request->getEndpoint()); + } + + public function testSendSuccess() + { + $this->setMockHttpResponse('FetchTokenSuccess.txt'); + $response = $this->request->send(); + + $this->assertTrue($response->isSuccessful()); + $this->assertFalse($response->isRedirect()); + $this->assertSame('tok_15Kuns2eZvKYlo2CDt9wRdzS', $response->getToken()); + $this->assertInternalType('array', $response->getCard()); + $this->assertNull($response->getMessage()); + } + + public function testSendError() + { + $this->setMockHttpResponse('FetchTokenFailure.txt'); + $response = $this->request->send(); + + $this->assertFalse($response->isSuccessful()); + $this->assertFalse($response->isRedirect()); + $this->assertNull($response->getToken()); + $this->assertNull($response->getCard()); + $this->assertSame('No such token: tok_15Kuns2eZvKYlo2CDt9wRdzS', $response->getMessage()); + } +} diff --git a/tests/Mock/FetchTokenFailure.txt b/tests/Mock/FetchTokenFailure.txt new file mode 100644 index 00000000..d559406e --- /dev/null +++ b/tests/Mock/FetchTokenFailure.txt @@ -0,0 +1,17 @@ +HTTP/1.1 404 Not Found +Server: nginx +Date: Wed, 24 Jul 2013 13:40:31 GMT +Content-Type: application/json;charset=utf-8 +Content-Length: 132 +Connection: keep-alive +Access-Control-Allow-Credentials: true +Access-Control-Max-Age: 300 +Cache-Control: no-cache, no-store + +{ + "error": { + "type": "invalid_request_error", + "message": "No such token: tok_15Kuns2eZvKYlo2CDt9wRdzS", + "param": "id" + } +} diff --git a/tests/Mock/FetchTokenSuccess.txt b/tests/Mock/FetchTokenSuccess.txt new file mode 100644 index 00000000..d5a59cac --- /dev/null +++ b/tests/Mock/FetchTokenSuccess.txt @@ -0,0 +1,40 @@ +HTTP/1.1 200 OK +Server: nginx +Date: Wed, 24 Jul 2013 07:14:02 GMT +Content-Type: application/json;charset=utf-8 +Content-Length: 1092 +Connection: keep-alive +Access-Control-Allow-Credentials: true +Access-Control-Max-Age: 300 +Cache-Control: no-cache, no-store + +{ + "id": "tok_15Kuns2eZvKYlo2CDt9wRdzS", + "livemode": false, + "created": 1421255976, + "used": false, + "object": "token", + "type": "card", + "card": { + "id": "card_15Kuns2eZvKYlo2CugO37SA3", + "object": "card", + "last4": "4242", + "brand": "Visa", + "funding": "credit", + "exp_month": 8, + "exp_year": 2016, + "fingerprint": "Xt5EWLLDS7FJjR1c", + "country": "US", + "name": null, + "address_line1": null, + "address_line2": null, + "address_city": null, + "address_state": null, + "address_zip": null, + "address_country": null, + "cvc_check": null, + "address_line1_check": null, + "address_zip_check": null, + "dynamic_last4": null + } +}