Skip to content

Commit d287bd3

Browse files
Add Detach & Fetch source (#184)
1 parent 431dfde commit d287bd3

12 files changed

+352
-3
lines changed

src/Gateway.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,13 +321,31 @@ public function createSource(array $parameters = array())
321321

322322
/**
323323
* @param array $parameters
324-
* @return \Omnipay\Stripe\Message\CreateSourceRequest
324+
* @return \Omnipay\Stripe\Message\AttachSourceRequest
325325
*/
326326
public function attachSource(array $parameters = array())
327327
{
328328
return $this->createRequest('\Omnipay\Stripe\Message\AttachSourceRequest', $parameters);
329329
}
330330

331+
/**
332+
* @param array $parameters
333+
* @return \Omnipay\Stripe\Message\FetchSourceRequest
334+
*/
335+
public function detachSource(array $parameters = array())
336+
{
337+
return $this->createRequest('\Omnipay\Stripe\Message\DetachSourceRequest', $parameters);
338+
}
339+
340+
/**
341+
* @param array $parameters
342+
* @return \Omnipay\Stripe\Message\FetchSourceRequest
343+
*/
344+
public function fetchSource(array $parameters = array())
345+
{
346+
return $this->createRequest('\Omnipay\Stripe\Message\FetchSourceRequest', $parameters);
347+
}
348+
331349
/**
332350
* Create a completePurchase request.
333351
*

src/Message/AttachSourceRequest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
/**
88
* Class CreateSourceRequest
99
*
10-
* TODO : Add docblock
10+
* @link https://stripe.com/docs/api/sources/attach
1111
*/
1212
class AttachSourceRequest extends AbstractRequest
1313
{

src/Message/CreateSourceRequest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
/**
1010
* Class CreateSourceRequest
1111
*
12-
* TODO : Add docblock
12+
* @link https://stripe.com/docs/api/sources/create
1313
*/
1414
class CreateSourceRequest extends AbstractRequest
1515
{
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
/**
4+
* Stripe Detach Source Request.
5+
*/
6+
namespace Omnipay\Stripe\Message;
7+
8+
/**
9+
* Stripe Detach Source Request.
10+
*
11+
* Detaches a Source object from a Customer.
12+
* The status of a source is changed to consumed when it is detached and it can no longer be used to create a charge.
13+
*
14+
* @link https://stripe.com/docs/api/sources/detach
15+
*/
16+
class DetachSourceRequest extends AbstractRequest
17+
{
18+
public function getData()
19+
{
20+
$this->validate('customerReference', 'source');
21+
22+
return;
23+
}
24+
25+
public function getEndpoint()
26+
{
27+
return $this->endpoint.'/customers/'.$this->getCustomerReference().'/sources/'.$this->getSource();
28+
}
29+
30+
public function getHttpMethod()
31+
{
32+
return 'DELETE';
33+
}
34+
}

src/Message/FetchSourceRequest.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
/**
4+
* Stripe Fetch Source Request.
5+
*/
6+
namespace Omnipay\Stripe\Message;
7+
8+
/**
9+
* Stripe Fetch Source Request.
10+
*
11+
* @link https://stripe.com/docs/api/sources/retrieve
12+
*/
13+
class FetchSourceRequest extends AbstractRequest
14+
{
15+
/**
16+
* @return string|null
17+
*/
18+
public function getClientSecret()
19+
{
20+
return $this->getParameter('clientSecret');
21+
}
22+
23+
/**
24+
* @param string $value
25+
*
26+
* @return FetchSourceRequest
27+
*/
28+
public function setClientSecret($value)
29+
{
30+
return $this->setParameter('clientSecret', $value);
31+
}
32+
33+
public function getData()
34+
{
35+
$this->validate('source');
36+
$data = array();
37+
38+
if ($clientSecret = $this->getClientSecret()) {
39+
$data['client_secret'] = $clientSecret;
40+
}
41+
42+
return $data;
43+
}
44+
45+
public function getEndpoint()
46+
{
47+
return $this->endpoint.'/sources/'.$this->getSource();
48+
}
49+
50+
public function getHttpMethod()
51+
{
52+
return 'GET';
53+
}
54+
}

src/Message/Response.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,10 @@ public function getSource()
244244
return $this->data['source'];
245245
}
246246

247+
if (isset($this->data['object']) && 'source' === $this->data['object']) {
248+
return $this->data;
249+
}
250+
247251
return null;
248252
}
249253

@@ -379,6 +383,20 @@ public function getPlanId()
379383
return null;
380384
}
381385

386+
/**
387+
* Get plan id
388+
*
389+
* @return string|null
390+
*/
391+
public function getSourceId()
392+
{
393+
if (isset($this->data['object']) && 'source' === $this->data['object']) {
394+
return $this->data['id'];
395+
}
396+
397+
return null;
398+
}
399+
382400
/**
383401
* Get invoice-item reference
384402
*
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace Omnipay\Stripe\Message;
4+
5+
use Omnipay\Tests\TestCase;
6+
7+
class DetachSourceRequestTest extends TestCase
8+
{
9+
public function setUp()
10+
{
11+
$this->request = new DetachSourceRequest($this->getHttpClient(), $this->getHttpRequest());
12+
$this->request->setSource('src_1GyjQZK1civsTrrUGHtiV3AN');
13+
$this->request->setCustomerReference('cus_HVUs00WcT4j06R');
14+
}
15+
16+
public function testEndpoint()
17+
{
18+
$this->assertSame('https://api.stripe.com/v1/customers/cus_HVUs00WcT4j06R/sources/src_1GyjQZK1civsTrrUGHtiV3AN', $this->request->getEndpoint());
19+
}
20+
21+
public function testSendSuccess()
22+
{
23+
$this->setMockHttpResponse('DetachSourceSuccess.txt');
24+
$response = $this->request->send();
25+
26+
$this->assertFalse($response->isSuccessful());
27+
$this->assertTrue($response->isRedirect());
28+
$this->assertNotNull($response->getSource());
29+
$this->assertNull($response->getMessage());
30+
}
31+
32+
public function testSendFailure()
33+
{
34+
$this->setMockHttpResponse('DetachSourceFailure.txt');
35+
$response = $this->request->send();
36+
37+
$this->assertFalse($response->isSuccessful());
38+
$this->assertFalse($response->isRedirect());
39+
$this->assertNull($response->getSourceId());
40+
$this->assertSame('No such source: src_1Gyk9dK1civsTrCUNB7v9XoFo', $response->getMessage());
41+
}
42+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace Omnipay\Stripe\Message;
4+
5+
use Omnipay\Tests\TestCase;
6+
7+
class FetchSourceRequestTest extends TestCase
8+
{
9+
public function setUp()
10+
{
11+
$this->request = new FetchSourceRequest($this->getHttpClient(), $this->getHttpRequest());
12+
$this->request->setSource('src_1GyjQZK1civsTrrUGHtiV3AN');
13+
$this->request->setClientSecret('src_client_secret_kO8U38RMu0NedTxDoTkOJbTc');
14+
}
15+
16+
public function testEndpoint()
17+
{
18+
$this->assertSame('https://api.stripe.com/v1/sources/src_1GyjQZK1civsTrrUGHtiV3AN', $this->request->getEndpoint());
19+
}
20+
21+
public function testSendSuccess()
22+
{
23+
$this->setMockHttpResponse('FetchSourceSuccess.txt');
24+
$response = $this->request->send();
25+
26+
$this->assertFalse($response->isSuccessful());
27+
$this->assertTrue($response->isRedirect());
28+
$this->assertSame('src_1GyjQZK1civsTrrUGHtiV3AN', $response->getSourceId());
29+
$this->assertNull($response->getMessage());
30+
}
31+
32+
public function testSendFailure()
33+
{
34+
$this->setMockHttpResponse('FetchSourceFailure.txt');
35+
$response = $this->request->send();
36+
37+
$this->assertFalse($response->isSuccessful());
38+
$this->assertFalse($response->isRedirect());
39+
$this->assertNull($response->getSource());
40+
$this->assertNull($response->getSourceId());
41+
$this->assertSame('No such source: src_1GyjQZK1civsTrrUGHtiV3ANo', $response->getMessage());
42+
}
43+
}

tests/Mock/DetachSourceFailure.txt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
HTTP/1.1 404 Not Found
2+
Server: nginx
3+
Date: Tue, 26 Feb 2013 16:32:51 GMT
4+
Content-Type: application/json;charset=utf-8
5+
Content-Length: 131
6+
Connection: keep-alive
7+
Access-Control-Max-Age: 300
8+
Access-Control-Allow-Credentials: true
9+
Cache-Control: no-cache, no-store
10+
11+
12+
{
13+
"error": {
14+
"code": "resource_missing",
15+
"doc_url": "https://stripe.com/docs/error-codes/resource-missing",
16+
"message": "No such source: src_1Gyk9dK1civsTrCUNB7v9XoFo",
17+
"param": "id",
18+
"type": "invalid_request_error"
19+
}
20+
}

tests/Mock/DetachSourceSuccess.txt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
HTTP/1.1 200 OK
2+
Server: nginx
3+
Date: Sat, 27 Jun 2020 21:12:02 GMT
4+
Content-Type: application/json
5+
Content-Length: 943
6+
Connection: keep-alive
7+
Access-Control-Allow-Credentials: true
8+
Cache-Control: no-cache, no-store
9+
10+
{
11+
"id": "src_1Gyk9dK1civsTrCUNB7v9XoF",
12+
"object": "source",
13+
"amount": null,
14+
"card": {
15+
"exp_month": 6,
16+
"exp_year": 2021,
17+
"last4": "4242",
18+
"country": "US",
19+
"brand": "Visa",
20+
"funding": "credit",
21+
"fingerprint": "f1JoQaLEG7ovd7N4",
22+
"three_d_secure": "optional",
23+
"name": null,
24+
"address_line1_check": null,
25+
"address_zip_check": null,
26+
"cvc_check": null,
27+
"tokenization_method": null,
28+
"dynamic_last4": null
29+
},
30+
"client_secret": "src_client_secret_ojSdoIOHML61Ar89cb2sXyuo",
31+
"created": 1593287857,
32+
"currency": null,
33+
"flow": "none",
34+
"livemode": false,
35+
"metadata": {
36+
},
37+
"owner": {
38+
"address": null,
39+
"email": null,
40+
"name": null,
41+
"phone": null,
42+
"verified_address": null,
43+
"verified_email": null,
44+
"verified_name": null,
45+
"verified_phone": null
46+
},
47+
"statement_descriptor": null,
48+
"status": "consumed",
49+
"type": "card",
50+
"usage": "reusable"
51+
}

0 commit comments

Comments
 (0)