Completed
Pull Request — master (#29)
by Volodymyr
07:21 queued 03:42
created

PaymentController::successAction()   B

Complexity

Conditions 9
Paths 7

Size

Total Lines 45
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 9
eloc 26
c 1
b 0
f 0
nc 7
nop 1
dl 0
loc 45
rs 8.0555
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 Generated\Shared\Transfer\AmazonpayPaymentTransfer;
1 ignored issue
show
Bug introduced by
The type Generated\Shared\Transfer\AmazonpayPaymentTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
11
use Generated\Shared\Transfer\CheckoutErrorTransfer;
1 ignored issue
show
Bug introduced by
The type Generated\Shared\Transfer\CheckoutErrorTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
12
use Generated\Shared\Transfer\CheckoutResponseTransfer;
1 ignored issue
show
Bug introduced by
The type Generated\Shared\Transfer\CheckoutResponseTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
13
use Generated\Shared\Transfer\QuoteTransfer;
1 ignored issue
show
Bug introduced by
The type Generated\Shared\Transfer\QuoteTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
14
use Spryker\Shared\Config\Config;
15
use Spryker\Yves\Kernel\Controller\AbstractController;
16
use SprykerEco\Shared\AmazonPay\AmazonPayConfig;
17
use SprykerEco\Shared\AmazonPay\AmazonPayConstants;
18
use SprykerEco\Yves\AmazonPay\Plugin\Provider\AmazonPayControllerProvider;
19
use Symfony\Component\HttpFoundation\JsonResponse;
20
use Symfony\Component\HttpFoundation\Request;
21
use Symfony\Component\HttpFoundation\Response;
22
23
/**
24
 * @method \SprykerEco\Client\AmazonPay\AmazonPayClientInterface getClient()
25
 * @method \SprykerEco\Yves\AmazonPay\AmazonPayFactory getFactory()
26
 */
27
class PaymentController extends AbstractController
28
{
29
    public const URL_PARAM_REFERENCE_ID = 'reference_id';
30
    public const URL_PARAM_SELLER_ID = 'seller_id';
31
    public const URL_PARAM_ACCESS_TOKEN = 'access_token';
32
    public const URL_PARAM_SHIPMENT_METHOD_ID = 'shipment_method_id';
33
    public const QUOTE_TRANSFER = 'quoteTransfer';
34
    public const SHIPMENT_METHODS = 'shipmentMethods';
35
    public const SELECTED_SHIPMENT_METHOD_ID = 'selectedShipmentMethodId';
36
    public const AMAZONPAY_CONFIG = 'amazonpayConfig';
37
    public const IS_ASYNCHRONOUS = 'isAsynchronous';
38
    public const CART_ITEMS = 'cartItems';
39
    public const SUCCESS = 'success';
40
    public const ERROR_AMAZONPAY_PAYMENT_FAILED = 'amazonpay.payment.failed';
41
    public const IS_AMAZON_PAYMENT_INVALID = 'isAmazonPaymentInvalid';
42
    public const ADDRESS_BOOK_MODE = 'addressBookMode';
43
    public const ORDER_REFERENCE = 'orderReferenceId';
44
45
    public const PSD2_DATA = 'psd2Data';
46
    public const PSD2_DATA_KEY_AJAX_ENDPOINT = 'psd2AjaxEndpoint';
47
    public const PSD2_DATA_KEY_SELLER_ID = 'amazonSellerId';
48
    public const PSD2_DATA_KEY_AMAZON_ORDER_REFERENCE_ID = 'amazonOrderReferenceId';
49
    public const PSD2_DATA_KEY_AMAZON_FAILURE_URL = 'amazonFailureUrl';
50
51
    /**
52
     * @param \Symfony\Component\HttpFoundation\Request $request
53
     *
54
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
55
     */
56
    public function checkoutAction(Request $request)
57
    {
58
        $response = $this->executeCheckoutAction($request);
59
60
        if (!is_array($response)) {
0 ignored issues
show
introduced by
The condition is_array($response) is always false.
Loading history...
61
            return $response;
62
        }
63
64
        return $this->view($response, [], '@AmazonPay/views/checkout/checkout.twig');
65
    }
66
67
    /**
68
     * @param \Symfony\Component\HttpFoundation\Request $request
69
     *
70
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
71
     */
72
    protected function executeCheckoutAction(Request $request)
73
    {
74
        $quoteTransfer = $this->getFactory()
75
            ->getQuoteClient()
76
            ->getQuote();
77
78
        if (!$this->isAllowedCheckout($quoteTransfer) || !$this->isRequestComplete($request)) {
79
            $this->addAmazonPayErrorFromQuote($quoteTransfer);
80
81
            return $this->buildRedirectInternalResponse();
82
        }
83
84
        $this->storeAmazonPaymentIntoQuote($request, $quoteTransfer);
85
86
        $data = [
87
            static::QUOTE_TRANSFER => $quoteTransfer,
88
            static::CART_ITEMS => $this->getCartItems($quoteTransfer),
89
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
90
            static::PSD2_DATA => $this->preparePSD2Data($quoteTransfer),
91
        ];
92
93
        if ($this->isAmazonPaymentInvalid($quoteTransfer)) {
94
            $data[static::ORDER_REFERENCE] = $this->getAmazonPaymentOrderReferenceId($quoteTransfer);
95
            $data[static::ADDRESS_BOOK_MODE] = AmazonPayConfig::DISPLAY_MODE_READONLY;
96
        }
97
98
        if ($quoteTransfer->getAmazonpayPayment()->getOrderReferenceStatus()) {
99
            $data[static::ADDRESS_BOOK_MODE] = AmazonPayConfig::DISPLAY_MODE_READONLY;
100
        }
101
102
        return $data;
103
    }
104
105
    /**
106
     * @param \Symfony\Component\HttpFoundation\Request $request
107
     *
108
     * @return \Symfony\Component\HttpFoundation\Response
109
     */
110
    public function setOrderReferenceAction(Request $request)
111
    {
112
        $quoteTransfer = $this->getFactory()
113
            ->getQuoteClient()
114
            ->getQuote();
115
116
        if (!$this->isAmazonPayment($quoteTransfer)) {
117
            return $this->buildRedirectInternalResponse();
118
        }
119
120
        $quoteTransfer->getAmazonpayPayment()
121
            ->setOrderReferenceId(
122
                $request->request->get(static::URL_PARAM_REFERENCE_ID)
123
            );
124
125
        $this->getFactory()->getQuoteClient()->setQuote($quoteTransfer);
126
127
        return new JsonResponse([static::SUCCESS => true]);
128
    }
129
130
    /**
131
     * @param \Symfony\Component\HttpFoundation\Request $request
132
     *
133
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
134
     */
135
    public function getShipmentMethodsAction(Request $request)
136
    {
137
        $response = $this->executeShipmentMethodsAction($request);
138
139
        if (!is_array($response)) {
0 ignored issues
show
introduced by
The condition is_array($response) is always false.
Loading history...
140
            return $response;
141
        }
142
143
        return $this->view($response, [], '@AmazonPay/views/get-shipment-methods/get-shipment-methods.twig');
144
    }
145
146
    /**
147
     * @param \Symfony\Component\HttpFoundation\Request $request
148
     *
149
     * @return \Symfony\Component\HttpFoundation\Response
150
     */
151
    public function confirmPurchaseAction(Request $request): Response
1 ignored issue
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

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

151
    public function confirmPurchaseAction(/** @scrutinizer ignore-unused */ Request $request): Response

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
152
    {
153
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
154
        $quoteTransfer = $this->getClient()->confirmPurchase($quoteTransfer);
155
156
        $amazonpayPaymentTransfer = $quoteTransfer->getAmazonpayPayment();
157
158
159
        if (!$amazonpayPaymentTransfer->getResponseHeader()->getIsSuccess() &&
160
            $amazonpayPaymentTransfer->getResponseHeader()->getConstraints()->count()) {
161
162
            $this->addErrorMessage($amazonpayPaymentTransfer->getResponseHeader()->getErrorMessage());
163
164
            return new JsonResponse([
165
                'success' => false,
166
                'url' => $this->getApplication()->url(AmazonPayControllerProvider::CHECKOUT, [
167
                    static::URL_PARAM_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
168
                    static::URL_PARAM_ACCESS_TOKEN => $quoteTransfer->getAmazonpayPayment()->getAddressConsentToken(),
169
                ])
170
            ], 302);
171
        }
172
173
        $this->saveQuoteIntoSession($quoteTransfer);
174
175
        if (!$quoteTransfer->getAmazonpayPayment()->getOrderReferenceStatus()->getState() === AmazonPayConfig::STATUS_OPEN) {
0 ignored issues
show
introduced by
The condition ! $quoteTransfer->getAma...nPayConfig::STATUS_OPEN is always false.
Loading history...
176
            return new JsonResponse([
177
                'success' => false,
178
            ], 400);
179
        }
180
181
        return new JsonResponse([
182
            'success' => true,
183
        ]);
184
    }
185
186
    /**
187
     * @param \Symfony\Component\HttpFoundation\Request $request
188
     *
189
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
190
     */
191
    protected function executeShipmentMethodsAction(Request $request)
1 ignored issue
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

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

191
    protected function executeShipmentMethodsAction(/** @scrutinizer ignore-unused */ Request $request)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
192
    {
193
        $quoteTransfer = $this->getFactory()
194
            ->getQuoteClient()
195
            ->getQuote();
196
197
        if (!$this->isAmazonPayment($quoteTransfer)) {
198
            $this->addAmazonPayErrorFromQuote($quoteTransfer);
199
200
            return $this->buildRedirectInternalResponse();
201
        }
202
203
        $quoteTransfer = $this->getClient()
204
            ->addSelectedAddressToQuote($quoteTransfer);
205
        $this->saveQuoteIntoSession($quoteTransfer);
206
        $shipmentMethods = $this->getFactory()
207
            ->getShipmentClient()
208
            ->getAvailableMethods($quoteTransfer);
209
210
        return [
211
            static::SELECTED_SHIPMENT_METHOD_ID => $this->getCurrentShipmentMethodId($quoteTransfer),
212
            static::SHIPMENT_METHODS => $shipmentMethods->getMethods(),
213
            static::IS_AMAZON_PAYMENT_INVALID => $this->isAmazonPaymentInvalid($quoteTransfer),
214
        ];
215
    }
216
217
    /**
218
     * @param \Symfony\Component\HttpFoundation\Request $request
219
     *
220
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
221
     */
222
    public function updateShipmentMethodAction(Request $request)
223
    {
224
        $response = $this->executeShipmentMethodAction($request);
225
226
        if (!is_array($response)) {
0 ignored issues
show
introduced by
The condition is_array($response) is always false.
Loading history...
227
            return $response;
228
        }
229
230
        return $this->view($response, [], '@AmazonPay/views/shipment-method/shipment-method.twig');
231
    }
232
233
    /**
234
     * @param \Symfony\Component\HttpFoundation\Request $request
235
     *
236
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
237
     */
238
    protected function executeShipmentMethodAction(Request $request)
239
    {
240
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
241
242
        if (!$this->isAmazonPayment($quoteTransfer)) {
243
            $this->addAmazonPayErrorFromQuote($quoteTransfer);
244
245
            return $this->buildRedirectInternalResponse();
246
        }
247
248
        $quoteTransfer->getShipment()->setShipmentSelection(
249
            $request->request->get(static::URL_PARAM_SHIPMENT_METHOD_ID)
250
        );
251
        $quoteTransfer = $this->getClient()
252
            ->addSelectedShipmentMethodToQuote($quoteTransfer);
253
        $quoteTransfer = $this->getFactory()
254
            ->getCalculationClient()->recalculate($quoteTransfer);
255
        $this->saveQuoteIntoSession($quoteTransfer);
256
257
        return [
258
            static::QUOTE_TRANSFER => $quoteTransfer,
259
        ];
260
    }
261
262
    /**
263
     * @param \Symfony\Component\HttpFoundation\Request $request
264
     *
265
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
266
     */
267
    public function successAction(Request $request)
268
    {
269
        $response = $this->executeSuccessAction($request);
270
271
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
272
273
        $checkoutResponseTransfer = $this->getFactory()->getCheckoutClient()->placeOrder($quoteTransfer);
274
275
        if (!$checkoutResponseTransfer->getIsSuccess()) {
276
            return $this->redirectResponseInternal(AmazonPayControllerProvider::CHECKOUT, [
277
                static::URL_PARAM_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
278
                static::URL_PARAM_ACCESS_TOKEN => $quoteTransfer->getAmazonpayPayment()->getAddressConsentToken(),
279
            ]);
280
        }
281
282
        $quoteTransfer = $this->getClient()->authorizeOrder($quoteTransfer);
283
284
        $this->saveQuoteIntoSession($quoteTransfer);
285
286
        $state = $quoteTransfer->getAmazonpayPayment()->getAuthorizationDetails()->getAuthorizationStatus()->getState();
287
        $reasonCode = $quoteTransfer->getAmazonpayPayment()->getAuthorizationDetails()->getAuthorizationStatus()->getReasonCode();
288
289
        if ($state === AmazonPayConfig::STATUS_TRANSACTION_TIMED_OUT
290
            && $reasonCode === AmazonPayConfig::REASON_CODE_TRANSACTION_TIMED_OUT
291
            && !$this->getAmazonPayConfig()->getCaptureNow()) {
292
            $quoteTransfer->getAmazonpayPayment()->setReauthorizingAsync(true);
293
            $quoteTransfer = $this->getClient()->authorizeOrder($quoteTransfer);
294
            $state = $quoteTransfer->getAmazonpayPayment()->getAuthorizationDetails()->getAuthorizationStatus()->getState();
295
        }
296
297
        if ($state === AmazonPayConfig::STATUS_TRANSACTION_TIMED_OUT || $state === AmazonPayConfig::STATUS_DECLINED) {
298
            return $this->redirectResponseInternal(AmazonPayControllerProvider::PAYMENT_FAILED);
299
        }
300
301
        if (!$this->isAuthSucceeded($state) || $checkoutResponseTransfer->getIsSuccess() === false) {
302
            return $this->redirectResponseInternal(AmazonPayControllerProvider::CHECKOUT, [
303
                static::URL_PARAM_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
304
                static::URL_PARAM_ACCESS_TOKEN => $quoteTransfer->getAmazonpayPayment()->getAddressConsentToken(),
305
            ]);
306
        }
307
308
        $this->getFactory()->getCustomerClient()->markCustomerAsDirty();
309
        $this->getFactory()->getCartClient()->clearQuote();
310
311
        return $this->view($response, [], '@AmazonPay/views/success/success.twig');
312
    }
313
314
    /**
315
     * @param \Symfony\Component\HttpFoundation\Request $request
316
     *
317
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
318
     */
319
    protected function executeSuccessAction(Request $request)
1 ignored issue
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

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

319
    protected function executeSuccessAction(/** @scrutinizer ignore-unused */ Request $request)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
320
    {
321
        return [
322
            static::IS_ASYNCHRONOUS => $this->isAsynchronous(),
323
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
324
        ];
325
    }
326
327
    /**
328
     * @param \Symfony\Component\HttpFoundation\Request $request
329
     *
330
     * @return \Symfony\Component\HttpFoundation\Response
331
     */
332
    public function paymentFailedAction(Request $request): Response
1 ignored issue
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

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

332
    public function paymentFailedAction(/** @scrutinizer ignore-unused */ Request $request): Response

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
333
    {
334
        $this->getFactory()->getMessengerClient()->addErrorMessage(static::ERROR_AMAZONPAY_PAYMENT_FAILED);
335
336
        $this->clearAmazonpayQuoteData();
337
338
        return $this->buildRedirectInternalResponse();
339
    }
340
341
    /**
342
     * @param \Symfony\Component\HttpFoundation\Request $request
343
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
344
     *
345
     * @return void
346
     */
347
    protected function storeAmazonPaymentIntoQuote(Request $request, QuoteTransfer $quoteTransfer)
348
    {
349
        $amazonPaymentTransfer = $this->buildAmazonPaymentTransfer($request, $quoteTransfer);
350
351
        $quoteTransfer->setAmazonpayPayment($amazonPaymentTransfer);
352
        $quoteTransfer = $this->getClient()
353
            ->handleCartWithAmazonPay($quoteTransfer);
354
        $this->saveQuoteIntoSession($quoteTransfer);
355
    }
356
357
    /**
358
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
359
     *
360
     * @return void
361
     */
362
    protected function saveQuoteIntoSession(QuoteTransfer $quoteTransfer)
363
    {
364
        $this->getFactory()
365
            ->getQuoteClient()
366
            ->setQuote($quoteTransfer);
367
    }
368
369
    /**
370
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
371
     *
372
     * @return int|null
373
     */
374
    protected function getCurrentShipmentMethodId(QuoteTransfer $quoteTransfer)
375
    {
376
        if ($quoteTransfer->getShipment() === null || $quoteTransfer->getShipment()->getMethod() === null) {
377
            return null;
378
        }
379
380
        return $quoteTransfer->getShipment()->getMethod()->getIdShipmentMethod();
381
    }
382
383
    /**
384
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
385
     *
386
     * @return \ArrayObject|\Generated\Shared\Transfer\ItemTransfer[]
387
     */
388
    protected function getCartItems(QuoteTransfer $quoteTransfer)
389
    {
390
        return $quoteTransfer->getItems();
391
    }
392
393
    /**
394
     * @param \Symfony\Component\HttpFoundation\Request $request
395
     *
396
     * @return bool
397
     */
398
    protected function isRequestComplete(Request $request)
399
    {
400
        return (
401
            $request->query->get(static::URL_PARAM_REFERENCE_ID) !== null &&
402
            $request->query->get(static::URL_PARAM_ACCESS_TOKEN) !== null
403
        );
404
    }
405
406
    /**
407
     * @param \Symfony\Component\HttpFoundation\Request $request
408
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
409
     *
410
     * @return \Generated\Shared\Transfer\AmazonpayPaymentTransfer
411
     */
412
    protected function buildAmazonPaymentTransfer(Request $request, QuoteTransfer $quoteTransfer)
413
    {
414
        $amazonPaymentTransfer = $quoteTransfer->getAmazonpayPayment() ?: new AmazonpayPaymentTransfer();
415
416
        $amazonPaymentTransfer->setOrderReferenceId($request->query->get(static::URL_PARAM_REFERENCE_ID));
417
        $amazonPaymentTransfer->setAddressConsentToken($request->query->get(static::URL_PARAM_ACCESS_TOKEN));
418
        $amazonPaymentTransfer->setFailureMFARedirectUrl($this->getApplication()->url(AmazonPayControllerProvider::CHECKOUT, [
419
            static::URL_PARAM_REFERENCE_ID => $request->query->get(static::URL_PARAM_REFERENCE_ID),
420
            static::URL_PARAM_ACCESS_TOKEN => $request->query->get(static::URL_PARAM_ACCESS_TOKEN),
421
        ]));
422
        $amazonPaymentTransfer->setSuccessMFARedirectUrl($this->getApplication()->url(AmazonPayControllerProvider::SUCCESS));
423
424
        return $amazonPaymentTransfer;
425
    }
426
427
    /**
428
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
429
     *
430
     * @return bool
431
     */
432
    protected function isAllowedCheckout(QuoteTransfer $quoteTransfer)
433
    {
434
        return $quoteTransfer->getTotals() !== null;
435
    }
436
437
    /**
438
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
439
     *
440
     * @return bool
441
     */
442
    protected function isLogoutRedirect(QuoteTransfer $quoteTransfer)
443
    {
444
        if ($this->isAmazonPaymentInvalid($quoteTransfer)) {
445
            return false;
446
        }
447
448
        if ($this->getAmazonPayConfig()->getCaptureNow() &&
449
            $quoteTransfer->getAmazonpayPayment() !== null
450
            && $quoteTransfer->getAmazonpayPayment()->getResponseHeader() !== null
451
            && !$quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsSuccess()
452
        ) {
453
            return true;
454
        }
455
456
        return false;
457
    }
458
459
    /**
460
     * @param \Symfony\Component\HttpFoundation\Request $request
461
     *
462
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
463
     */
464
    protected function buildRedirectExternalResponse(Request $request)
465
    {
466
        if ($request->headers->get('Referer') === null) {
0 ignored issues
show
introduced by
The condition $request->headers->get('Referer') === null is always false.
Loading history...
467
            return $this->buildRedirectInternalResponse();
468
        }
469
470
        return $this->redirectResponseExternal($request->headers->get('Referer'));
471
    }
472
473
    /**
474
     * @param \Generated\Shared\Transfer\CheckoutResponseTransfer $checkoutResponseTransfer
475
     *
476
     * @return void
477
     */
478
    protected function setCheckoutErrorMessages(CheckoutResponseTransfer $checkoutResponseTransfer)
479
    {
480
        foreach ($checkoutResponseTransfer->getErrors() as $checkoutErrorTransfer) {
481
            $this->addErrorMessage(
482
                $this->translateCheckoutErrorMessage($checkoutErrorTransfer)
483
            );
484
        }
485
    }
486
487
    /**
488
     * @param \Generated\Shared\Transfer\CheckoutErrorTransfer $checkoutErrorTransfer
489
     *
490
     * @return string
491
     */
492
    protected function translateCheckoutErrorMessage(CheckoutErrorTransfer $checkoutErrorTransfer): string
493
    {
494
        $checkoutErrorMessage = $checkoutErrorTransfer->getMessage();
495
496
        return $this->getFactory()->getGlossaryStorageClient()->translate(
497
            $checkoutErrorMessage,
498
            $this->getLocale(),
499
            $checkoutErrorTransfer->getParameters()
500
        ) ?: $checkoutErrorMessage;
501
    }
502
503
    /**
504
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
505
     *
506
     * @return void
507
     */
508
    protected function addAmazonPayErrorFromQuote(QuoteTransfer $quoteTransfer)
509
    {
510
        if ($quoteTransfer->getAmazonpayPayment() === null
511
            || $quoteTransfer->getAmazonpayPayment()->getResponseHeader() === null
512
            || $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage() === null) {
513
            return;
514
        }
515
516
        $this->addErrorMessage(
517
            $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage()
518
        );
519
    }
520
521
    /**
522
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
523
     *
524
     * @return bool
525
     */
526
    protected function isAmazonPayment(QuoteTransfer $quoteTransfer)
527
    {
528
        return $quoteTransfer->getAmazonpayPayment() !== null;
529
    }
530
531
    /**
532
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
533
     */
534
    protected function buildRedirectInternalResponse()
535
    {
536
        return $this->redirectResponseInternal($this->getPaymentRejectRoute());
537
    }
538
539
    /**
540
     * @return string
541
     */
542
    protected function getPaymentRejectRoute()
543
    {
544
        return Config::get(AmazonPayConstants::PAYMENT_REJECT_ROUTE);
545
    }
546
547
    /**
548
     * @return bool
549
     */
550
    protected function isAsynchronous()
551
    {
552
        return $this->getAmazonPayConfig()->getAuthTransactionTimeout() > 0
553
            && !$this->getAmazonPayConfig()->getCaptureNow();
554
    }
555
556
    /**
557
     * @return \SprykerEco\Shared\AmazonPay\AmazonPayConfigInterface
558
     */
559
    protected function getAmazonPayConfig()
560
    {
561
        return $this->getFactory()->createAmazonPayConfig();
562
    }
563
564
    /**
565
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
566
     *
567
     * @return bool
568
     */
569
    protected function isAmazonPaymentInvalid(QuoteTransfer $quoteTransfer)
570
    {
571
        if ($quoteTransfer->getAmazonpayPayment()->getResponseHeader() !== null
572
            && $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsInvalidPaymentMethod()) {
573
            return true;
574
        }
575
576
        return false;
577
    }
578
579
    /**
580
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
581
     *
582
     * @return string|null
583
     */
584
    protected function getAmazonPaymentOrderReferenceId(QuoteTransfer $quoteTransfer)
585
    {
586
        if ($quoteTransfer->getAmazonpayPayment() !== null && $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId() !== null) {
587
            return $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId();
588
        }
589
590
        return null;
591
    }
592
593
    /**
594
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
595
     *
596
     * @return array
597
     */
598
    protected function preparePSD2Data(QuoteTransfer $quoteTransfer): array
599
    {
600
        return [
601
            static::PSD2_DATA_KEY_AJAX_ENDPOINT => $this->getApplication()->path(AmazonPayControllerProvider::CONFIRM_PURCHASE),
602
            static::PSD2_DATA_KEY_SELLER_ID => $this->getAmazonPayConfig()->getSellerId(),
603
            static::PSD2_DATA_KEY_AMAZON_ORDER_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
604
            static::PSD2_DATA_KEY_AMAZON_FAILURE_URL => $this->getApplication()->path(AmazonPayControllerProvider::PAYMENT_FAILED),
605
        ];
606
    }
607
608
    /**
609
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
610
     *
611
     * @return void
612
     */
613
    protected function clearAmazonpayQuoteData(): void
614
    {
615
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
616
617
        $amazonpayPaymentTransfer = new AmazonpayPaymentTransfer();
618
619
        $quoteTransfer->setAmazonpayPayment($amazonpayPaymentTransfer);
620
621
        $this->getFactory()->getQuoteClient()->setQuote($quoteTransfer);
622
    }
623
624
    /**
625
     * @param string $state
626
     *
627
     * @return bool
628
     */
629
    protected function isAuthSucceeded(string $state): bool
630
    {
631
        return in_array($state, [
632
            AmazonPayConfig::STATUS_OPEN,
633
            AmazonPayConfig::STATUS_PENDING,
634
            AmazonPayConfig::STATUS_CLOSED
635
        ]);
636
    }
637
}
638