1 | <?php |
||||||
2 | |||||||
3 | namespace Pagantis\Pagantis\Controller\Notify; |
||||||
4 | |||||||
5 | use Magento\Quote\Model\QuoteManagement; |
||||||
6 | use Magento\Quote\Api\Data\PaymentInterface; |
||||||
7 | use Magento\Sales\Api\Data\OrderInterface; |
||||||
8 | use Magento\Sales\Api\OrderRepositoryInterface; |
||||||
9 | use Magento\Quote\Model\Quote; |
||||||
10 | use Magento\Quote\Model\QuoteRepository; |
||||||
11 | use Magento\Framework\App\Action\Context; |
||||||
12 | use Magento\Framework\App\Action\Action; |
||||||
13 | use Pagantis\ModuleUtils\Exception\MerchantOrderNotFoundException; |
||||||
14 | use Pagantis\OrdersApiClient\Client; |
||||||
15 | use Pagantis\Pagantis\Helper\Config; |
||||||
16 | use Pagantis\Pagantis\Helper\ExtraConfig; |
||||||
17 | use Magento\Framework\App\ResourceConnection; |
||||||
18 | use Magento\Checkout\Model\Session; |
||||||
19 | use Magento\Framework\DB\Ddl\Table; |
||||||
20 | use Pagantis\ModuleUtils\Exception\AmountMismatchException; |
||||||
21 | use Pagantis\ModuleUtils\Exception\ConcurrencyException; |
||||||
22 | use Pagantis\ModuleUtils\Exception\NoIdentificationException; |
||||||
23 | use Pagantis\ModuleUtils\Exception\OrderNotFoundException; |
||||||
24 | use Pagantis\ModuleUtils\Exception\QuoteNotFoundException; |
||||||
25 | use Pagantis\ModuleUtils\Exception\UnknownException; |
||||||
26 | use Pagantis\ModuleUtils\Exception\WrongStatusException; |
||||||
27 | use Pagantis\ModuleUtils\Model\Response\JsonSuccessResponse; |
||||||
28 | use Pagantis\ModuleUtils\Model\Response\JsonExceptionResponse; |
||||||
29 | use Pagantis\ModuleUtils\Exception\AlreadyProcessedException; |
||||||
30 | use Pagantis\ModuleUtils\Model\Log\LogEntry; |
||||||
31 | use Magento\Framework\App\RequestInterface; |
||||||
32 | use Magento\Framework\App\Request\InvalidRequestException; |
||||||
33 | use Pagantis\Pagantis\Model\Ui\ConfigProvider; |
||||||
34 | |||||||
35 | /** |
||||||
36 | * Class Index |
||||||
37 | * @package Pagantis\Pagantis\Controller\Notify |
||||||
38 | */ |
||||||
39 | class IndexV2 extends Action |
||||||
40 | { |
||||||
41 | /** Orders tablename */ |
||||||
42 | const ORDERS_TABLE = 'cart_process'; |
||||||
43 | |||||||
44 | /** Concurrency tablename */ |
||||||
45 | const CONCURRENCY_TABLE = 'Pagantis_orders'; |
||||||
46 | |||||||
47 | /** Concurrency tablename */ |
||||||
48 | const LOGS_TABLE = 'Pagantis_logs'; |
||||||
49 | |||||||
50 | /** Seconds to expire a locked request */ |
||||||
51 | const CONCURRENCY_TIMEOUT = 10; |
||||||
52 | |||||||
53 | /** |
||||||
54 | * EXCEPTION RESPONSES |
||||||
55 | */ |
||||||
56 | const CPO_ERR_MSG = 'Order not confirmed'; |
||||||
57 | const CPO_OK_MSG = 'Order confirmed'; |
||||||
58 | |||||||
59 | /** @var QuoteManagement */ |
||||||
60 | protected $quoteManagement; |
||||||
61 | |||||||
62 | /** @var PaymentInterface $paymentInterface */ |
||||||
63 | protected $paymentInterface; |
||||||
64 | |||||||
65 | /** @var OrderRepositoryInterface $orderRepositoryInterface */ |
||||||
66 | protected $orderRepositoryInterface; |
||||||
67 | |||||||
68 | /** @var Quote $quote */ |
||||||
69 | protected $quote; |
||||||
70 | |||||||
71 | /** @var QuoteRepository $quoteRepository */ |
||||||
72 | protected $quoteRepository; |
||||||
73 | |||||||
74 | /** @var mixed $config */ |
||||||
75 | protected $config; |
||||||
76 | |||||||
77 | /** @var mixed $quoteId */ |
||||||
78 | protected $quoteId; |
||||||
79 | |||||||
80 | /** @var array $notifyResult */ |
||||||
81 | protected $notifyResult; |
||||||
82 | |||||||
83 | /** @var mixed $magentoOrderId */ |
||||||
84 | protected $magentoOrderId; |
||||||
85 | |||||||
86 | /** @var mixed $pagantisOrder */ |
||||||
87 | protected $pagantisOrder; |
||||||
88 | |||||||
89 | /** @var ResourceConnection $dbObject */ |
||||||
90 | protected $dbObject; |
||||||
91 | |||||||
92 | /** @var Session $checkoutSession */ |
||||||
93 | protected $checkoutSession; |
||||||
94 | |||||||
95 | /** @var Client $orderClient */ |
||||||
96 | protected $orderClient; |
||||||
97 | |||||||
98 | /** @var mixed $pagantisOrderId */ |
||||||
99 | protected $pagantisOrderId; |
||||||
100 | |||||||
101 | /** @var OrderInterface $magentoOrder */ |
||||||
102 | protected $magentoOrder; |
||||||
103 | |||||||
104 | /** @var ExtraConfig $extraConfig */ |
||||||
105 | protected $extraConfig; |
||||||
106 | |||||||
107 | /** @var mixed $origin */ |
||||||
108 | protected $origin; |
||||||
109 | |||||||
110 | /** @var mixed $product */ |
||||||
111 | protected $product; |
||||||
112 | |||||||
113 | /** @var RequestInterface $_request*/ |
||||||
114 | protected $_request; |
||||||
115 | |||||||
116 | /** @var mixed $origin */ |
||||||
117 | protected $token; |
||||||
118 | |||||||
119 | /** |
||||||
120 | * IndexV2 constructor. |
||||||
121 | * |
||||||
122 | * @param Context $context |
||||||
123 | * @param Quote $quote |
||||||
124 | * @param QuoteManagement $quoteManagement |
||||||
125 | * @param PaymentInterface $paymentInterface |
||||||
126 | * @param Config $config |
||||||
127 | * @param QuoteRepository $quoteRepository |
||||||
128 | * @param OrderRepositoryInterface $orderRepositoryInterface |
||||||
129 | * @param ResourceConnection $dbObject |
||||||
130 | * @param Session $checkoutSession |
||||||
131 | * @param ExtraConfig $extraConfig |
||||||
132 | * @param RequestInterface $request |
||||||
133 | */ |
||||||
134 | public function __construct( |
||||||
135 | Context $context, |
||||||
136 | Quote $quote, |
||||||
137 | QuoteManagement $quoteManagement, |
||||||
138 | PaymentInterface $paymentInterface, |
||||||
139 | Config $config, |
||||||
140 | QuoteRepository $quoteRepository, |
||||||
141 | OrderRepositoryInterface $orderRepositoryInterface, |
||||||
142 | ResourceConnection $dbObject, |
||||||
143 | Session $checkoutSession, |
||||||
144 | ExtraConfig $extraConfig, |
||||||
145 | RequestInterface $request |
||||||
146 | ) { |
||||||
147 | parent::__construct($context); |
||||||
148 | |||||||
149 | $this->quote = $quote; |
||||||
150 | $this->quoteManagement = $quoteManagement; |
||||||
151 | $this->paymentInterface = $paymentInterface; |
||||||
152 | $this->extraConfig = $extraConfig->getExtraConfig(); |
||||||
153 | $this->config = $config->getConfig(); |
||||||
154 | $this->quoteRepository = $quoteRepository; |
||||||
155 | $this->orderRepositoryInterface = $orderRepositoryInterface; |
||||||
156 | $this->dbObject = $dbObject; |
||||||
157 | $this->checkoutSession = $checkoutSession; |
||||||
158 | $this->_request = $request; |
||||||
159 | $this->origin = ( |
||||||
160 | $this->_request->isPost() || $this->_request->getParam('origin')=='notification' |
||||||
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||||||
161 | ) ? 'Notification' : 'Order'; |
||||||
162 | $this->product = $this->_request->getParam('product'); |
||||||
163 | $this->token = $this->_request->getParam('token'); |
||||||
164 | |||||||
165 | // CsrfAwareAction Magento2.3 compatibility |
||||||
166 | if (interface_exists("\Magento\Framework\App\CsrfAwareActionInterface")) { |
||||||
167 | if (isset($request) && $request->isPost() && empty($request->getParam('form_key'))) { |
||||||
168 | $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); |
||||||
169 | $formKey = $objectManager->get(\Magento\Framework\Data\Form\FormKey::class); |
||||||
170 | $request->setParam('form_key', $formKey->getFormKey()); |
||||||
0 ignored issues
–
show
The method
setParam() does not exist on Magento\Framework\App\RequestInterface . Did you maybe mean setParams() ?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed.
Loading history...
|
|||||||
171 | } |
||||||
172 | } |
||||||
173 | } |
||||||
174 | |||||||
175 | /** |
||||||
176 | * @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\ResultInterface|void |
||||||
177 | * @throws UnknownException |
||||||
178 | */ |
||||||
179 | public function execute() |
||||||
180 | { |
||||||
181 | |||||||
182 | $thrownException = false; |
||||||
183 | try { |
||||||
184 | if ($this->_request->isGet() && $this->isNotification()) { |
||||||
0 ignored issues
–
show
The method
isGet() does not exist on Magento\Framework\App\RequestInterface . It seems like you code against a sub-type of Magento\Framework\App\RequestInterface such as Magento\Framework\Webapi\Request or Magento\Framework\App\Request\Http .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
185 | echo 'OK'; |
||||||
186 | die; |
||||||
0 ignored issues
–
show
|
|||||||
187 | } |
||||||
188 | |||||||
189 | if ($this->_request->isGet() && $this->isRedirect()) { |
||||||
190 | $redirectMessage = sprintf( |
||||||
191 | "[origin=%s][quoteId=%s]", |
||||||
192 | $this->getOrigin(), |
||||||
193 | $this->getRequest()->getParam('quoteId') |
||||||
194 | ); |
||||||
195 | $this->insertLog(null, $redirectMessage); |
||||||
196 | } |
||||||
197 | |||||||
198 | $this->checkConcurrency(); |
||||||
199 | $this->getMerchantOrder(); |
||||||
200 | $this->getPagantisOrderId(); |
||||||
201 | $this->getPagantisOrder(); |
||||||
202 | $this->checkOrderStatus(); |
||||||
203 | $this->checkMerchantOrderStatus(); |
||||||
204 | $this->validateAmount(); |
||||||
205 | $this->processMerchantOrder(); |
||||||
206 | } catch (\Exception $exception) { |
||||||
207 | $thrownException = true; |
||||||
208 | $jsonResponse = new JsonExceptionResponse(); |
||||||
209 | $jsonResponse->setMerchantOrderId($this->magentoOrderId); |
||||||
210 | $jsonResponse->setpagantisOrderId($this->pagantisOrderId); |
||||||
211 | $jsonResponse->setException($exception); |
||||||
212 | $this->insertLog($exception); |
||||||
213 | } |
||||||
214 | |||||||
215 | try { |
||||||
216 | if (!$thrownException) { |
||||||
217 | $this->confirmpagantisOrder(); |
||||||
218 | $jsonResponse = new JsonSuccessResponse(); |
||||||
219 | $jsonResponse->setMerchantOrderId($this->magentoOrderId); |
||||||
220 | $jsonResponse->setpagantisOrderId($this->pagantisOrderId); |
||||||
221 | } |
||||||
222 | } catch (\Exception $exception) { |
||||||
223 | $this->rollbackMerchantOrder(); |
||||||
224 | $jsonResponse = new JsonExceptionResponse(); |
||||||
225 | $jsonResponse->setMerchantOrderId($this->magentoOrderId); |
||||||
226 | $jsonResponse->setpagantisOrderId($this->pagantisOrderId); |
||||||
227 | $jsonResponse->setException($exception); |
||||||
228 | $jsonResponse->toJson(); |
||||||
229 | $this->insertLog($exception); |
||||||
230 | } |
||||||
231 | |||||||
232 | $this->unblockConcurrency(true); |
||||||
233 | |||||||
234 | if ($this->isNotification()) { |
||||||
235 | $returnMessage = sprintf( |
||||||
236 | "[origin=%s][quoteId=%s][magentoOrderId=%s][pagantisOrderId=%s][message=%s]", |
||||||
237 | $this->getOrigin(), |
||||||
238 | $this->quoteId, |
||||||
239 | $this->magentoOrderId, |
||||||
240 | $this->pagantisOrderId, |
||||||
241 | $jsonResponse->getResult() |
||||||
242 | ); |
||||||
243 | $this->insertLog(null, $returnMessage); |
||||||
244 | $jsonResponse->printResponse(); |
||||||
245 | } else { |
||||||
246 | $returnUrl = $this->getRedirectUrl(); |
||||||
247 | $returnMessage = sprintf( |
||||||
248 | "[origin=%s][quoteId=%s][magentoOrderId=%s][pagantisOrderId=%s][returnUrl=%s]", |
||||||
249 | $this->getOrigin(), |
||||||
250 | $this->quoteId, |
||||||
251 | $this->magentoOrderId, |
||||||
252 | $this->pagantisOrderId, |
||||||
253 | $returnUrl |
||||||
254 | ); |
||||||
255 | $this->insertLog(null, $returnMessage); |
||||||
256 | $this->_redirect($returnUrl); |
||||||
257 | } |
||||||
258 | } |
||||||
259 | |||||||
260 | /** |
||||||
261 | * COMMON FUNCTIONS |
||||||
262 | */ |
||||||
263 | |||||||
264 | /** |
||||||
265 | * @throws ConcurrencyException |
||||||
266 | * @throws QuoteNotFoundException |
||||||
267 | * @throws UnknownException |
||||||
268 | */ |
||||||
269 | private function checkConcurrency() |
||||||
270 | { |
||||||
271 | $this->getQuoteId(); |
||||||
272 | $this->checkDbTable(); |
||||||
273 | $this->unblockConcurrency(); |
||||||
274 | $this->blockConcurrency(); |
||||||
275 | } |
||||||
276 | |||||||
277 | /** |
||||||
278 | * @throws MerchantOrderNotFoundException |
||||||
279 | */ |
||||||
280 | private function getMerchantOrder() |
||||||
281 | { |
||||||
282 | try { |
||||||
283 | /** @var Quote quote */ |
||||||
284 | $this->quote = $this->quoteRepository->get($this->quoteId); |
||||||
285 | } catch (\Exception $e) { |
||||||
286 | throw new MerchantOrderNotFoundException(); |
||||||
287 | } |
||||||
288 | } |
||||||
289 | |||||||
290 | /** |
||||||
291 | * @throws UnknownException |
||||||
292 | */ |
||||||
293 | private function getPagantisOrderId() |
||||||
294 | { |
||||||
295 | try { |
||||||
296 | /** @var \Magento\Framework\DB\Adapter\AdapterInterface $dbConnection */ |
||||||
297 | $dbConnection = $this->dbObject->getConnection(); |
||||||
298 | $tableName = $this->dbObject->getTableName(self::ORDERS_TABLE); |
||||||
299 | $query = "select order_id from $tableName where id='".$this->quoteId."' and token='".$this->token."'"; |
||||||
300 | $queryResult = $dbConnection->fetchRow($query); |
||||||
301 | $this->pagantisOrderId = $queryResult['order_id']; |
||||||
302 | if ($this->pagantisOrderId == '') { |
||||||
303 | throw new NoIdentificationException(); |
||||||
304 | } |
||||||
305 | } catch (\Exception $e) { |
||||||
306 | throw new UnknownException($e->getMessage()); |
||||||
307 | } |
||||||
308 | } |
||||||
309 | |||||||
310 | /** |
||||||
311 | * @throws OrderNotFoundException |
||||||
312 | */ |
||||||
313 | private function getPagantisOrder() |
||||||
314 | { |
||||||
315 | try { |
||||||
316 | if ($this->getProduct()===ConfigProvider::CODE4X) { |
||||||
317 | $this->orderClient = new Client( |
||||||
318 | $this->config['pagantis_public_key_4x'], |
||||||
319 | $this->config['pagantis_private_key_4x'] |
||||||
320 | ); |
||||||
321 | } else { |
||||||
322 | $this->orderClient = new Client( |
||||||
323 | $this->config['pagantis_public_key'], |
||||||
324 | $this->config['pagantis_private_key'] |
||||||
325 | ); |
||||||
326 | } |
||||||
327 | $this->pagantisOrder = $this->orderClient->getOrder($this->pagantisOrderId); |
||||||
328 | } catch (\Exception $e) { |
||||||
329 | throw new OrderNotFoundException(); |
||||||
330 | } |
||||||
331 | } |
||||||
332 | |||||||
333 | /** |
||||||
334 | * @throws AlreadyProcessedException |
||||||
335 | * @throws WrongStatusException |
||||||
336 | */ |
||||||
337 | private function checkOrderStatus() |
||||||
338 | { |
||||||
339 | try { |
||||||
340 | $this->checkPagantisStatus(array('AUTHORIZED')); |
||||||
341 | } catch (\Exception $e) { |
||||||
342 | $this->getMagentoOrderId(); |
||||||
343 | if ($this->magentoOrderId!='') { |
||||||
344 | throw new AlreadyProcessedException(); |
||||||
345 | } else { |
||||||
346 | throw new WrongStatusException($this->pagantisOrder->getStatus()); |
||||||
347 | } |
||||||
348 | } |
||||||
349 | } |
||||||
350 | |||||||
351 | /** |
||||||
352 | * @throws AlreadyProcessedException |
||||||
353 | */ |
||||||
354 | private function checkMerchantOrderStatus() |
||||||
355 | { |
||||||
356 | if ($this->quote->getIsActive()=='0') { |
||||||
357 | $this->getMagentoOrderId(); |
||||||
358 | throw new AlreadyProcessedException(); |
||||||
359 | } |
||||||
360 | } |
||||||
361 | |||||||
362 | /** |
||||||
363 | * @throws AmountMismatchException |
||||||
364 | */ |
||||||
365 | private function validateAmount() |
||||||
366 | { |
||||||
367 | $pagantisAmount = $this->pagantisOrder->getShoppingCart()->getTotalAmount(); |
||||||
368 | $merchantAmount = intval(100 * $this->quote->getGrandTotal()); |
||||||
369 | if ($pagantisAmount != $merchantAmount) { |
||||||
370 | throw new AmountMismatchException($pagantisAmount, $merchantAmount); |
||||||
371 | } |
||||||
372 | } |
||||||
373 | |||||||
374 | /** |
||||||
375 | * @throws UnknownException |
||||||
376 | */ |
||||||
377 | private function processMerchantOrder() |
||||||
378 | { |
||||||
379 | try { |
||||||
380 | $this->saveOrder(); |
||||||
381 | $this->updateBdInfo(); |
||||||
382 | } catch (\Exception $e) { |
||||||
383 | throw new UnknownException($e->getMessage()); |
||||||
384 | } |
||||||
385 | } |
||||||
386 | |||||||
387 | /** |
||||||
388 | * @return false|string |
||||||
389 | * @throws UnknownException |
||||||
390 | */ |
||||||
391 | private function confirmpagantisOrder() |
||||||
392 | { |
||||||
393 | try { |
||||||
394 | $this->pagantisOrder = $this->orderClient->confirmOrder($this->pagantisOrderId); |
||||||
395 | } catch (\Exception $e) { |
||||||
396 | throw new UnknownException(sprintf("[%s]%s", $this->getOrigin(), $e->getMessage())); |
||||||
397 | } |
||||||
398 | |||||||
399 | $jsonResponse = new JsonSuccessResponse(); |
||||||
400 | $jsonResponse->setStatusCode(200); |
||||||
401 | $jsonResponse->setMerchantOrderId($this->magentoOrderId); |
||||||
402 | $jsonResponse->setpagantisOrderId($this->pagantisOrderId); |
||||||
403 | $jsonResponse->setResult(self::CPO_OK_MSG); |
||||||
404 | return $jsonResponse->toJson(); |
||||||
405 | } |
||||||
406 | |||||||
407 | /** |
||||||
408 | * UTILS FUNCTIONS |
||||||
409 | */ |
||||||
410 | |||||||
411 | /** STEP 1 CC - Check concurrency |
||||||
412 | * @throws QuoteNotFoundException |
||||||
413 | */ |
||||||
414 | private function getQuoteId() |
||||||
415 | { |
||||||
416 | $this->quoteId = $this->getRequest()->getParam('quoteId'); |
||||||
417 | if ($this->quoteId == '') { |
||||||
418 | throw new QuoteNotFoundException(); |
||||||
419 | } |
||||||
420 | } |
||||||
421 | |||||||
422 | /** |
||||||
423 | * @return \Zend_Db_Statement_Interface |
||||||
424 | * @throws UnknownException |
||||||
425 | */ |
||||||
426 | private function checkDbTable() |
||||||
427 | { |
||||||
428 | try { |
||||||
429 | /** @var \Magento\Framework\DB\Adapter\AdapterInterface $dbConnection */ |
||||||
430 | $dbConnection = $this->dbObject->getConnection(); |
||||||
431 | $tableName = $this->dbObject->getTableName(self::CONCURRENCY_TABLE); |
||||||
432 | $query = "CREATE TABLE IF NOT EXISTS $tableName(`id` int not null,`timestamp` int not null,PRIMARY KEY (`id`))"; |
||||||
433 | |||||||
434 | return $dbConnection->query($query); |
||||||
435 | } catch (\Exception $e) { |
||||||
436 | throw new UnknownException($e->getMessage()); |
||||||
437 | } |
||||||
438 | } |
||||||
439 | |||||||
440 | /** |
||||||
441 | * @return void|\Zend_Db_Statement_Interface |
||||||
442 | * @throws UnknownException |
||||||
443 | */ |
||||||
444 | private function checkDbLogTable() |
||||||
445 | { |
||||||
446 | try { |
||||||
447 | /** @var \Magento\Framework\DB\Adapter\AdapterInterface $dbConnection */ |
||||||
448 | $dbConnection = $this->dbObject->getConnection(); |
||||||
449 | $tableName = $this->dbObject->getTableName(self::LOGS_TABLE); |
||||||
450 | if (!$dbConnection->isTableExists($tableName)) { |
||||||
451 | $table = $dbConnection |
||||||
452 | ->newTable($tableName) |
||||||
453 | ->addColumn( |
||||||
454 | 'id', |
||||||
455 | Table::TYPE_SMALLINT, |
||||||
456 | null, |
||||||
457 | array('nullable'=>false, 'auto_increment'=>true, 'primary'=>true) |
||||||
458 | ) |
||||||
459 | ->addColumn('log', Table::TYPE_TEXT, null, array('nullable'=>false)) |
||||||
460 | ->addColumn( |
||||||
461 | 'createdAt', |
||||||
462 | Table::TYPE_TIMESTAMP, |
||||||
463 | null, |
||||||
464 | array('nullable'=>false, 'default'=>Table::TIMESTAMP_INIT) |
||||||
465 | ); |
||||||
466 | return $dbConnection->createTable($table); |
||||||
467 | } |
||||||
468 | |||||||
469 | return; |
||||||
470 | } catch (\Exception $e) { |
||||||
471 | throw new UnknownException($e->getMessage()); |
||||||
472 | } |
||||||
473 | } |
||||||
474 | |||||||
475 | /** |
||||||
476 | * @param bool $mode |
||||||
477 | * |
||||||
478 | * @throws \Exception |
||||||
479 | */ |
||||||
480 | private function unblockConcurrency($mode = false) |
||||||
481 | { |
||||||
482 | try { |
||||||
483 | /** @var \Magento\Framework\DB\Adapter\AdapterInterface $dbConnection */ |
||||||
484 | $dbConnection = $this->dbObject->getConnection(); |
||||||
485 | $tableName = $this->dbObject->getTableName(self::CONCURRENCY_TABLE); |
||||||
486 | if ($mode == false) { |
||||||
487 | $dbConnection->delete($tableName, "timestamp<".(time() - 5)); |
||||||
488 | } elseif ($this->quoteId!='') { |
||||||
489 | $dbConnection->delete($tableName, "id=".$this->quoteId); |
||||||
490 | } |
||||||
491 | } catch (Exception $exception) { |
||||||
0 ignored issues
–
show
|
|||||||
492 | throw new ConcurrencyException(); |
||||||
493 | } |
||||||
494 | } |
||||||
495 | |||||||
496 | /** |
||||||
497 | * @throws ConcurrencyException |
||||||
498 | * @throws UnknownException |
||||||
499 | */ |
||||||
500 | private function blockConcurrency() |
||||||
501 | { |
||||||
502 | /** @var \Magento\Framework\DB\Adapter\AdapterInterface $dbConnection */ |
||||||
503 | $dbConnection = $this->dbObject->getConnection(); |
||||||
504 | $tableName = $this->dbObject->getTableName(self::CONCURRENCY_TABLE); |
||||||
505 | $query = "SELECT timestamp FROM $tableName where id='$this->quoteId'"; |
||||||
506 | $resultsSelect = $dbConnection->fetchRow($query); |
||||||
507 | if (isset($resultsSelect['timestamp'])) { |
||||||
508 | if ($this->isNotification()) { |
||||||
509 | throw new ConcurrencyException(); |
||||||
510 | } else { |
||||||
511 | $query = sprintf( |
||||||
512 | "SELECT timestamp - %s as rest FROM %s %s", |
||||||
513 | (time() - self::CONCURRENCY_TIMEOUT), |
||||||
514 | $tableName, |
||||||
515 | "WHERE id='".$this->quoteId."'" |
||||||
516 | ); |
||||||
517 | $resultsSelect = $dbConnection->fetchRow($query); |
||||||
518 | $restSeconds = isset($resultsSelect['rest']) ? ($resultsSelect['rest']) : 0; |
||||||
519 | $expirationSec = ($restSeconds > self::CONCURRENCY_TIMEOUT) ? self::CONCURRENCY_TIMEOUT : $restSeconds; |
||||||
520 | if ($expirationSec > 0) { |
||||||
521 | sleep($expirationSec + 1); |
||||||
522 | } |
||||||
523 | |||||||
524 | $this->getPagantisOrderId(); |
||||||
525 | $this->getMagentoOrderId(); |
||||||
526 | |||||||
527 | $logMessage = sprintf( |
||||||
528 | "User waiting %s seconds, default seconds %s, bd time to expire %s seconds[quoteId=%s][origin=%s]", |
||||||
529 | $expirationSec, |
||||||
530 | self::CONCURRENCY_TIMEOUT, |
||||||
531 | $restSeconds, |
||||||
532 | $this->quoteId, |
||||||
533 | $this->getOrigin() |
||||||
534 | ); |
||||||
535 | throw new UnknownException($logMessage); |
||||||
536 | } |
||||||
537 | } else { |
||||||
538 | $dbConnection->insert($tableName, array('id'=>$this->quoteId, 'timestamp'=>time())); |
||||||
539 | } |
||||||
540 | } |
||||||
541 | |||||||
542 | /** STEP 2 GMO - Get Merchant Order */ |
||||||
543 | /** STEP 3 GPOI - Get Pagantis OrderId */ |
||||||
544 | /** STEP 4 GPO - Get Pagantis Order */ |
||||||
545 | /** STEP 5 COS - Check Order Status */ |
||||||
546 | /** |
||||||
547 | * @param $statusArray |
||||||
548 | * |
||||||
549 | * @throws \Exception |
||||||
550 | */ |
||||||
551 | private function checkPagantisStatus($statusArray) |
||||||
552 | { |
||||||
553 | $pagantisStatus = array(); |
||||||
554 | foreach ($statusArray as $status) { |
||||||
555 | $pagantisStatus[] = constant("\Pagantis\OrdersApiClient\Model\Order::STATUS_$status"); |
||||||
556 | } |
||||||
557 | |||||||
558 | $payed = in_array($this->pagantisOrder->getStatus(), $pagantisStatus); |
||||||
559 | if (!$payed) { |
||||||
560 | throw new WrongStatusException($this->pagantisOrder->getStatus()); |
||||||
561 | } |
||||||
562 | } |
||||||
563 | |||||||
564 | /** STEP 6 CMOS - Check Merchant Order Status */ |
||||||
565 | /** |
||||||
566 | * @throws \Exception |
||||||
567 | */ |
||||||
568 | private function getMagentoOrderId() |
||||||
569 | { |
||||||
570 | try { |
||||||
571 | /** @var \Magento\Framework\DB\Adapter\AdapterInterface $dbConnection */ |
||||||
572 | $dbConnection = $this->dbObject->getConnection(); |
||||||
573 | $tableName = $this->dbObject->getTableName(self::ORDERS_TABLE); |
||||||
574 | |||||||
575 | if ($this->pagantisOrderId == '') { |
||||||
576 | $this->getPagantisOrderId(); |
||||||
577 | } |
||||||
578 | |||||||
579 | $pagantisOrderId = $this->pagantisOrderId; |
||||||
580 | $query = sprintf( |
||||||
581 | "select mg_order_id from %s where id='%s' and order_id='%s' and token='%s'", |
||||||
582 | $tableName, |
||||||
583 | $this->quoteId, |
||||||
584 | $pagantisOrderId, |
||||||
585 | $this->token |
||||||
586 | ); |
||||||
587 | $queryResult = $dbConnection->fetchRow($query); |
||||||
588 | $this->magentoOrderId = $queryResult['mg_order_id']; |
||||||
589 | } catch (\Exception $e) { |
||||||
590 | throw new UnknownException($e->getMessage()); |
||||||
591 | } |
||||||
592 | } |
||||||
593 | |||||||
594 | /** STEP 7 VA - Validate Amount */ |
||||||
595 | /** STEP 8 PMO - Process Merchant Order */ |
||||||
596 | /** |
||||||
597 | * @throws UnknownException |
||||||
598 | */ |
||||||
599 | private function saveOrder() |
||||||
600 | { |
||||||
601 | try { |
||||||
602 | $this->paymentInterface->setMethod($this->getProduct()); |
||||||
603 | $this->magentoOrderId = $this->quoteManagement->placeOrder($this->quoteId, $this->paymentInterface); |
||||||
604 | /** @var OrderRepositoryInterface magentoOrder */ |
||||||
605 | $this->magentoOrder = $this->orderRepositoryInterface->get($this->magentoOrderId); |
||||||
606 | $metadataOrder = $this->pagantisOrder->getMetadata(); |
||||||
607 | $metadataInfo = null; |
||||||
608 | foreach ($metadataOrder as $metadataKey => $metadataValue) { |
||||||
609 | if ($metadataKey == 'promotedProduct') { |
||||||
610 | $metadataInfo.= "/Producto promocionado = $metadataValue"; |
||||||
611 | } |
||||||
612 | } |
||||||
613 | |||||||
614 | $this->magentoOrder->addStatusHistoryComment($metadataInfo) |
||||||
615 | ->setIsCustomerNotified(false) |
||||||
616 | ->setEntityName('order') |
||||||
617 | ->save(); |
||||||
618 | |||||||
619 | $comment = sprintf( |
||||||
620 | 'pagantisOrderId: %s || pagantisOrderStatus: %s || via: %s || product: %s', |
||||||
621 | $this->pagantisOrder->getId(), |
||||||
622 | $this->pagantisOrder->getStatus(), |
||||||
623 | $this->getOrigin(), |
||||||
624 | $this->getProduct() |
||||||
625 | ); |
||||||
626 | |||||||
627 | $this->magentoOrder->addStatusHistoryComment($comment) |
||||||
628 | ->setIsCustomerNotified(false) |
||||||
629 | ->setEntityName('order') |
||||||
630 | ->save(); |
||||||
631 | |||||||
632 | if ($this->magentoOrderId == '') { |
||||||
633 | throw new UnknownException('Order can not be saved'); |
||||||
634 | } |
||||||
635 | } catch (\Exception $e) { |
||||||
636 | throw new UnknownException($e->getMessage()); |
||||||
637 | } |
||||||
638 | } |
||||||
639 | |||||||
640 | /** |
||||||
641 | * @throws UnknownException |
||||||
642 | */ |
||||||
643 | private function updateBdInfo() |
||||||
644 | { |
||||||
645 | try { |
||||||
646 | /** @var \Magento\Framework\DB\Adapter\AdapterInterface $dbConnection */ |
||||||
647 | $dbConnection = $this->dbObject->getConnection(); |
||||||
648 | $tableName = $this->dbObject->getTableName(self::ORDERS_TABLE); |
||||||
649 | $pagantisOrderId = $this->pagantisOrder->getId(); |
||||||
650 | $dbConnection->update( |
||||||
651 | $tableName, |
||||||
652 | array('mg_order_id' => $this->magentoOrderId), |
||||||
653 | "order_id='$pagantisOrderId' and id='$this->quoteId'" |
||||||
654 | ); |
||||||
655 | } catch (\Exception $e) { |
||||||
656 | throw new UnknownException($e->getMessage()); |
||||||
657 | } |
||||||
658 | } |
||||||
659 | |||||||
660 | /** STEP 9 CPO - Confirmation Pagantis Order */ |
||||||
661 | /** |
||||||
662 | * @throws UnknownException |
||||||
663 | */ |
||||||
664 | private function rollbackMerchantOrder() |
||||||
665 | { |
||||||
666 | try { |
||||||
667 | $this->magentoOrder->setState(\Magento\Sales\Model\Order::STATE_PENDING_PAYMENT, true); |
||||||
668 | $this->magentoOrder->setStatus(\Magento\Sales\Model\Order::STATE_PENDING_PAYMENT); |
||||||
669 | $this->magentoOrder->save(); |
||||||
670 | } catch (\Exception $e) { |
||||||
671 | throw new UnknownException($e->getMessage()); |
||||||
672 | } |
||||||
673 | } |
||||||
674 | |||||||
675 | /** |
||||||
676 | * @return mixed |
||||||
677 | */ |
||||||
678 | public function getOrigin() |
||||||
679 | { |
||||||
680 | return $this->origin; |
||||||
681 | } |
||||||
682 | |||||||
683 | /** |
||||||
684 | * @param mixed $origin |
||||||
685 | */ |
||||||
686 | public function setOrigin($origin) |
||||||
687 | { |
||||||
688 | $this->origin = $origin; |
||||||
689 | } |
||||||
690 | |||||||
691 | /** |
||||||
692 | * @return mixed |
||||||
693 | */ |
||||||
694 | public function getProduct() |
||||||
695 | { |
||||||
696 | return $this->product; |
||||||
697 | } |
||||||
698 | |||||||
699 | /** |
||||||
700 | * @param mixed $product |
||||||
701 | */ |
||||||
702 | public function setProduct($product) |
||||||
703 | { |
||||||
704 | $this->product = $product; |
||||||
705 | } |
||||||
706 | |||||||
707 | /** |
||||||
708 | * @return string |
||||||
709 | * @throws UnknownException |
||||||
710 | */ |
||||||
711 | private function getRedirectUrl() |
||||||
712 | { |
||||||
713 | //$returnUrl = 'checkout/#payment'; |
||||||
714 | $returnUrl = $this->_url->getUrl('checkout', ['_fragment' => 'payment']); |
||||||
715 | |||||||
716 | if ($this->pagantisOrderId == '') { |
||||||
717 | $this->getPagantisOrderId(); |
||||||
718 | } |
||||||
719 | |||||||
720 | if ($this->magentoOrderId == '') { |
||||||
721 | $this->getMagentoOrderId(); |
||||||
722 | } |
||||||
723 | |||||||
724 | if ($this->magentoOrderId!='') { |
||||||
725 | /** @var Order $this->magentoOrder */ |
||||||
726 | $this->magentoOrder = $this->orderRepositoryInterface->get($this->magentoOrderId); |
||||||
727 | if (!$this->_objectManager->get(\Magento\Checkout\Model\Session\SuccessValidator::class)->isValid()) { |
||||||
728 | $checkoutMessage = sprintf( |
||||||
729 | "[origin=%s][quoteId=%s][magentoOrderId=%s][pagantisOrderId=%s]Setting checkout session", |
||||||
730 | $this->getOrigin(), |
||||||
731 | $this->quoteId, |
||||||
732 | $this->magentoOrderId, |
||||||
733 | $this->pagantisOrderId |
||||||
734 | ); |
||||||
735 | $this->insertLog(null, $checkoutMessage); |
||||||
736 | $this->checkoutSession |
||||||
737 | ->setLastOrderId($this->magentoOrderId) |
||||||
738 | ->setLastRealOrderId($this->magentoOrder->getIncrementId()) |
||||||
739 | ->setLastQuoteId($this->quoteId) |
||||||
740 | ->setLastSuccessQuoteId($this->quoteId) |
||||||
741 | ->setLastOrderStatus($this->magentoOrder->getStatus()); |
||||||
742 | } |
||||||
743 | |||||||
744 | //Magento status flow => https://docs.magento.com/m2/ce/user_guide/sales/order-status-workflow.html |
||||||
745 | //Order Workflow => https://docs.magento.com/m2/ce/user_guide/sales/order-workflow.html |
||||||
746 | $orderStatus = strtolower($this->magentoOrder->getStatus()); |
||||||
747 | $acceptedStatus = array('processing', 'completed'); |
||||||
748 | if (in_array($orderStatus, $acceptedStatus)) { |
||||||
749 | if (isset($this->extraConfig['PAGANTIS_OK_URL']) && $this->extraConfig['PAGANTIS_OK_URL']!= '') { |
||||||
750 | $returnUrl = $this->extraConfig['PAGANTIS_OK_URL']; |
||||||
751 | } else { |
||||||
752 | $returnUrl = 'checkout/onepage/success'; |
||||||
753 | } |
||||||
754 | } else { |
||||||
755 | if (isset($this->extraConfig['PAGANTIS_KO_URL']) && $this->extraConfig['PAGANTIS_KO_URL'] != '') { |
||||||
756 | $returnUrl = $this->extraConfig['PAGANTIS_KO_URL']; |
||||||
757 | } else { |
||||||
758 | //$returnUrl = 'checkout/#payment'; |
||||||
759 | $returnUrl = $this->_url->getUrl('checkout', ['_fragment' => 'payment']); |
||||||
760 | } |
||||||
761 | } |
||||||
762 | } |
||||||
763 | return $returnUrl; |
||||||
764 | } |
||||||
765 | |||||||
766 | /** |
||||||
767 | * @param null $exceptionMessage |
||||||
768 | * @param null $logMessage |
||||||
769 | * |
||||||
770 | * @throws UnknownException |
||||||
771 | */ |
||||||
772 | private function insertLog($exceptionMessage = null, $logMessage = null) |
||||||
773 | { |
||||||
774 | try { |
||||||
775 | $this->checkDbLogTable(); |
||||||
776 | $logEntryJson = ''; |
||||||
777 | if ($exceptionMessage instanceof \Exception) { |
||||||
778 | $logEntry = new LogEntry(); |
||||||
779 | $logEntryJson = $logEntry->error($exceptionMessage)->toJson(); |
||||||
780 | } elseif ($logMessage != null) { |
||||||
781 | $logEntry = new LogEntry(); |
||||||
782 | $logEntryJson = $logEntry->info($logMessage)->toJson(); |
||||||
783 | } |
||||||
784 | |||||||
785 | if ($logEntryJson != '') { |
||||||
786 | /** @var \Magento\Framework\DB\Adapter\AdapterInterface $dbConnection */ |
||||||
787 | $dbConnection = $this->dbObject->getConnection(); |
||||||
788 | $tableName = $this->dbObject->getTableName(self::LOGS_TABLE); |
||||||
789 | $dbConnection->insert($tableName, array('log' => $logEntryJson)); |
||||||
790 | } |
||||||
791 | } catch (\Exception $e) { |
||||||
792 | throw new UnknownException($e->getMessage()); |
||||||
793 | } |
||||||
794 | } |
||||||
795 | |||||||
796 | /** |
||||||
797 | * @return bool |
||||||
798 | */ |
||||||
799 | private function isNotification() |
||||||
800 | { |
||||||
801 | return ($this->getOrigin() == 'Notification'); |
||||||
802 | } |
||||||
803 | |||||||
804 | /** |
||||||
805 | * @return bool |
||||||
806 | */ |
||||||
807 | private function isRedirect() |
||||||
808 | { |
||||||
809 | return ($this->getOrigin() == 'Order'); |
||||||
810 | } |
||||||
811 | |||||||
812 | /** |
||||||
813 | * @param RequestInterface $request |
||||||
814 | * |
||||||
815 | * @return InvalidRequestException|null |
||||||
816 | */ |
||||||
817 | public function createCsrfValidationException(RequestInterface $request) |
||||||
818 | { |
||||||
819 | return null; |
||||||
820 | } |
||||||
821 | |||||||
822 | /** |
||||||
823 | * @param RequestInterface $request |
||||||
824 | * |
||||||
825 | * @return bool|null |
||||||
826 | */ |
||||||
827 | public function validateForCsrf(RequestInterface $request) |
||||||
828 | { |
||||||
829 | return true; |
||||||
830 | } |
||||||
831 | } |
||||||
832 |