Skip to content

Commit c296f4c

Browse files
authored
Merge pull request #6 from gitkv/master
*fix bug callback signature verify, change verifying action
2 parents e0d18e5 + c7a9edc commit c296f4c

File tree

10 files changed

+321
-24
lines changed

10 files changed

+321
-24
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ Receive incoming parameters from gateway and verifying signature.
173173

174174
```php
175175
<?php
176-
if (! $uniteller->getSignaturePayment()->verify('signature_from_post_params', ['all_parameters_from_post'])) {
176+
if (! $uniteller->verifyCallbackRequest(['all_parameters_from_post_with_signature'])) {
177177
return 'invalid_signature';
178178
}
179179
```

README_RU.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,11 @@ var_dump($results);
172172

173173
### Callback
174174

175-
Приём данных от шлюза и проверка сигнатуры.
175+
Проверка сигнатуры при приёме данных от шлюза.
176176

177177
```php
178178
<?php
179-
if (! $uniteller->getSignaturePayment()->verify('signature_from_post_params', ['all_parameters_from_post'])) {
179+
if (! $uniteller->verifyCallbackRequest(['all_parameters_from_post_with_signature'])) {
180180
return 'invalid_signature';
181181
}
182182
```

src/Client.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Tmconsulting\Uniteller\Recurrent\RecurrentRequest;
1818
use Tmconsulting\Uniteller\Request\RequestInterface;
1919
use Tmconsulting\Uniteller\Results\ResultsRequest;
20+
use Tmconsulting\Uniteller\Signature\SignatureCallback;
2021
use Tmconsulting\Uniteller\Signature\SignatureInterface;
2122
use Tmconsulting\Uniteller\Signature\SignaturePayment;
2223
use Tmconsulting\Uniteller\Signature\SignatureRecurrent;
@@ -50,6 +51,11 @@ class Client implements ClientInterface
5051
*/
5152
protected $signatureRecurrent;
5253

54+
/**
55+
* @var SignatureInterface
56+
*/
57+
protected $signatureCallback;
58+
5359
/**
5460
* @var RequestInterface
5561
*/
@@ -81,6 +87,7 @@ public function __construct()
8187
$this->registerRecurrentRequest(new RecurrentRequest());
8288
$this->registerSignaturePayment(new SignaturePayment());
8389
$this->registerSignatureRecurrent(new SignatureRecurrent());
90+
$this->registerSignatureCallback(new SignatureCallback());
8491
}
8592

8693
/**
@@ -215,6 +222,17 @@ public function registerSignatureRecurrent(SignatureInterface $signature)
215222
return $this;
216223
}
217224

225+
/**
226+
* @param \Tmconsulting\Uniteller\Signature\SignatureInterface $signature
227+
* @return $this
228+
*/
229+
public function registerSignatureCallback(SignatureInterface $signature)
230+
{
231+
$this->signatureCallback = $signature;
232+
233+
return $this;
234+
}
235+
218236
/**
219237
* @return array
220238
*/
@@ -317,6 +335,14 @@ public function getSignatureRecurrent()
317335
return $this->signatureRecurrent;
318336
}
319337

338+
/**
339+
* @return \Tmconsulting\Uniteller\Signature\SignatureInterface
340+
*/
341+
public function getSignatureCallback()
342+
{
343+
return $this->signatureCallback;
344+
}
345+
320346
/**
321347
* @return \Tmconsulting\Uniteller\Http\HttpManagerInterface
322348
*/
@@ -458,4 +484,20 @@ private function getParameters($parameters)
458484

459485
return $parameters;
460486
}
487+
488+
/**
489+
* Verify signature when Client will be send callback request.
490+
*
491+
* @param array $params
492+
* @return bool
493+
*/
494+
public function verifyCallbackRequest(array $params)
495+
{
496+
return $this->signatureCallback
497+
->setOrderId(array_get($params, 'Order_ID'))
498+
->setStatus(array_get($params, 'Status'))
499+
->setFields(array_except($params, ['Order_ID', 'Status', 'Signature']))
500+
->setPassword($this->getPassword())
501+
->verify(array_get($params, 'Signature'));
502+
}
461503
}

src/ClientInterface.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,12 @@ public function confirm($parameters);
5252
* @return mixed
5353
*/
5454
public function card($parameters);
55-
}
55+
56+
/**
57+
* Verify signature when Client will be send callback request.
58+
*
59+
* @param array $params
60+
* @return bool
61+
*/
62+
public function verifyCallbackRequest(array $params);
63+
}

src/Signature/AbstractSignature.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ abstract class AbstractSignature implements SignatureInterface, ArraybleInterfac
1919
{
2020

2121
/**
22-
* Create signature for send payment request.
22+
* Create signature
2323
*
2424
* @return string
2525
*/
@@ -33,14 +33,13 @@ public function create()
3333
}
3434

3535
/**
36-
* Verify signature when Client will be send callback request.
36+
* Verify signature
3737
*
38-
* @param $signature
39-
* @param array $params
38+
* @param string $signature
4039
* @return bool
4140
*/
42-
public function verify($signature, array $params)
41+
public function verify($signature)
4342
{
44-
return strtoupper(md5(join('', $params))) === $signature;
43+
return $this->create() === $signature;
4544
}
4645
}

src/Signature/SignatureCallback.php

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
<?php
2+
/**
3+
* Created by gitkv.
4+
5+
* GitHub: gitkv
6+
*/
7+
8+
namespace Tmconsulting\Uniteller\Signature;
9+
10+
11+
/**
12+
* Class SignatureCallback
13+
* @package Tmconsulting\Uniteller\Signature
14+
*/
15+
final class SignatureCallback extends AbstractSignature
16+
{
17+
18+
/**
19+
* @var string
20+
*/
21+
protected $orderId;
22+
23+
/**
24+
* @var string
25+
*/
26+
protected $status;
27+
28+
/**
29+
* @var array
30+
*/
31+
protected $fields = [];
32+
33+
/**
34+
* @var string
35+
*/
36+
protected $password;
37+
38+
/**
39+
* @param $orderId
40+
* @return SignatureCallback
41+
*/
42+
public function setOrderId($orderId)
43+
{
44+
$this->orderId = $orderId;
45+
46+
return $this;
47+
}
48+
49+
/**
50+
* @param $status
51+
* @return SignatureCallback
52+
*/
53+
public function setStatus($status)
54+
{
55+
$this->status = $status;
56+
57+
return $this;
58+
}
59+
60+
/**
61+
* @param array $fields
62+
* @return SignatureCallback
63+
*/
64+
public function setFields($fields)
65+
{
66+
$this->fields = $fields;
67+
68+
return $this;
69+
}
70+
71+
/**
72+
* @param string $password
73+
* @return SignatureCallback
74+
*/
75+
public function setPassword($password)
76+
{
77+
$this->password = $password;
78+
79+
return $this;
80+
}
81+
82+
/**
83+
* @return string
84+
*/
85+
public function getOrderId()
86+
{
87+
return $this->orderId;
88+
}
89+
90+
/**
91+
* @return string
92+
*/
93+
public function getStatus()
94+
{
95+
return $this->status;
96+
}
97+
98+
/**
99+
* @return array
100+
*/
101+
public function getFields()
102+
{
103+
return $this->fields;
104+
}
105+
106+
/**
107+
* @return string
108+
*/
109+
public function getPassword()
110+
{
111+
return $this->password;
112+
}
113+
114+
/**
115+
* @return array
116+
*/
117+
public function toArray()
118+
{
119+
$array = [];
120+
$array['Order_ID'] = $this->getOrderId();
121+
$array['Status'] = $this->getStatus();
122+
$array = array_merge($array, $this->getFields());
123+
$array['Password'] = $this->getPassword();
124+
125+
return $array;
126+
}
127+
128+
/**
129+
* Create signature
130+
*
131+
* @return string
132+
*/
133+
public function create()
134+
{
135+
return strtoupper(md5(join('', $this->toArray())));
136+
}
137+
}

src/Signature/SignatureInterface.php

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,24 @@
1515
interface SignatureInterface
1616
{
1717
/**
18-
* Create signature for send payment request.
18+
* Create signature
1919
*
2020
* @return string
2121
*/
2222
public function create();
2323

2424
/**
25-
* Verify signature when Client will be send callback request.
25+
* Array params signature
2626
*
27-
* @param $signature
28-
* @param array $params
27+
* @return array
28+
*/
29+
public function toArray();
30+
31+
/**
32+
* Verify signature
33+
*
34+
* @param string $signature
2935
* @return bool
3036
*/
31-
public function verify($signature, array $params);
37+
public function verify($signature);
3238
}

src/helpers.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,18 @@ function csv_to_array($string, $isFlat = false)
6464
}
6565

6666
return $data;
67+
}
68+
69+
/**
70+
* @param $array
71+
* @param array $excludeKeys
72+
* @return mixed
73+
*/
74+
function array_except($array, array $excludeKeys)
75+
{
76+
foreach ($excludeKeys as $key) {
77+
unset($array[$key]);
78+
}
79+
80+
return $array;
6781
}

tests/ClientTest.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,33 @@ public function testShouldBeActionsAcceptClassesWhichImplementArraybleInterface(
241241
$client->{$methodName}($arrayble);
242242
}
243243

244+
public function testCallbackSignatureVerifying()
245+
{
246+
$params = [
247+
'Order_ID' => 'FOO',
248+
'Status' => 'paid',
249+
'Signature' => '3F728AA479E50F5B10EE6C20258BFF88',
250+
];
251+
$client = new Client();
252+
$client->setPassword('LONG-PWD');
253+
$this->assertTrue($client->verifyCallbackRequest($params));
254+
}
255+
256+
public function testCallbackSignatureVerifyingWithFields()
257+
{
258+
$params = [
259+
'Order_ID' => 'FOO',
260+
'Status' => 'paid',
261+
'AcquirerID' => 'fOO',
262+
'ApprovalCode' => 'BaR',
263+
'BillNumber' => 'baz',
264+
'Signature' => '1F4E3B63AE408D0BE1E33965E6697236',
265+
];
266+
$client = new Client();
267+
$client->setPassword('LONG-PWD');
268+
$this->assertTrue($client->verifyCallbackRequest($params));
269+
}
270+
244271
}
245272

246273
class HttpManagerStub implements HttpManagerInterface {

0 commit comments

Comments
 (0)