PaymentController   F
last analyzed

Complexity

Total Complexity 84

Size/Duplication

Total Lines 707
Duplicated Lines 0 %

Importance

Changes 7
Bugs 0 Features 0
Metric Value
eloc 237
c 7
b 0
f 0
dl 0
loc 707
rs 2
wmc 84

41 Methods

Rating   Name   Duplication   Size   Complexity  
A setOrderReferenceAction() 0 18 2
A getShipmentMethodsAction() 0 9 2
A confirmPurchaseAction() 0 29 4
A executeCheckoutAction() 0 31 5
A checkoutAction() 0 9 2
A clearAmazonpayQuoteData() 0 9 1
A buildRedirectInternalResponse() 0 3 1
A isAuthSucceeded() 0 6 1
A isAuthorizationExpired() 0 7 3
A paymentFailedAction() 0 7 1
A isAuthorizationFailed() 0 5 1
A getAuthorizationTransfer() 0 6 1
A getPaymentRejectRoute() 0 3 1
A isAmazonPaymentInvalid() 0 8 3
A redirectToAmazonCheckoutPage() 0 5 1
B successAction() 0 38 7
A executeSuccessAction() 0 5 1
A preparePSD2Data() 0 7 1
A executeShipmentMethodsAction() 0 25 2
A storeAmazonPaymentIntoQuote() 0 8 1
A isOrderStatusOpen() 0 3 1
A isAmazonPayment() 0 3 1
A isRequestComplete() 0 5 2
A updateShipmentMethodAction() 0 9 2
A translateCheckoutErrorMessage() 0 9 2
A getAmazonPaymentOrderReferenceId() 0 7 3
A getAmazonPayConfig() 0 3 1
A addAmazonPayErrorFromQuote() 0 10 4
A isAsynchronous() 0 4 2
A getCurrentShipmentMethodId() 0 7 3
A createJsonResponse() 0 3 1
A buildAmazonPaymentTransfer() 0 13 2
A executeShipmentMethodAction() 0 21 2
A isLogoutRedirect() 0 15 6
A buildRedirectExternalResponse() 0 7 2
A getAvailableCarriers() 0 16 3
A setCheckoutErrorMessages() 0 5 2
A reauthorizeOrder() 0 5 1
A isAllowedCheckout() 0 3 1
A getCartItems() 0 3 1
A saveQuote() 0 5 1

How to fix   Complexity   

Complex Class

Complex classes like PaymentController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use PaymentController, and based on these observations, apply Extract Interface, too.

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

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