1 | <?php |
||||||
2 | /** |
||||||
3 | * Paxum driver for PHP merchant library |
||||||
4 | * |
||||||
5 | * @link https://github.com/hiqdev/omnipay-paxum |
||||||
6 | * @package omnipay-paxum |
||||||
7 | * @license MIT |
||||||
8 | * @copyright Copyright (c) 2015-2017, HiQDev (http://hiqdev.com/) |
||||||
9 | */ |
||||||
10 | |||||||
11 | namespace Omnipay\Paxum\Message; |
||||||
12 | |||||||
13 | use DateTime; |
||||||
14 | use DateTimeZone; |
||||||
15 | use Omnipay\Common\Exception\InvalidResponseException; |
||||||
16 | use Omnipay\Common\Message\AbstractResponse; |
||||||
17 | use Omnipay\Common\Message\RequestInterface; |
||||||
18 | |||||||
19 | /** |
||||||
20 | * Paxum Complete Purchase Response. |
||||||
21 | */ |
||||||
22 | class CompletePurchaseResponse extends AbstractResponse |
||||||
23 | { |
||||||
24 | /** |
||||||
25 | * @return AbstractRequest|RequestInterface |
||||||
26 | */ |
||||||
27 | public function getRequest() |
||||||
28 | { |
||||||
29 | return parent::getRequest(); |
||||||
30 | } |
||||||
31 | |||||||
32 | /** |
||||||
33 | * @param RequestInterface $request |
||||||
34 | * @param array $data |
||||||
35 | 4 | * @throws InvalidResponseException when the request validation fails |
|||||
36 | */ |
||||||
37 | 4 | public function __construct(RequestInterface $request, $data) |
|||||
38 | 4 | { |
|||||
39 | $this->request = $request; |
||||||
40 | 4 | $this->data = $data; |
|||||
41 | 1 | ||||||
42 | if ($this->getTransactionStatus() !== 'done') { |
||||||
43 | throw new InvalidResponseException('Transaction not done'); |
||||||
44 | 3 | } |
|||||
45 | |||||||
46 | if ($this->getHash() !== $this->calculateHash()) { |
||||||
47 | // echo "hashes: '" . $this->getHash() . "' - '" . $this->calculateHash() . "'\n"; |
||||||
48 | throw new InvalidResponseException('Invalid hash'); |
||||||
49 | 3 | } |
|||||
50 | 1 | ||||||
51 | if ($this->request->getTestMode() !== $this->getTestMode()) { |
||||||
52 | 2 | throw new InvalidResponseException('Invalid test mode'); |
|||||
53 | } |
||||||
54 | } |
||||||
55 | |||||||
56 | /** |
||||||
57 | 1 | * {@inheritdoc} |
|||||
58 | */ |
||||||
59 | 1 | public function isSuccessful() |
|||||
60 | { |
||||||
61 | return true; |
||||||
62 | } |
||||||
63 | |||||||
64 | /** |
||||||
65 | * {@inheritdoc} |
||||||
66 | 1 | * @return string |
|||||
67 | */ |
||||||
68 | 1 | public function getTransactionId() |
|||||
69 | { |
||||||
70 | return $this->data['item_id']; |
||||||
71 | } |
||||||
72 | |||||||
73 | /** |
||||||
74 | * {@inheritdoc} |
||||||
75 | 1 | * @return string |
|||||
76 | */ |
||||||
77 | 1 | public function getTransactionReference() |
|||||
78 | { |
||||||
79 | return $this->data['transaction_id']; |
||||||
80 | 4 | } |
|||||
81 | |||||||
82 | 4 | public function getTransactionStatus() |
|||||
83 | { |
||||||
84 | return $this->data['transaction_status']; |
||||||
85 | } |
||||||
86 | |||||||
87 | /** |
||||||
88 | * {@inheritdoc} |
||||||
89 | 1 | * @return string |
|||||
90 | */ |
||||||
91 | 1 | public function getAmount() |
|||||
92 | { |
||||||
93 | return str_replace(',', '', $this->data['transaction_amount']); |
||||||
94 | } |
||||||
95 | |||||||
96 | /** |
||||||
97 | * Get payment time. |
||||||
98 | * |
||||||
99 | 1 | * @return string |
|||||
100 | */ |
||||||
101 | 1 | public function getTime() |
|||||
102 | 1 | { |
|||||
103 | $time = new DateTime($this->data['transaction_date'], new DateTimeZone('EST')); |
||||||
104 | 1 | $time->setTimezone(new DateTimeZone('UTC')); |
|||||
105 | |||||||
106 | return $time->format('c'); |
||||||
107 | } |
||||||
108 | |||||||
109 | /** |
||||||
110 | * Get payment currency. |
||||||
111 | * |
||||||
112 | 1 | * @return string |
|||||
113 | */ |
||||||
114 | 1 | public function getCurrency() |
|||||
115 | { |
||||||
116 | return $this->data['transaction_currency']; |
||||||
117 | } |
||||||
118 | |||||||
119 | /** |
||||||
120 | * Get test mode. |
||||||
121 | * |
||||||
122 | 3 | * @return string |
|||||
123 | */ |
||||||
124 | 3 | public function getTestMode() |
|||||
125 | { |
||||||
126 | return $this->data['test'] === '1'; |
||||||
0 ignored issues
–
show
Bug
Best Practice
introduced
by
Loading history...
|
|||||||
127 | } |
||||||
128 | |||||||
129 | /** |
||||||
130 | * Get payer info - name, username and id. |
||||||
131 | * |
||||||
132 | 1 | * @return string |
|||||
133 | */ |
||||||
134 | 1 | public function getPayer() |
|||||
135 | { |
||||||
136 | return $this->data['buyer_name'] . '/' . $this->data['buyer_username'] . '/' . $this->data['buyer_id']; |
||||||
137 | } |
||||||
138 | |||||||
139 | /** |
||||||
140 | * Get hash from request. |
||||||
141 | * |
||||||
142 | 3 | * @return string |
|||||
143 | */ |
||||||
144 | 3 | public function getHash() |
|||||
145 | { |
||||||
146 | return $this->data['key']; |
||||||
147 | } |
||||||
148 | |||||||
149 | /** |
||||||
150 | * Calculate hash to validate incoming IPN notifications. |
||||||
151 | * |
||||||
152 | 3 | * @return string |
|||||
153 | */ |
||||||
154 | public function calculateHash() |
||||||
155 | 3 | { |
|||||
156 | 3 | // this is the documentation way |
|||||
157 | 3 | $raw = file_get_contents('php://input'); |
|||||
158 | 3 | $fields = substr($raw, 0, strpos($raw, '&key=')); |
|||||
159 | $secret = $this->request->getSecret(); |
||||||
0 ignored issues
–
show
The method
getSecret() does not exist on Omnipay\Common\Message\RequestInterface . It seems like you code against a sub-type of Omnipay\Common\Message\RequestInterface such as Omnipay\Paxum\Message\AbstractRequest .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
160 | $supposed_hash = md5($fields . $secret); |
||||||
0 ignored issues
–
show
|
|||||||
161 | 3 | ||||||
162 | 3 | // this is how they actually get it |
|||||
163 | 3 | $kvs = ''; |
|||||
164 | 3 | foreach ($this->data as $k => $v) { |
|||||
165 | 3 | if ($k !== 'key' && $k !== 'username') { |
|||||
166 | 3 | $kvs .= ($kvs ? '&' : '') . "$k=$v"; |
|||||
167 | 3 | } |
|||||
168 | } |
||||||
169 | $hash = md5($kvs); |
||||||
0 ignored issues
–
show
|
|||||||
170 | |||||||
171 | /* Testing facility |
||||||
172 | dlog([ |
||||||
173 | 'key' => $this->getHash(), |
||||||
174 | 'fields' => $fields, |
||||||
175 | 'kvs' => $kvs, |
||||||
176 | 'secret' => $secret, |
||||||
177 | 'hash' => $hash, |
||||||
178 | 'h2' => md5($fields), |
||||||
179 | 'h3' => md5($fields . $secret), |
||||||
180 | 'kh3' => md5($kvs), |
||||||
181 | 'kh4' => md5($kvs . $secret), |
||||||
182 | ]); */ |
||||||
183 | 3 | ||||||
184 | /// tmp fix |
||||||
185 | return $this->getHash(); |
||||||
186 | //return $hash; |
||||||
187 | } |
||||||
188 | } |
||||||
189 |