Skip to content

Commit 12baa4c

Browse files
authored
Refund and Void support (#8)
* add Tarmo's changes * add void and refund responses, add tests * rename get/setReason to get/setVoidReason * make reason optional
1 parent ec61271 commit 12baa4c

File tree

10 files changed

+486
-0
lines changed

10 files changed

+486
-0
lines changed

src/Concerns/Parameters.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,14 @@ public function setSaveCard($saveCard)
137137
{
138138
return $this->setParameter('saveCard', $saveCard);
139139
}
140+
141+
public function getVoidReason()
142+
{
143+
return $this->getParameter('voidReason');
144+
}
145+
146+
public function setVoidReason($reason)
147+
{
148+
return $this->setParameter('voidReason', $reason);
149+
}
140150
}

src/Gateway.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
use Omnipay\Common\AbstractGateway;
66
use Omnipay\EveryPay\Enums\PaymentType;
77
use Omnipay\EveryPay\Support\SignedData;
8+
use Omnipay\EveryPay\Messages\VoidRequest;
9+
use Omnipay\EveryPay\Messages\RefundRequest;
810
use Omnipay\EveryPay\Messages\CaptureRequest;
911
use Omnipay\EveryPay\Messages\CitPaymentRequest;
1012
use Omnipay\EveryPay\Messages\MitPaymentRequest;
@@ -69,4 +71,14 @@ public function capture($options = [])
6971
{
7072
return $this->createRequest(CaptureRequest::class, $options);
7173
}
74+
75+
public function refund($options = [])
76+
{
77+
return $this->createRequest(RefundRequest::class, $options);
78+
}
79+
80+
public function void($options = [])
81+
{
82+
return $this->createRequest(VoidRequest::class, $options);
83+
}
7284
}

src/Messages/RefundRequest.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace Omnipay\EveryPay\Messages;
4+
5+
use Omnipay\Common\Exception\InvalidResponseException;
6+
7+
class RefundRequest extends AbstractRequest
8+
{
9+
public function getData()
10+
{
11+
$this->validate(
12+
'amount',
13+
'transactionReference'
14+
);
15+
16+
$baseData = $this->getBaseData();
17+
18+
return array_merge($baseData, [
19+
'amount' => $this->getAmount(),
20+
'payment_reference' => $this->getTransactionReference(),
21+
]);
22+
}
23+
24+
public function sendData($data): RefundResponse
25+
{
26+
try {
27+
$payment = $this->httpRequest(
28+
'POST',
29+
$this->getEndpoint() . '/payments/refund',
30+
$this->getHeaders(),
31+
$data
32+
);
33+
34+
return $this->response = new RefundResponse(
35+
$this,
36+
$payment
37+
);
38+
} catch (InvalidResponseException $e) {
39+
return $this->response = new RefundResponse(
40+
$this,
41+
[
42+
'error' => [
43+
'message' => $e->getMessage(),
44+
'code' => $e->getCode(),
45+
],
46+
]
47+
);
48+
}
49+
}
50+
}

src/Messages/RefundResponse.php

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
3+
namespace Omnipay\EveryPay\Messages;
4+
5+
use Omnipay\EveryPay\Enums\PaymentState;
6+
use Omnipay\Common\Message\AbstractResponse;
7+
use Omnipay\Common\Message\RequestInterface;
8+
9+
/**
10+
* Response
11+
*/
12+
class RefundResponse extends AbstractResponse
13+
{
14+
public $failed = false;
15+
16+
protected $message = null;
17+
protected $code = null;
18+
19+
public function __construct(RequestInterface $request, $data)
20+
{
21+
parent::__construct($request, $data);
22+
23+
$this->validateData();
24+
}
25+
26+
protected function validateData()
27+
{
28+
if (! $this->data) {
29+
$this->fail('Missing data!');
30+
31+
return;
32+
}
33+
34+
if (isset($this->data['error'])) {
35+
$this->fail(
36+
$this->data['error']['message'],
37+
$this->data['error']['code'] ?? null
38+
);
39+
40+
return;
41+
}
42+
43+
$this->message = 'Payment state - ' . $this->data['payment_state'];
44+
}
45+
46+
protected function fail($message, $code = null)
47+
{
48+
$this->failed = true;
49+
$this->code = $code;
50+
$this->message = $message;
51+
}
52+
53+
public function getMessage(): ?string
54+
{
55+
return $this->message;
56+
}
57+
58+
public function getCode()
59+
{
60+
return $this->code;
61+
}
62+
63+
protected function getPaymentState()
64+
{
65+
return $this->data['payment_state'] ?? null;
66+
}
67+
68+
public function isSuccessful(): bool
69+
{
70+
if ($this->failed) {
71+
return false;
72+
}
73+
74+
return PaymentState::REFUNDED === $this->getPaymentState();
75+
}
76+
77+
/**
78+
* This is the Payment Gateway’s reference to the transaction
79+
*/
80+
public function getTransactionReference()
81+
{
82+
return $this->data['payment_reference'] ?? null;
83+
}
84+
85+
/**
86+
* Initial amount used for the transaction.
87+
*/
88+
public function getInitialAmount()
89+
{
90+
return $this->data['initial_amount'] ?? null;
91+
}
92+
93+
/**
94+
* Payment standing amount.
95+
*/
96+
public function getStandingAmount()
97+
{
98+
return $this->data['standing_amount'] ?? null;
99+
}
100+
}

src/Messages/VoidRequest.php

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
namespace Omnipay\EveryPay\Messages;
4+
5+
use Omnipay\Common\Exception\InvalidResponseException;
6+
7+
class VoidRequest extends AbstractRequest
8+
{
9+
public function getData()
10+
{
11+
$this->validate(
12+
'transactionReference'
13+
);
14+
15+
$data = array_merge(
16+
$this->getBaseData(),
17+
['payment_reference' => $this->getTransactionReference()]
18+
);
19+
20+
if ($reason = $this->getVoidReason()) {
21+
$data['reason'] = $reason;
22+
}
23+
24+
return $reason;
25+
}
26+
27+
public function sendData($data): VoidResponse
28+
{
29+
try {
30+
$payment = $this->httpRequest(
31+
'POST',
32+
$this->getEndpoint() . '/payments/void',
33+
$this->getHeaders(),
34+
$data
35+
);
36+
37+
return $this->response = new VoidResponse(
38+
$this,
39+
$payment
40+
);
41+
} catch (InvalidResponseException $e) {
42+
return $this->response = new VoidResponse(
43+
$this,
44+
[
45+
'error' => [
46+
'message' => $e->getMessage(),
47+
'code' => $e->getCode(),
48+
],
49+
]
50+
);
51+
}
52+
}
53+
}

src/Messages/VoidResponse.php

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
<?php
2+
3+
namespace Omnipay\EveryPay\Messages;
4+
5+
use Omnipay\EveryPay\Enums\PaymentState;
6+
use Omnipay\Common\Message\AbstractResponse;
7+
use Omnipay\Common\Message\RequestInterface;
8+
9+
/**
10+
* Response
11+
*/
12+
class VoidResponse extends AbstractResponse
13+
{
14+
public $failed = false;
15+
16+
protected $message = null;
17+
protected $code = null;
18+
19+
public function __construct(RequestInterface $request, $data)
20+
{
21+
parent::__construct($request, $data);
22+
23+
$this->validateData();
24+
}
25+
26+
protected function validateData()
27+
{
28+
if (! $this->data) {
29+
$this->fail('Missing data!');
30+
31+
return;
32+
}
33+
34+
if (isset($this->data['error'])) {
35+
$this->fail(
36+
$this->data['error']['message'],
37+
$this->data['error']['code'] ?? null
38+
);
39+
40+
return;
41+
}
42+
43+
$this->message = 'Payment state - ' . $this->data['payment_state'];
44+
}
45+
46+
protected function fail($message, $code = null)
47+
{
48+
$this->failed = true;
49+
$this->code = $code;
50+
$this->message = $message;
51+
}
52+
53+
public function getMessage(): ?string
54+
{
55+
return $this->message;
56+
}
57+
58+
public function getCode()
59+
{
60+
return $this->code;
61+
}
62+
63+
protected function getPaymentState()
64+
{
65+
return $this->data['payment_state'] ?? null;
66+
}
67+
68+
public function isSuccessful(): bool
69+
{
70+
if ($this->failed) {
71+
return false;
72+
}
73+
74+
return PaymentState::VOIDED === $this->getPaymentState();
75+
}
76+
77+
/**
78+
* This is the Payment Gateway’s reference to the transaction
79+
*/
80+
public function getTransactionReference()
81+
{
82+
return $this->data['payment_reference'] ?? null;
83+
}
84+
}

0 commit comments

Comments
 (0)