Passed
Push — feature/eco-2635-amazon-psd2-a... ( 13523e...9df05d )
by Volodymyr
03:56
created

PaymentController::successAction()   B

Complexity

Conditions 8
Paths 6

Size

Total Lines 38
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
eloc 22
nc 6
nop 1
dl 0
loc 38
rs 8.4444
c 1
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 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
        return $data;
99
    }
100
101
    /**
102
     * @param \Symfony\Component\HttpFoundation\Request $request
103
     *
104
     * @return \Symfony\Component\HttpFoundation\Response
105
     */
106
    public function setOrderReferenceAction(Request $request)
107
    {
108
        $quoteTransfer = $this->getFactory()
109
            ->getQuoteClient()
110
            ->getQuote();
111
112
        if (!$this->isAmazonPayment($quoteTransfer)) {
113
            return $this->buildRedirectInternalResponse();
114
        }
115
116
        $quoteTransfer->getAmazonpayPayment()
117
            ->setOrderReferenceId(
118
                $request->request->get(static::URL_PARAM_REFERENCE_ID)
119
            );
120
121
        $this->getFactory()->getQuoteClient()->setQuote($quoteTransfer);
122
123
        return new JsonResponse([static::SUCCESS => true]);
124
    }
125
126
    /**
127
     * @param \Symfony\Component\HttpFoundation\Request $request
128
     *
129
     * @return \Spryker\Yves\Kernel\View\View|\Symfony\Component\HttpFoundation\RedirectResponse
130
     */
131
    public function getShipmentMethodsAction(Request $request)
132
    {
133
        $response = $this->executeShipmentMethodsAction($request);
134
135
        if (!is_array($response)) {
0 ignored issues
show
introduced by
The condition is_array($response) is always false.
Loading history...
136
            return $response;
137
        }
138
139
        return $this->view($response, [], '@AmazonPay/views/get-shipment-methods/get-shipment-methods.twig');
140
    }
141
142
    /**
143
     * @param \Symfony\Component\HttpFoundation\Request $request
144
     *
145
     * @return \Symfony\Component\HttpFoundation\Response
146
     */
147
    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

147
    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...
148
    {
149
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
150
        $quoteTransfer = $this->getClient()->confirmPurchase($quoteTransfer);
151
152
        $amazonpayPaymentTransfer = $quoteTransfer->getAmazonpayPayment();
153
154
155
        if (!$amazonpayPaymentTransfer->getResponseHeader()->getIsSuccess() &&
156
            $amazonpayPaymentTransfer->getResponseHeader()->getConstraints()->count()) {
157
158
            $this->addErrorMessage($amazonpayPaymentTransfer->getResponseHeader()->getErrorMessage());
159
160
            return new JsonResponse([
161
                'success' => false,
162
                'url' => $this->getApplication()->url(AmazonPayControllerProvider::CHECKOUT, [
163
                    static::URL_PARAM_REFERENCE_ID => $quoteTransfer->getAmazonpayPayment()->getOrderReferenceId(),
164
                    static::URL_PARAM_ACCESS_TOKEN => $quoteTransfer->getAmazonpayPayment()->getAddressConsentToken(),
165
                ])
166
            ], 302);
167
        }
168
169
        $this->saveQuoteIntoSession($quoteTransfer);
170
171
        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...
172
            return new JsonResponse([
173
                'success' => false,
174
            ], 400);
175
        }
176
177
        return new JsonResponse([
178
            'success' => true,
179
        ]);
180
    }
181
182
    /**
183
     * @param \Symfony\Component\HttpFoundation\Request $request
184
     *
185
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
186
     */
187
    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

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

308
    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...
309
    {
310
        return [
311
            static::IS_ASYNCHRONOUS => $this->isAsynchronous(),
312
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
313
        ];
314
    }
315
316
    /**
317
     * @param \Symfony\Component\HttpFoundation\Request $request
318
     *
319
     * @return \Symfony\Component\HttpFoundation\Response
320
     */
321
    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

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