1 | <?php |
||||||
2 | |||||||
3 | use Pagantis\OrdersApiClient\Client; |
||||||
4 | use Pagantis\ModuleUtils\Exception\ConcurrencyException; |
||||||
5 | use Pagantis\ModuleUtils\Exception\AlreadyProcessedException; |
||||||
6 | use Pagantis\ModuleUtils\Exception\AmountMismatchException; |
||||||
7 | use Pagantis\ModuleUtils\Exception\MerchantOrderNotFoundException; |
||||||
8 | use Pagantis\ModuleUtils\Exception\NoIdentificationException; |
||||||
9 | use Pagantis\ModuleUtils\Exception\OrderNotFoundException; |
||||||
10 | use Pagantis\ModuleUtils\Exception\QuoteNotFoundException; |
||||||
11 | use Pagantis\ModuleUtils\Exception\UnknownException; |
||||||
12 | use Pagantis\ModuleUtils\Exception\WrongStatusException; |
||||||
13 | use Pagantis\ModuleUtils\Model\Response\JsonSuccessResponse; |
||||||
14 | use Pagantis\ModuleUtils\Model\Response\JsonExceptionResponse; |
||||||
15 | use Pagantis\ModuleUtils\Model\Log\LogEntry; |
||||||
16 | use Pagantis\OrdersApiClient\Model\Order; |
||||||
17 | |||||||
18 | if (!defined('ABSPATH')) { |
||||||
19 | exit; |
||||||
20 | } |
||||||
21 | |||||||
22 | class WcPagantisNotify extends WcPagantisGateway |
||||||
23 | { |
||||||
24 | /** Concurrency tablename */ |
||||||
25 | const CONCURRENCY_TABLE = 'pagantis_concurrency'; |
||||||
26 | |||||||
27 | /** Seconds to expire a locked request */ |
||||||
28 | const CONCURRENCY_TIMEOUT = 5; |
||||||
29 | |||||||
30 | /** @var mixed $pagantisOrder */ |
||||||
31 | protected $pagantisOrder; |
||||||
32 | |||||||
33 | /** @var $string $origin */ |
||||||
0 ignored issues
–
show
Documentation
Bug
introduced
by
![]() |
|||||||
34 | public $origin; |
||||||
35 | |||||||
36 | /** @var $string */ |
||||||
0 ignored issues
–
show
|
|||||||
37 | public $order; |
||||||
38 | |||||||
39 | /** @var mixed $woocommerceOrderId */ |
||||||
40 | protected $woocommerceOrderId = ''; |
||||||
41 | |||||||
42 | /** @var mixed $cfg */ |
||||||
43 | protected $cfg; |
||||||
44 | |||||||
45 | /** @var Client $orderClient */ |
||||||
46 | protected $orderClient; |
||||||
47 | |||||||
48 | /** @var WC_Order $woocommerceOrder */ |
||||||
0 ignored issues
–
show
The type
WC_Order was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||||||
49 | protected $woocommerceOrder; |
||||||
50 | |||||||
51 | /** @var mixed $pagantisOrderId */ |
||||||
52 | protected $pagantisOrderId = ''; |
||||||
53 | |||||||
54 | /** @var $string */ |
||||||
0 ignored issues
–
show
|
|||||||
55 | protected $product; |
||||||
56 | |||||||
57 | /** @var $string */ |
||||||
0 ignored issues
–
show
|
|||||||
58 | protected $urlTokenVerification = null; |
||||||
59 | |||||||
60 | /** |
||||||
61 | * Validation vs PagantisClient |
||||||
62 | * |
||||||
63 | * @return JsonExceptionResponse|JsonSuccessResponse |
||||||
64 | * @throws ConcurrencyException |
||||||
65 | */ |
||||||
66 | public function processInformation() |
||||||
67 | { |
||||||
68 | try { |
||||||
69 | require_once(__ROOT__.'/vendor/autoload.php'); |
||||||
70 | try { |
||||||
71 | if ($_SERVER['REQUEST_METHOD'] == 'GET' && $_GET['origin'] == 'notification') { |
||||||
72 | return $this->buildResponse(); |
||||||
73 | } |
||||||
74 | |||||||
75 | |||||||
76 | $this->checkConcurrency(); |
||||||
77 | $this->getProductType(); |
||||||
78 | $this->getMerchantOrder(); |
||||||
79 | $this->getPagantisOrderId(); |
||||||
80 | $this->getPagantisOrder(); |
||||||
81 | $checkAlreadyProcessed = $this->checkOrderStatus(); |
||||||
82 | if ($checkAlreadyProcessed) { |
||||||
83 | return $this->buildResponse(); |
||||||
84 | } |
||||||
85 | $this->validateAmount(); |
||||||
86 | if ($this->checkMerchantOrderStatus()) { |
||||||
87 | $this->processMerchantOrder(); |
||||||
88 | } |
||||||
89 | } catch (\Exception $exception) { |
||||||
90 | $this->insertLog($exception); |
||||||
91 | |||||||
92 | return $this->buildResponse($exception); |
||||||
93 | } |
||||||
94 | |||||||
95 | try { |
||||||
96 | $this->confirmPagantisOrder(); |
||||||
97 | |||||||
98 | return $this->buildResponse(); |
||||||
99 | } catch (\Exception $exception) { |
||||||
100 | $this->rollbackMerchantOrder(); |
||||||
101 | $this->insertLog($exception); |
||||||
102 | |||||||
103 | return $this->buildResponse($exception); |
||||||
104 | } |
||||||
105 | } catch (\Exception $exception) { |
||||||
106 | $this->insertLog($exception); |
||||||
107 | return $this->buildResponse($exception); |
||||||
108 | } |
||||||
109 | } |
||||||
110 | |||||||
111 | /** |
||||||
112 | * COMMON FUNCTIONS |
||||||
113 | */ |
||||||
114 | |||||||
115 | /** |
||||||
116 | * @throws ConcurrencyException |
||||||
117 | * @throws QuoteNotFoundException |
||||||
118 | */ |
||||||
119 | private function checkConcurrency() |
||||||
120 | { |
||||||
121 | $this->woocommerceOrderId = $_GET['order-received']; |
||||||
122 | if ($this->woocommerceOrderId == '') { |
||||||
123 | throw new QuoteNotFoundException(); |
||||||
124 | } |
||||||
125 | |||||||
126 | $this->unblockConcurrency(); |
||||||
127 | $this->blockConcurrency($this->woocommerceOrderId); |
||||||
128 | } |
||||||
129 | |||||||
130 | /** |
||||||
131 | * getProductType |
||||||
132 | */ |
||||||
133 | private function getProductType() |
||||||
134 | { |
||||||
135 | if ($_GET['product'] == '') { |
||||||
136 | $this->setProduct(WcPagantisGateway::METHOD_ID); |
||||||
137 | } else { |
||||||
138 | $this->setProduct($_GET['product']); |
||||||
139 | } |
||||||
140 | } |
||||||
141 | |||||||
142 | /** |
||||||
143 | * @throws MerchantOrderNotFoundException |
||||||
144 | */ |
||||||
145 | private function getMerchantOrder() |
||||||
146 | { |
||||||
147 | try { |
||||||
148 | $this->woocommerceOrder = new WC_Order($this->woocommerceOrderId); |
||||||
149 | $this->woocommerceOrder->set_payment_method_title($this->getProduct()); |
||||||
150 | } catch (\Exception $e) { |
||||||
151 | throw new MerchantOrderNotFoundException(); |
||||||
152 | } |
||||||
153 | } |
||||||
154 | |||||||
155 | /** |
||||||
156 | * |
||||||
157 | * @throws NoIdentificationException |
||||||
158 | */ |
||||||
159 | private function getPagantisOrderId() |
||||||
160 | { |
||||||
161 | global $wpdb; |
||||||
162 | |||||||
163 | $this->setUrlToken(); |
||||||
164 | |||||||
165 | $this->checkDbTable(); |
||||||
166 | $tableName = $wpdb->prefix.PG_CART_PROCESS_TABLE; |
||||||
167 | $order_id = $wpdb->get_var("SELECT order_id FROM $tableName WHERE token='{$this->getUrlToken()}' "); |
||||||
168 | $this->pagantisOrderId = $order_id; |
||||||
169 | |||||||
170 | if ($this->pagantisOrderId == '') { |
||||||
171 | throw new NoIdentificationException(); |
||||||
172 | } |
||||||
173 | } |
||||||
174 | |||||||
175 | /** |
||||||
176 | * @throws OrderNotFoundException |
||||||
177 | */ |
||||||
178 | private function getPagantisOrder() |
||||||
179 | { |
||||||
180 | try { |
||||||
181 | $this->cfg = get_option('woocommerce_pagantis_settings'); |
||||||
0 ignored issues
–
show
The function
get_option was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
182 | $this->cfg = get_option('woocommerce_pagantis_settings'); |
||||||
183 | if ($this->isProduct4x()) { |
||||||
184 | $publicKey = $this->cfg['pagantis_public_key_4x']; |
||||||
185 | $secretKey = $this->cfg['pagantis_private_key_4x']; |
||||||
186 | } else { |
||||||
187 | $publicKey = $this->cfg['pagantis_public_key']; |
||||||
188 | $secretKey = $this->cfg['pagantis_private_key']; |
||||||
189 | } |
||||||
190 | |||||||
191 | $this->orderClient = new Client($publicKey, $secretKey); |
||||||
192 | $this->pagantisOrder = $this->orderClient->getOrder($this->pagantisOrderId); |
||||||
193 | } catch (\Exception $e) { |
||||||
194 | throw new OrderNotFoundException(); |
||||||
195 | } |
||||||
196 | } |
||||||
197 | |||||||
198 | /** |
||||||
199 | * @return bool |
||||||
200 | * @throws WrongStatusException |
||||||
201 | */ |
||||||
202 | private function checkOrderStatus() |
||||||
203 | { |
||||||
204 | try { |
||||||
205 | $this->checkPagantisStatus(array('AUTHORIZED')); |
||||||
206 | } catch (\Exception $e) { |
||||||
207 | if ($this->pagantisOrder instanceof Order) { |
||||||
208 | $status = $this->pagantisOrder->getStatus(); |
||||||
209 | } else { |
||||||
210 | $status = '-'; |
||||||
211 | } |
||||||
212 | |||||||
213 | if ($status === Order::STATUS_CONFIRMED) { |
||||||
214 | return true; |
||||||
215 | } |
||||||
216 | throw new WrongStatusException($status); |
||||||
217 | } |
||||||
218 | } |
||||||
219 | |||||||
220 | /** |
||||||
221 | * @return bool |
||||||
222 | */ |
||||||
223 | private function checkMerchantOrderStatus() |
||||||
224 | { |
||||||
225 | //Order status reference => https://docs.woocommerce.com/document/managing-orders/ |
||||||
226 | $validStatus = array('on-hold', 'pending', 'failed', 'processing', 'completed'); |
||||||
227 | $isValidStatus = apply_filters( |
||||||
0 ignored issues
–
show
The function
apply_filters was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
228 | 'woocommerce_valid_order_statuses_for_payment_complete', |
||||||
229 | $validStatus, |
||||||
230 | $this |
||||||
231 | ); |
||||||
232 | |||||||
233 | if (!$this->woocommerceOrder->has_status($isValidStatus)) { // TO CONFIRM |
||||||
234 | $logMessage = "WARNING checkMerchantOrderStatus." . |
||||||
235 | " Merchant order id:".$this->woocommerceOrder->get_id(). |
||||||
236 | " Merchant order status:".$this->woocommerceOrder->get_status(). |
||||||
237 | " Pagantis order id:".$this->pagantisOrder->getStatus(). |
||||||
238 | " Pagantis order status:".$this->pagantisOrder->getId(); |
||||||
239 | |||||||
240 | $this->insertLog(null, $logMessage); |
||||||
241 | $this->woocommerceOrder->add_order_note($logMessage); |
||||||
242 | $this->woocommerceOrder->save(); |
||||||
243 | return false; |
||||||
244 | } |
||||||
245 | |||||||
246 | return true; //TO SAVE |
||||||
247 | } |
||||||
248 | |||||||
249 | /** |
||||||
250 | * @throws AmountMismatchException |
||||||
251 | */ |
||||||
252 | private function validateAmount() |
||||||
253 | { |
||||||
254 | $pagantisAmount = $this->pagantisOrder->getShoppingCart()->getTotalAmount(); |
||||||
255 | $wcAmount = intval(strval(100 * $this->woocommerceOrder->get_total())); |
||||||
256 | if ($pagantisAmount != $wcAmount) { |
||||||
257 | throw new AmountMismatchException($pagantisAmount, $wcAmount); |
||||||
258 | } |
||||||
259 | } |
||||||
260 | |||||||
261 | /** |
||||||
262 | * @throws Exception |
||||||
263 | */ |
||||||
264 | private function processMerchantOrder() |
||||||
265 | { |
||||||
266 | $this->saveOrder(); |
||||||
267 | $this->updateBdInfo(); |
||||||
268 | } |
||||||
269 | |||||||
270 | /** |
||||||
271 | * @return false|string |
||||||
272 | * @throws UnknownException |
||||||
273 | */ |
||||||
274 | private function confirmPagantisOrder() |
||||||
275 | { |
||||||
276 | try { |
||||||
277 | $this->pagantisOrder = $this->orderClient->confirmOrder($this->pagantisOrderId); |
||||||
278 | } catch (\Exception $e) { |
||||||
279 | $this->pagantisOrder = $this->orderClient->getOrder($this->pagantisOrderId); |
||||||
280 | if ($this->pagantisOrder->getStatus() !== Order::STATUS_CONFIRMED) { |
||||||
281 | throw new UnknownException($e->getMessage()); |
||||||
282 | } else { |
||||||
283 | $logMessage = 'Concurrency issue: Order_id '.$this->pagantisOrderId.' was confirmed by other process'; |
||||||
284 | $this->insertLog(null, $logMessage); |
||||||
285 | } |
||||||
286 | } |
||||||
287 | |||||||
288 | $jsonResponse = new JsonSuccessResponse(); |
||||||
289 | return $jsonResponse->toJson(); |
||||||
290 | } |
||||||
291 | |||||||
292 | /** |
||||||
293 | * UTILS FUNCTIONS |
||||||
294 | */ |
||||||
295 | /** STEP 1 CC - Check concurrency */ |
||||||
296 | /** |
||||||
297 | * Check if orders table exists |
||||||
298 | */ |
||||||
299 | private function checkDbTable() |
||||||
300 | { |
||||||
301 | global $wpdb; |
||||||
302 | $tableName = $wpdb->prefix.PG_CART_PROCESS_TABLE; |
||||||
303 | |||||||
304 | if ($wpdb->get_var("SHOW TABLES LIKE '$tableName'") != $tableName) { |
||||||
305 | $charset_collate = $wpdb->get_charset_collate(); |
||||||
306 | $sql= "CREATE TABLE IF NOT EXISTS $tableName |
||||||
307 | (id INT, |
||||||
308 | order_id varchar(60), |
||||||
309 | wc_order_id varchar(60), |
||||||
310 | token varchar(32) NOT NULL, |
||||||
311 | ADD PRIMARY KEY (id,order_id) |
||||||
312 | )$charset_collate"; |
||||||
313 | |||||||
314 | require_once(ABSPATH.'wp-admin/includes/upgrade.php'); |
||||||
0 ignored issues
–
show
|
|||||||
315 | dbDelta($sql); |
||||||
0 ignored issues
–
show
The function
dbDelta was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
316 | } |
||||||
317 | } |
||||||
318 | |||||||
319 | /** |
||||||
320 | * Check if logs table exists |
||||||
321 | */ |
||||||
322 | private function checkDbLogTable() |
||||||
323 | { |
||||||
324 | global $wpdb; |
||||||
325 | $tableName = $wpdb->prefix.PG_LOGS_TABLE_NAME; |
||||||
326 | |||||||
327 | if ($wpdb->get_var("SHOW TABLES LIKE '$tableName'") != $tableName) { |
||||||
328 | $charset_collate = $wpdb->get_charset_collate(); |
||||||
329 | $sql = "CREATE TABLE $tableName ( id int NOT NULL AUTO_INCREMENT, log text NOT NULL, |
||||||
330 | createdAt timestamp DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY id (id)) $charset_collate"; |
||||||
331 | |||||||
332 | require_once(ABSPATH.'wp-admin/includes/upgrade.php'); |
||||||
0 ignored issues
–
show
|
|||||||
333 | dbDelta($sql); |
||||||
0 ignored issues
–
show
The function
dbDelta was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
334 | } |
||||||
335 | return; |
||||||
336 | } |
||||||
337 | |||||||
338 | /** STEP 2 GMO - Get Merchant Order */ |
||||||
339 | /** STEP 3 GPOI - Get Pagantis OrderId */ |
||||||
340 | /** STEP 4 GPO - Get Pagantis Order */ |
||||||
341 | /** STEP 5 COS - Check Order Status */ |
||||||
342 | |||||||
343 | /** |
||||||
344 | * @param $statusArray |
||||||
345 | * |
||||||
346 | * @throws \Exception |
||||||
347 | */ |
||||||
348 | private function checkPagantisStatus($statusArray) |
||||||
349 | { |
||||||
350 | $pagantisStatus = array(); |
||||||
351 | foreach ($statusArray as $status) { |
||||||
352 | $pagantisStatus[] = constant("\Pagantis\OrdersApiClient\Model\Order::STATUS_$status"); |
||||||
353 | } |
||||||
354 | |||||||
355 | if ($this->pagantisOrder instanceof Order) { |
||||||
356 | $payed = in_array($this->pagantisOrder->getStatus(), $pagantisStatus); |
||||||
357 | if (!$payed) { |
||||||
358 | if ($this->pagantisOrder instanceof Order) { |
||||||
0 ignored issues
–
show
|
|||||||
359 | $status = $this->pagantisOrder->getStatus(); |
||||||
360 | } else { |
||||||
361 | $status = '-'; |
||||||
362 | } |
||||||
363 | throw new WrongStatusException($status); |
||||||
364 | } |
||||||
365 | } else { |
||||||
366 | throw new OrderNotFoundException(); |
||||||
367 | } |
||||||
368 | } |
||||||
369 | |||||||
370 | /** STEP 6 CMOS - Check Merchant Order Status */ |
||||||
371 | /** STEP 7 VA - Validate Amount */ |
||||||
372 | /** STEP 8 PMO - Process Merchant Order */ |
||||||
373 | /** |
||||||
374 | * @throws \Exception |
||||||
375 | */ |
||||||
376 | private function saveOrder() |
||||||
377 | { |
||||||
378 | global $woocommerce; |
||||||
379 | $paymentResult = $this->woocommerceOrder->payment_complete(); |
||||||
380 | if ($paymentResult) { |
||||||
381 | $metadataOrder = $this->pagantisOrder->getMetadata(); |
||||||
382 | $metadataInfo = null; |
||||||
383 | foreach ($metadataOrder as $metadataKey => $metadataValue) { |
||||||
384 | if ($metadataKey == 'promotedProduct') { |
||||||
385 | $metadataInfo.= "/Producto promocionado = $metadataValue"; |
||||||
386 | } |
||||||
387 | } |
||||||
388 | |||||||
389 | if ($metadataInfo != null) { |
||||||
0 ignored issues
–
show
|
|||||||
390 | $this->woocommerceOrder->add_order_note($metadataInfo); |
||||||
391 | } |
||||||
392 | |||||||
393 | $this->woocommerceOrder->add_order_note("Notification received via $this->origin"); |
||||||
394 | $this->woocommerceOrder->reduce_order_stock(); |
||||||
395 | $this->woocommerceOrder->save(); |
||||||
396 | |||||||
397 | $woocommerce->cart->empty_cart(); |
||||||
398 | sleep(3); |
||||||
399 | } else { |
||||||
400 | throw new UnknownException('Order can not be saved'); |
||||||
401 | } |
||||||
402 | } |
||||||
403 | |||||||
404 | /** |
||||||
405 | * Save the merchant order_id with the related identification |
||||||
406 | */ |
||||||
407 | private function updateBdInfo() |
||||||
408 | { |
||||||
409 | global $wpdb; |
||||||
410 | |||||||
411 | $this->checkDbTable(); |
||||||
412 | $tableName = $wpdb->prefix.PG_CART_PROCESS_TABLE; |
||||||
413 | |||||||
414 | $wpdb->update( |
||||||
415 | $tableName, |
||||||
416 | array('wc_order_id'=>$this->woocommerceOrderId), |
||||||
417 | array('token' => $this->getUrlToken(),'order_id' => $this->pagantisOrderId), |
||||||
418 | array( '%s'), |
||||||
419 | array( '%s', '%s' ) |
||||||
420 | ); |
||||||
421 | } |
||||||
422 | |||||||
423 | /** STEP 9 CPO - Confirmation Pagantis Order */ |
||||||
424 | private function rollbackMerchantOrder() |
||||||
425 | { |
||||||
426 | $this->woocommerceOrder->update_status('pending', __('Pending payment', 'woocommerce')); |
||||||
0 ignored issues
–
show
The function
__ was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
427 | } |
||||||
428 | |||||||
429 | /** |
||||||
430 | * @param null $exception |
||||||
0 ignored issues
–
show
|
|||||||
431 | * @param null $message |
||||||
0 ignored issues
–
show
|
|||||||
432 | */ |
||||||
433 | private function insertLog($exception = null, $message = null) |
||||||
434 | { |
||||||
435 | global $wpdb; |
||||||
436 | |||||||
437 | $this->checkDbLogTable(); |
||||||
438 | $logEntry = new LogEntry(); |
||||||
439 | if ($exception instanceof \Exception) { |
||||||
440 | $logEntry = $logEntry->error($exception); |
||||||
441 | } else { |
||||||
442 | $logEntry = $logEntry->info($message); |
||||||
443 | } |
||||||
444 | |||||||
445 | $tableName = $wpdb->prefix.PG_LOGS_TABLE_NAME; |
||||||
446 | $wpdb->insert($tableName, array('log' => $logEntry->toJson())); |
||||||
447 | } |
||||||
448 | |||||||
449 | /** |
||||||
450 | * @param null $orderId |
||||||
0 ignored issues
–
show
|
|||||||
451 | * |
||||||
452 | * @throws ConcurrencyException |
||||||
453 | */ |
||||||
454 | private function unblockConcurrency($orderId = null) |
||||||
455 | { |
||||||
456 | global $wpdb; |
||||||
457 | $tableName = $wpdb->prefix.PG_CONCURRENCY_TABLE_NAME; |
||||||
458 | if ($orderId == null) { |
||||||
0 ignored issues
–
show
|
|||||||
459 | $query = "DELETE FROM $tableName WHERE createdAt<(NOW()- INTERVAL ".self::CONCURRENCY_TIMEOUT." SECOND)"; |
||||||
460 | } else { |
||||||
461 | $query = "DELETE FROM $tableName WHERE order_id = $orderId"; |
||||||
462 | } |
||||||
463 | $resultDelete = $wpdb->query($query); |
||||||
464 | if ($resultDelete === false) { |
||||||
465 | throw new ConcurrencyException(); |
||||||
466 | } |
||||||
467 | } |
||||||
468 | |||||||
469 | /** |
||||||
470 | * @param $orderId |
||||||
471 | * |
||||||
472 | * @throws ConcurrencyException |
||||||
473 | */ |
||||||
474 | private function blockConcurrency($orderId) |
||||||
475 | { |
||||||
476 | global $wpdb; |
||||||
477 | $tableName = $wpdb->prefix.PG_CONCURRENCY_TABLE_NAME; |
||||||
478 | $insertResult = $wpdb->insert($tableName, array('order_id' => $orderId)); |
||||||
479 | if ($insertResult === false) { |
||||||
480 | if ($this->getOrigin() == 'Notify') { |
||||||
481 | throw new ConcurrencyException(); |
||||||
482 | } else { |
||||||
483 | $query = sprintf( |
||||||
484 | "SELECT TIMESTAMPDIFF(SECOND,NOW()-INTERVAL %s SECOND, createdAt) as rest FROM %s WHERE %s", |
||||||
485 | self::CONCURRENCY_TIMEOUT, |
||||||
486 | $tableName, |
||||||
487 | "order_id=$orderId" |
||||||
488 | ); |
||||||
489 | $resultSeconds = $wpdb->get_row($query); |
||||||
490 | $restSeconds = isset($resultSeconds) ? ($resultSeconds->rest) : 0; |
||||||
491 | $secondsToExpire = ($restSeconds>self::CONCURRENCY_TIMEOUT) ? self::CONCURRENCY_TIMEOUT : $restSeconds; |
||||||
492 | sleep($secondsToExpire+1); |
||||||
493 | |||||||
494 | $logMessage = sprintf( |
||||||
495 | "User waiting %s seconds, default seconds %s, bd time to expire %s seconds", |
||||||
496 | $secondsToExpire, |
||||||
497 | self::CONCURRENCY_TIMEOUT, |
||||||
498 | $restSeconds |
||||||
499 | ); |
||||||
500 | $this->insertLog(null, $logMessage); |
||||||
501 | } |
||||||
502 | } |
||||||
503 | } |
||||||
504 | |||||||
505 | /** |
||||||
506 | * @param null $exception |
||||||
0 ignored issues
–
show
|
|||||||
507 | * |
||||||
508 | * |
||||||
509 | * @return JsonExceptionResponse|JsonSuccessResponse |
||||||
510 | * @throws ConcurrencyException |
||||||
511 | */ |
||||||
512 | private function buildResponse($exception = null) |
||||||
513 | { |
||||||
514 | $this->unblockConcurrency($this->woocommerceOrderId); |
||||||
515 | |||||||
516 | if ($exception == null) { |
||||||
0 ignored issues
–
show
|
|||||||
517 | $jsonResponse = new JsonSuccessResponse(); |
||||||
518 | } else { |
||||||
519 | $jsonResponse = new JsonExceptionResponse(); |
||||||
520 | $jsonResponse->setException($exception); |
||||||
521 | } |
||||||
522 | |||||||
523 | $jsonResponse->setMerchantOrderId($this->woocommerceOrderId); |
||||||
524 | $jsonResponse->setPagantisOrderId($this->pagantisOrderId); |
||||||
525 | |||||||
526 | if ($_SERVER['REQUEST_METHOD'] == 'POST') { |
||||||
527 | $jsonResponse->printResponse(); |
||||||
528 | } else { |
||||||
529 | return $jsonResponse; |
||||||
530 | } |
||||||
531 | } |
||||||
532 | |||||||
533 | /** |
||||||
534 | * GETTERS & SETTERS |
||||||
535 | */ |
||||||
536 | |||||||
537 | /** |
||||||
538 | * @return mixed |
||||||
539 | */ |
||||||
540 | public function getOrigin() |
||||||
541 | { |
||||||
542 | return $this->origin; |
||||||
543 | } |
||||||
544 | |||||||
545 | /** |
||||||
546 | * @param mixed $origin |
||||||
547 | */ |
||||||
548 | public function setOrigin($origin) |
||||||
549 | { |
||||||
550 | $this->origin = $origin; |
||||||
551 | } |
||||||
552 | |||||||
553 | /** |
||||||
554 | * @return bool |
||||||
555 | */ |
||||||
556 | private function isProduct4x() |
||||||
557 | { |
||||||
558 | return ($this->product === Ucfirst(WcPagantis4xGateway::METHOD_ID)); |
||||||
559 | } |
||||||
560 | |||||||
561 | /** |
||||||
562 | * @return mixed |
||||||
563 | */ |
||||||
564 | public function getProduct() |
||||||
565 | { |
||||||
566 | return $this->product; |
||||||
567 | } |
||||||
568 | |||||||
569 | /** |
||||||
570 | * @param mixed $product |
||||||
571 | */ |
||||||
572 | public function setProduct($product) |
||||||
573 | { |
||||||
574 | $this->product = Ucfirst($product); |
||||||
575 | } |
||||||
576 | |||||||
577 | /** |
||||||
578 | * @return mixed |
||||||
579 | */ |
||||||
580 | public function getWoocommerceOrderId() |
||||||
581 | { |
||||||
582 | return $this->woocommerceOrderId; |
||||||
583 | } |
||||||
584 | |||||||
585 | /** |
||||||
586 | * @return mixed |
||||||
587 | */ |
||||||
588 | private function getUrlToken() |
||||||
589 | { |
||||||
590 | return $this->urlTokenVerification; |
||||||
591 | } |
||||||
592 | |||||||
593 | /** |
||||||
594 | * |
||||||
595 | */ |
||||||
596 | private function setUrlToken() |
||||||
597 | { |
||||||
598 | if (!isset($_GET['token'])){ |
||||||
599 | $logEntry = '$_GET[\'token\'] is empty' . |
||||||
600 | " cart hash: ".WC()->cart->get_cart_hash(). |
||||||
0 ignored issues
–
show
The function
WC was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
601 | " Merchant order id: ".$this->woocommerceOrderId. |
||||||
602 | " Pagantis order id: ".$this->pagantisOrderId. |
||||||
603 | " Pagantis urlToken: ".$this->getUrlToken(). |
||||||
604 | " Function: " . __FUNCTION__; |
||||||
605 | insertLogEntry(null, $logEntry); |
||||||
606 | } |
||||||
607 | |||||||
608 | $this->urlTokenVerification = $_GET['token']; |
||||||
609 | } |
||||||
610 | |||||||
611 | } |
||||||
612 |