Passed
Push — feature/eco-3337-update-depend... ( e0ae92...3ddca9 )
by Dmitri
10:07
created

PaymentController::getAvailableCarriers()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 10
nc 3
nop 1
dl 0
loc 16
rs 9.9332
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Apache OSL-2
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace SprykerEco\Yves\AmazonPay\Controller;
9
10
use ArrayObject;
11
use Generated\Shared\Transfer\AmazonpayPaymentTransfer;
12
use Generated\Shared\Transfer\AmazonpayStatusTransfer;
13
use Generated\Shared\Transfer\CheckoutErrorTransfer;
14
use Generated\Shared\Transfer\CheckoutResponseTransfer;
15
use Generated\Shared\Transfer\QuoteTransfer;
16
use Generated\Shared\Transfer\ShipmentCarrierTransfer;
17
use Generated\Shared\Transfer\ShipmentMethodsTransfer;
18
use Spryker\Shared\Config\Config;
19
use Spryker\Yves\Kernel\Controller\AbstractController;
20
use SprykerEco\Shared\AmazonPay\AmazonPayConfig;
21
use SprykerEco\Shared\AmazonPay\AmazonPayConstants;
22
use SprykerEco\Yves\AmazonPay\Plugin\Provider\AmazonPayControllerProvider;
23
use Symfony\Component\HttpFoundation\JsonResponse;
24
use Symfony\Component\HttpFoundation\RedirectResponse;
25
use Symfony\Component\HttpFoundation\Request;
26
use Symfony\Component\HttpFoundation\Response;
27
28
/**
29
 * @method \SprykerEco\Client\AmazonPay\AmazonPayClientInterface getClient()
30
 * @method \SprykerEco\Yves\AmazonPay\AmazonPayFactory getFactory()
31
 */
32
class PaymentController extends AbstractController
33
{
34
    public const URL_PARAM_REFERENCE_ID = 'reference_id';
35
    public const URL_PARAM_SELLER_ID = 'seller_id';
36
    public const URL_PARAM_ACCESS_TOKEN = 'access_token';
37
    public const URL_PARAM_SHIPMENT_METHOD_ID = 'shipment_method_id';
38
    public const QUOTE_TRANSFER = 'quoteTransfer';
39
    public const SHIPMENT_METHODS = 'shipmentMethods';
40
    public const SHIPMENT_CARRIERS = 'shipmentCarriers';
41
    public const SELECTED_SHIPMENT_METHOD_ID = 'selectedShipmentMethodId';
42
    public const AMAZONPAY_CONFIG = 'amazonpayConfig';
43
    public const IS_ASYNCHRONOUS = 'isAsynchronous';
44
    public const CART_ITEMS = 'cartItems';
45
    public const SUCCESS = 'success';
46
    public const ERROR_AMAZONPAY_PAYMENT_FAILED = 'amazonpay.payment.failed';
47
    public const IS_AMAZON_PAYMENT_INVALID = 'isAmazonPaymentInvalid';
48
    public const ADDRESS_BOOK_MODE = 'addressBookMode';
49
    public const ORDER_REFERENCE = 'orderReferenceId';
50
51
    public const PSD2_DATA = 'psd2Data';
52
    public const PSD2_DATA_KEY_AJAX_ENDPOINT = 'psd2AjaxEndpoint';
53
    public const PSD2_DATA_KEY_SELLER_ID = 'amazonSellerId';
54
    public const PSD2_DATA_KEY_AMAZON_ORDER_REFERENCE_ID = 'amazonOrderReferenceId';
55
    public const PSD2_DATA_KEY_AMAZON_FAILURE_URL = 'amazonFailureUrl';
56
57
    /**
58
     * @param \Symfony\Component\HttpFoundation\Request $request
59
     *
60
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
61
     */
62
    public function checkoutAction(Request $request)
63
    {
64
        $response = $this->executeCheckoutAction($request);
65
66
        if (!is_array($response)) {
0 ignored issues
show
introduced by
The condition is_array($response) is always false.
Loading history...
67
            return $response;
68
        }
69
70
        return $this->view($response, [], '@AmazonPay/views/checkout/checkout.twig');
71
    }
72
73
    /**
74
     * @param \Symfony\Component\HttpFoundation\Request $request
75
     *
76
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
77
     */
78
    protected function executeCheckoutAction(Request $request)
79
    {
80
        $quoteTransfer = $this->getFactory()
81
            ->getQuoteClient()
82
            ->getQuote();
83
84
        if (!$this->isAllowedCheckout($quoteTransfer) || !$this->isRequestComplete($request)) {
85
            $this->addAmazonPayErrorFromQuote($quoteTransfer);
86
87
            return $this->buildRedirectInternalResponse();
88
        }
89
90
        $this->storeAmazonPaymentIntoQuote($request, $quoteTransfer);
91
92
        $data = [
93
            static::QUOTE_TRANSFER => $quoteTransfer,
94
            static::CART_ITEMS => $this->getCartItems($quoteTransfer),
95
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
96
            static::PSD2_DATA => $this->preparePSD2Data($quoteTransfer),
97
        ];
98
99
        if ($this->isAmazonPaymentInvalid($quoteTransfer)) {
100
            $data[static::ORDER_REFERENCE] = $this->getAmazonPaymentOrderReferenceId($quoteTransfer);
101
            $data[static::ADDRESS_BOOK_MODE] = AmazonPayConfig::DISPLAY_MODE_READONLY;
102
        }
103
104
        if ($quoteTransfer->getAmazonpayPayment()->getOrderReferenceStatus()) {
105
            $data[static::ADDRESS_BOOK_MODE] = AmazonPayConfig::DISPLAY_MODE_READONLY;
106
        }
107
108
        return $data;
109
    }
110
111
    /**
112
     * @param \Symfony\Component\HttpFoundation\Request $request
113
     *
114
     * @return \Symfony\Component\HttpFoundation\Response
115
     */
116
    public function setOrderReferenceAction(Request $request)
117
    {
118
        $quoteTransfer = $this->getFactory()
119
            ->getQuoteClient()
120
            ->getQuote();
121
122
        if (!$this->isAmazonPayment($quoteTransfer)) {
123
            return $this->buildRedirectInternalResponse();
124
        }
125
126
        $quoteTransfer->getAmazonpayPayment()
127
            ->setOrderReferenceId(
128
                $request->request->get(static::URL_PARAM_REFERENCE_ID)
129
            );
130
131
        $this->saveQuote($quoteTransfer);
132
133
        return $this->createJsonResponse([static::SUCCESS => true]);
134
    }
135
136
    /**
137
     * @param \Symfony\Component\HttpFoundation\Request $request
138
     *
139
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
140
     */
141
    public function getShipmentMethodsAction(Request $request)
142
    {
143
        $response = $this->executeShipmentMethodsAction($request);
144
145
        if (!is_array($response)) {
0 ignored issues
show
introduced by
The condition is_array($response) is always false.
Loading history...
146
            return $response;
147
        }
148
149
        return $this->view($response, [], '@AmazonPay/views/get-shipment-methods/get-shipment-methods.twig');
150
    }
151
152
    /**
153
     * @param \Symfony\Component\HttpFoundation\Request $request
154
     *
155
     * @return \Symfony\Component\HttpFoundation\Response
156
     */
157
    public function confirmPurchaseAction(Request $request): Response
158
    {
159
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
160
        $quoteTransfer = $this->getClient()->confirmPurchase($quoteTransfer);
161
162
        $amazonpayPaymentTransfer = $quoteTransfer->getAmazonpayPayment();
163
164
        if (!$amazonpayPaymentTransfer->getResponseHeader()->getIsSuccess()
165
            && $amazonpayPaymentTransfer->getResponseHeader()->getConstraints()->count()
166
        ) {
167
            $this->addErrorMessage($amazonpayPaymentTransfer->getResponseHeader()->getErrorMessage());
168
            $payload = [
169
                static::SUCCESS => false,
170
                'url' => $this->getApplication()->url(AmazonPayControllerProvider::CHECKOUT, [
0 ignored issues
show
Bug introduced by
The method url() does not exist on Spryker\Service\Container\ContainerInterface. It seems like you code against a sub-type of Spryker\Service\Container\ContainerInterface such as Silex\Tests\Application\UrlGeneratorApplication or Spryker\Shared\Kernel\Communication\Application. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

170
                'url' => $this->getApplication()->/** @scrutinizer ignore-call */ url(AmazonPayControllerProvider::CHECKOUT, [
Loading history...
171
                    static::URL_PARAM_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
172
                    static::URL_PARAM_ACCESS_TOKEN => $quoteTransfer->getAmazonpayPayment()->getAddressConsentToken(),
173
                ]),
174
            ];
175
176
            return $this->createJsonResponse($payload, 302);
177
        }
178
179
        $this->saveQuote($quoteTransfer);
180
181
        if (!$this->isOrderStatusOpen($quoteTransfer)) {
182
            return $this->createJsonResponse([static::SUCCESS => false], 400);
183
        }
184
185
        return $this->createJsonResponse([static::SUCCESS => true]);
186
    }
187
188
    /**
189
     * @param \Symfony\Component\HttpFoundation\Request $request
190
     *
191
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
192
     */
193
    protected function executeShipmentMethodsAction(Request $request)
194
    {
195
        $quoteTransfer = $this->getFactory()
196
            ->getQuoteClient()
197
            ->getQuote();
198
199
        if (!$this->isAmazonPayment($quoteTransfer)) {
200
            $this->addAmazonPayErrorFromQuote($quoteTransfer);
201
202
            return $this->buildRedirectInternalResponse();
203
        }
204
205
        $quoteTransfer = $this->getClient()
206
            ->addSelectedAddressToQuote($quoteTransfer);
207
208
        foreach ($quoteTransfer->getItems() as $item)
209
        {
210
            $item->setShipment($quoteTransfer->getShipment());
211
        }
212
213
        $this->saveQuote($quoteTransfer);
214
        $shipmentMethods = $this->getFactory()
215
            ->getShipmentClient()
216
            ->getAvailableMethods($quoteTransfer);
217
218
        $this->getFactory()
219
            ->getShipmentClient();
220
221
        return [
222
            static::SELECTED_SHIPMENT_METHOD_ID => $this->getCurrentShipmentMethodId($quoteTransfer),
223
            static::SHIPMENT_METHODS => $shipmentMethods->getMethods(),
224
            static::SHIPMENT_CARRIERS => $this->getAvailableCarriers($shipmentMethods),
225
            static::IS_AMAZON_PAYMENT_INVALID => $this->isAmazonPaymentInvalid($quoteTransfer),
226
        ];
227
    }
228
229
    /**
230
     * @param \Generated\Shared\Transfer\ShipmentMethodsTransfer $shipmentMethods
231
     *
232
     * @return \ArrayObject
233
     */
234
    protected function getAvailableCarriers(ShipmentMethodsTransfer $shipmentMethods)
235
    {
236
        $carriersIds = [];
237
        $carriers = new ArrayObject();
238
239
        foreach ($shipmentMethods->getMethods() as $shipmentMethodTransfer) {
240
            if (!in_array($shipmentMethodTransfer->getFkShipmentCarrier(), $carriersIds)) {
241
                $carriersIds[]= $shipmentMethodTransfer->getFkShipmentCarrier();
242
                $carrier = new ShipmentCarrierTransfer();
243
                $carrier->setName($shipmentMethodTransfer->getCarrierName());
244
                $carrier->setIdShipmentCarrier($shipmentMethodTransfer->getFkShipmentCarrier());
245
                $carriers->append($carrier);
246
            }
247
        }
248
249
        return $carriers;
250
    }
251
252
    /**
253
     * @param \Symfony\Component\HttpFoundation\Request $request
254
     *
255
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
256
     */
257
    public function updateShipmentMethodAction(Request $request)
258
    {
259
        $response = $this->executeShipmentMethodAction($request);
260
261
        if (!is_array($response)) {
0 ignored issues
show
introduced by
The condition is_array($response) is always false.
Loading history...
262
            return $response;
263
        }
264
265
        return $this->view($response, [], '@AmazonPay/views/shipment-method/shipment-method.twig');
266
    }
267
268
    /**
269
     * @param \Symfony\Component\HttpFoundation\Request $request
270
     *
271
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
272
     */
273
    protected function executeShipmentMethodAction(Request $request)
274
    {
275
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
276
277
        if (!$this->isAmazonPayment($quoteTransfer)) {
278
            $this->addAmazonPayErrorFromQuote($quoteTransfer);
279
280
            return $this->buildRedirectInternalResponse();
281
        }
282
283
        $quoteTransfer->getShipment()->setShipmentSelection(
284
            $request->request->get(static::URL_PARAM_SHIPMENT_METHOD_ID)
285
        );
286
        $quoteTransfer = $this->getClient()
287
            ->addSelectedShipmentMethodToQuote($quoteTransfer);
288
        $quoteTransfer = $this->getFactory()
289
            ->getCalculationClient()->recalculate($quoteTransfer);
290
        $this->saveQuote($quoteTransfer);
291
292
        return [
293
            static::QUOTE_TRANSFER => $quoteTransfer,
294
        ];
295
    }
296
297
    /**
298
     * @param \Symfony\Component\HttpFoundation\Request $request
299
     *
300
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
301
     */
302
    public function successAction(Request $request)
303
    {
304
        $response = $this->executeSuccessAction($request);
305
306
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
307
308
        if ($quoteTransfer->getTotals() === null) {
309
            return $this->view($response, [], '@AmazonPay/views/success/success.twig');
310
        }
311
312
        $checkoutResponseTransfer = $this->getFactory()->getCheckoutClient()->placeOrder($quoteTransfer);
313
314
        if (!$checkoutResponseTransfer->getIsSuccess()) {
315
            return $this->redirectToAmazonCheckoutPage($quoteTransfer);
316
        }
317
318
        $quoteTransfer = $this->getClient()->authorizeOrder($quoteTransfer);
319
320
        if ($this->isAuthorizationExpired($quoteTransfer)) {
321
            $quoteTransfer = $this->reauthorizeOrder($quoteTransfer);
322
        }
323
324
        $this->saveQuote($quoteTransfer);
325
326
        $authorizationStatusTransfer = $this->getAuthorizationTransfer($quoteTransfer);
327
328
        if ($this->isAuthorizationFailed($authorizationStatusTransfer)) {
329
            return $this->redirectResponseInternal(AmazonPayControllerProvider::PAYMENT_FAILED);
330
        }
331
332
        if (!$this->isAuthSucceeded($authorizationStatusTransfer) || $checkoutResponseTransfer->getIsSuccess() === false) {
333
            return $this->redirectToAmazonCheckoutPage($quoteTransfer);
334
        }
335
336
        $this->getFactory()->getCustomerClient()->markCustomerAsDirty();
337
        $this->getFactory()->getCartClient()->clearQuote();
338
339
        return $this->view($response, [], '@AmazonPay/views/success/success.twig');
340
    }
341
342
    /**
343
     * @param \Symfony\Component\HttpFoundation\Request $request
344
     *
345
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
346
     */
347
    protected function executeSuccessAction(Request $request)
348
    {
349
        return [
350
            static::IS_ASYNCHRONOUS => $this->isAsynchronous(),
351
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
352
        ];
353
    }
354
355
    /**
356
     * @param \Symfony\Component\HttpFoundation\Request $request
357
     *
358
     * @return \Symfony\Component\HttpFoundation\Response
359
     */
360
    public function paymentFailedAction(Request $request): Response
361
    {
362
        $this->getFactory()->getMessengerClient()->addErrorMessage(static::ERROR_AMAZONPAY_PAYMENT_FAILED);
363
364
        $this->clearAmazonpayQuoteData();
365
366
        return $this->buildRedirectInternalResponse();
367
    }
368
369
    /**
370
     * @param \Symfony\Component\HttpFoundation\Request $request
371
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
372
     *
373
     * @return void
374
     */
375
    protected function storeAmazonPaymentIntoQuote(Request $request, QuoteTransfer $quoteTransfer)
376
    {
377
        $amazonPaymentTransfer = $this->buildAmazonPaymentTransfer($request, $quoteTransfer);
378
379
        $quoteTransfer->setAmazonpayPayment($amazonPaymentTransfer);
380
        $quoteTransfer = $this->getClient()
381
            ->handleCartWithAmazonPay($quoteTransfer);
382
        $this->saveQuote($quoteTransfer);
383
    }
384
385
    /**
386
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
387
     *
388
     * @return void
389
     */
390
    protected function saveQuote(QuoteTransfer $quoteTransfer)
391
    {
392
        $this->getFactory()
393
            ->getQuoteClient()
394
            ->setQuote($quoteTransfer);
395
    }
396
397
    /**
398
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
399
     *
400
     * @return int|null
401
     */
402
    protected function getCurrentShipmentMethodId(QuoteTransfer $quoteTransfer)
403
    {
404
        if ($quoteTransfer->getShipment() === null || $quoteTransfer->getShipment()->getMethod() === null) {
405
            return null;
406
        }
407
408
        return $quoteTransfer->getShipment()->getMethod()->getIdShipmentMethod();
409
    }
410
411
    /**
412
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
413
     *
414
     * @return \ArrayObject|\Generated\Shared\Transfer\ItemTransfer[]
415
     */
416
    protected function getCartItems(QuoteTransfer $quoteTransfer)
417
    {
418
        return $quoteTransfer->getItems();
419
    }
420
421
    /**
422
     * @param \Symfony\Component\HttpFoundation\Request $request
423
     *
424
     * @return bool
425
     */
426
    protected function isRequestComplete(Request $request)
427
    {
428
        return (
429
            $request->query->get(static::URL_PARAM_REFERENCE_ID) !== null &&
430
            $request->query->get(static::URL_PARAM_ACCESS_TOKEN) !== null
431
        );
432
    }
433
434
    /**
435
     * @param \Symfony\Component\HttpFoundation\Request $request
436
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
437
     *
438
     * @return \Generated\Shared\Transfer\AmazonpayPaymentTransfer
439
     */
440
    protected function buildAmazonPaymentTransfer(Request $request, QuoteTransfer $quoteTransfer)
441
    {
442
        $amazonPaymentTransfer = $quoteTransfer->getAmazonpayPayment() ?: new AmazonpayPaymentTransfer();
443
444
        $amazonPaymentTransfer->setOrderReferenceId($request->query->get(static::URL_PARAM_REFERENCE_ID));
445
        $amazonPaymentTransfer->setAddressConsentToken($request->query->get(static::URL_PARAM_ACCESS_TOKEN));
446
        $amazonPaymentTransfer->setFailureMFARedirectUrl($this->getApplication()->url(AmazonPayControllerProvider::CHECKOUT, [
447
            static::URL_PARAM_REFERENCE_ID => $request->query->get(static::URL_PARAM_REFERENCE_ID),
448
            static::URL_PARAM_ACCESS_TOKEN => $request->query->get(static::URL_PARAM_ACCESS_TOKEN),
449
        ]));
450
        $amazonPaymentTransfer->setSuccessMFARedirectUrl($this->getApplication()->url(AmazonPayControllerProvider::SUCCESS));
451
452
        return $amazonPaymentTransfer;
453
    }
454
455
    /**
456
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
457
     *
458
     * @return bool
459
     */
460
    protected function isAllowedCheckout(QuoteTransfer $quoteTransfer)
461
    {
462
        return $quoteTransfer->getTotals() !== null;
463
    }
464
465
    /**
466
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
467
     *
468
     * @return bool
469
     */
470
    protected function isLogoutRedirect(QuoteTransfer $quoteTransfer)
471
    {
472
        if ($this->isAmazonPaymentInvalid($quoteTransfer)) {
473
            return false;
474
        }
475
476
        if ($this->getAmazonPayConfig()->getCaptureNow() &&
477
            $quoteTransfer->getAmazonpayPayment() !== null
478
            && $quoteTransfer->getAmazonpayPayment()->getResponseHeader() !== null
479
            && !$quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsSuccess()
480
        ) {
481
            return true;
482
        }
483
484
        return false;
485
    }
486
487
    /**
488
     * @param \Symfony\Component\HttpFoundation\Request $request
489
     *
490
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
491
     */
492
    protected function buildRedirectExternalResponse(Request $request)
493
    {
494
        if ($request->headers->get('Referer') === null) {
0 ignored issues
show
introduced by
The condition $request->headers->get('Referer') === null is always false.
Loading history...
495
            return $this->buildRedirectInternalResponse();
496
        }
497
498
        return $this->redirectResponseExternal($request->headers->get('Referer'));
499
    }
500
501
    /**
502
     * @param \Generated\Shared\Transfer\CheckoutResponseTransfer $checkoutResponseTransfer
503
     *
504
     * @return void
505
     */
506
    protected function setCheckoutErrorMessages(CheckoutResponseTransfer $checkoutResponseTransfer)
507
    {
508
        foreach ($checkoutResponseTransfer->getErrors() as $checkoutErrorTransfer) {
509
            $this->addErrorMessage(
510
                $this->translateCheckoutErrorMessage($checkoutErrorTransfer)
511
            );
512
        }
513
    }
514
515
    /**
516
     * @param \Generated\Shared\Transfer\CheckoutErrorTransfer $checkoutErrorTransfer
517
     *
518
     * @return string
519
     */
520
    protected function translateCheckoutErrorMessage(CheckoutErrorTransfer $checkoutErrorTransfer): string
521
    {
522
        $checkoutErrorMessage = $checkoutErrorTransfer->getMessage();
523
524
        return $this->getFactory()->getGlossaryStorageClient()->translate(
525
            $checkoutErrorMessage,
526
            $this->getLocale(),
527
            $checkoutErrorTransfer->getParameters()
528
        ) ?: $checkoutErrorMessage;
529
    }
530
531
    /**
532
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
533
     *
534
     * @return void
535
     */
536
    protected function addAmazonPayErrorFromQuote(QuoteTransfer $quoteTransfer)
537
    {
538
        if ($quoteTransfer->getAmazonpayPayment() === null
539
            || $quoteTransfer->getAmazonpayPayment()->getResponseHeader() === null
540
            || $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage() === null) {
541
            return;
542
        }
543
544
        $this->addErrorMessage(
545
            $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage()
546
        );
547
    }
548
549
    /**
550
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
551
     *
552
     * @return bool
553
     */
554
    protected function isAmazonPayment(QuoteTransfer $quoteTransfer)
555
    {
556
        return $quoteTransfer->getAmazonpayPayment() !== null;
557
    }
558
559
    /**
560
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
561
     */
562
    protected function buildRedirectInternalResponse()
563
    {
564
        return $this->redirectResponseInternal($this->getPaymentRejectRoute());
565
    }
566
567
    /**
568
     * @return string
569
     */
570
    protected function getPaymentRejectRoute()
571
    {
572
        return Config::get(AmazonPayConstants::PAYMENT_REJECT_ROUTE);
573
    }
574
575
    /**
576
     * @return bool
577
     */
578
    protected function isAsynchronous()
579
    {
580
        return $this->getAmazonPayConfig()->getAuthTransactionTimeout() > 0
581
            && !$this->getAmazonPayConfig()->getCaptureNow();
582
    }
583
584
    /**
585
     * @return \SprykerEco\Shared\AmazonPay\AmazonPayConfigInterface
586
     */
587
    protected function getAmazonPayConfig()
588
    {
589
        return $this->getFactory()->createAmazonPayConfig();
590
    }
591
592
    /**
593
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
594
     *
595
     * @return bool
596
     */
597
    protected function isAmazonPaymentInvalid(QuoteTransfer $quoteTransfer)
598
    {
599
        if ($quoteTransfer->getAmazonpayPayment()->getResponseHeader() !== null
600
            && $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsInvalidPaymentMethod()) {
601
            return true;
602
        }
603
604
        return false;
605
    }
606
607
    /**
608
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
609
     *
610
     * @return string|null
611
     */
612
    protected function getAmazonPaymentOrderReferenceId(QuoteTransfer $quoteTransfer)
613
    {
614
        if ($quoteTransfer->getAmazonpayPayment() !== null && $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId() !== null) {
615
            return $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId();
616
        }
617
618
        return null;
619
    }
620
621
    /**
622
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
623
     *
624
     * @return array
625
     */
626
    protected function preparePSD2Data(QuoteTransfer $quoteTransfer): array
627
    {
628
        return [
629
            static::PSD2_DATA_KEY_AJAX_ENDPOINT => $this->getApplication()->path(AmazonPayControllerProvider::CONFIRM_PURCHASE),
0 ignored issues
show
Bug introduced by
The method path() does not exist on Spryker\Service\Container\ContainerInterface. It seems like you code against a sub-type of Spryker\Service\Container\ContainerInterface such as Silex\Tests\Application\UrlGeneratorApplication or Spryker\Shared\Kernel\Communication\Application. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

629
            static::PSD2_DATA_KEY_AJAX_ENDPOINT => $this->getApplication()->/** @scrutinizer ignore-call */ path(AmazonPayControllerProvider::CONFIRM_PURCHASE),
Loading history...
630
            static::PSD2_DATA_KEY_SELLER_ID => $this->getAmazonPayConfig()->getSellerId(),
631
            static::PSD2_DATA_KEY_AMAZON_ORDER_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
632
            static::PSD2_DATA_KEY_AMAZON_FAILURE_URL => $this->getApplication()->path(AmazonPayControllerProvider::PAYMENT_FAILED),
633
        ];
634
    }
635
636
    /**
637
     * @return void
638
     */
639
    protected function clearAmazonpayQuoteData(): void
640
    {
641
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
642
643
        $amazonpayPaymentTransfer = new AmazonpayPaymentTransfer();
644
645
        $quoteTransfer->setAmazonpayPayment($amazonpayPaymentTransfer);
646
647
        $this->getFactory()->getQuoteClient()->setQuote($quoteTransfer);
648
    }
649
650
    /**
651
     * @param \Generated\Shared\Transfer\AmazonpayStatusTransfer $amazonpayStatusTransfer
652
     *
653
     * @return bool
654
     */
655
    protected function isAuthSucceeded(AmazonpayStatusTransfer $amazonpayStatusTransfer): bool
656
    {
657
        return in_array($amazonpayStatusTransfer->getState(), [
658
            AmazonPayConfig::STATUS_OPEN,
659
            AmazonPayConfig::STATUS_PENDING,
660
            AmazonPayConfig::STATUS_CLOSED,
661
        ]);
662
    }
663
664
    /**
665
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
666
     *
667
     * @return bool
668
     */
669
    protected function isOrderStatusOpen(QuoteTransfer $quoteTransfer): bool
670
    {
671
        return $quoteTransfer->getAmazonpayPayment()->getOrderReferenceStatus()->getState() === AmazonPayConfig::STATUS_OPEN;
672
    }
673
674
    /**
675
     * @param array $payload
676
     * @param int $statusCode
677
     *
678
     * @return \Symfony\Component\HttpFoundation\JsonResponse
679
     */
680
    protected function createJsonResponse(array $payload, int $statusCode = 200): JsonResponse
681
    {
682
        return new JsonResponse($payload, $statusCode);
683
    }
684
685
    /**
686
     * @param \Generated\Shared\Transfer\AmazonpayStatusTransfer $amazonpayStatusTransfer
687
     *
688
     * @return bool
689
     */
690
    protected function isAuthorizationFailed(AmazonpayStatusTransfer $amazonpayStatusTransfer): bool
691
    {
692
        return in_array($amazonpayStatusTransfer->getState(), [
693
            AmazonPayConfig::STATUS_TRANSACTION_TIMED_OUT,
694
            AmazonPayConfig::STATUS_DECLINED,
695
        ]);
696
    }
697
698
    /**
699
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
700
     *
701
     * @return bool
702
     */
703
    protected function isAuthorizationExpired(QuoteTransfer $quoteTransfer): bool
704
    {
705
        $authorizationStatusTransfer = $this->getAuthorizationTransfer($quoteTransfer);
706
707
        return $authorizationStatusTransfer->getState() === AmazonPayConfig::STATUS_TRANSACTION_TIMED_OUT
708
        && $authorizationStatusTransfer->getReasonCode() === AmazonPayConfig::REASON_CODE_TRANSACTION_TIMED_OUT
709
        && !$this->getAmazonPayConfig()->getCaptureNow();
710
    }
711
712
    /**
713
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
714
     *
715
     * @return \Generated\Shared\Transfer\QuoteTransfer
716
     */
717
    protected function reauthorizeOrder(QuoteTransfer $quoteTransfer): QuoteTransfer
718
    {
719
        $quoteTransfer->getAmazonpayPayment()->setIsReauthorizingAsync(true);
720
721
        return $this->getClient()->authorizeOrder($quoteTransfer);
722
    }
723
724
    /**
725
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
726
     *
727
     * @return \Generated\Shared\Transfer\AmazonpayStatusTransfer
728
     */
729
    protected function getAuthorizationTransfer(QuoteTransfer $quoteTransfer): AmazonpayStatusTransfer
730
    {
731
        return $quoteTransfer
732
            ->getAmazonpayPayment()
733
            ->getAuthorizationDetails()
734
            ->getAuthorizationStatus();
735
    }
736
737
    /**
738
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
739
     *
740
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
741
     */
742
    protected function redirectToAmazonCheckoutPage(QuoteTransfer $quoteTransfer): RedirectResponse
743
    {
744
        return $this->redirectResponseInternal(AmazonPayControllerProvider::CHECKOUT, [
745
            static::URL_PARAM_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
746
            static::URL_PARAM_ACCESS_TOKEN => $quoteTransfer->getAmazonpayPayment()->getAddressConsentToken(),
747
        ]);
748
    }
749
}
750