Completed
Pull Request — master (#23)
by Andrey
07:02
created

PaymentController::isAmazonPaymentInvalid()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 4
nc 2
nop 1
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Apache OSL-2
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace SprykerEco\Yves\AmazonPay\Controller;
9
10
use Generated\Shared\Transfer\AmazonpayPaymentTransfer;
11
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...
12
use Spryker\Shared\Config\Config;
13
use Spryker\Yves\Kernel\Controller\AbstractController;
14
use SprykerEco\Shared\AmazonPay\AmazonPayConstants;
15
use SprykerEco\Yves\AmazonPay\Plugin\Provider\AmazonPayControllerProvider;
16
use Symfony\Component\HttpFoundation\JsonResponse;
17
use Symfony\Component\HttpFoundation\Request;
18
19
/**
20
 * @method \SprykerEco\Client\AmazonPay\AmazonPayClientInterface getClient()
21
 * @method \SprykerEco\Yves\AmazonPay\AmazonPayFactory getFactory()
22
 */
23
class PaymentController extends AbstractController
24
{
25
    const URL_PARAM_REFERENCE_ID = 'reference_id';
26
    const URL_PARAM_ACCESS_TOKEN = 'access_token';
27
    const URL_PARAM_SHIPMENT_METHOD_ID = 'shipment_method_id';
28
    const QUOTE_TRANSFER = 'quoteTransfer';
29
    const SHIPMENT_METHODS = 'shipmentMethods';
30
    const SELECTED_SHIPMENT_METHOD_ID = 'selectedShipmentMethodId';
31
    const AMAZONPAY_CONFIG = 'amazonpayConfig';
32
    const IS_ASYNCHRONOUS = 'isAsynchronous';
33
    const CART_ITEMS = 'cartItems';
34
    const SUCCESS = 'success';
35
    const ERROR_AMAZONPAY_PAYMENT_FAILED = 'amazonpay.payment.failed';
36
    const IS_AMAZON_PAYMENT_INVALID = 'isAmazonPaymentInvalid';
37
38
    /**
39
     * @param \Symfony\Component\HttpFoundation\Request $request
40
     *
41
     * @return array|\Symfony\Component\HttpFoundation\Response
42
     */
43
    public function checkoutAction(Request $request)
44
    {
45
        $quoteTransfer = $this->getFactory()
46
            ->getQuoteClient()
47
            ->getQuote();
48
49
        if (!$this->isAllowedCheckout($quoteTransfer) || !$this->isRequestComplete($request)) {
50
            $this->addErrorFromQuote($quoteTransfer);
51
52
            return $this->buildRedirectInternalResponse();
53
        }
54
55
        $this->storeAmazonPaymentIntoQuote($request, $quoteTransfer);
56
57
        return [
58
            static::QUOTE_TRANSFER => $quoteTransfer,
59
            static::CART_ITEMS => $this->getCartItems($quoteTransfer),
60
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
61
        ];
62
    }
63
64
    /**
65
     * @param \Symfony\Component\HttpFoundation\Request $request
66
     *
67
     * @return \Symfony\Component\HttpFoundation\Response
68
     */
69
    public function setOrderReferenceAction(Request $request)
70
    {
71
        $quoteTransfer = $this->getFactory()
72
            ->getQuoteClient()
73
            ->getQuote();
74
75
        if (!$this->isAmazonPayment($quoteTransfer)) {
76
            return $this->buildRedirectInternalResponse();
77
        }
78
79
        $quoteTransfer->getAmazonpayPayment()
80
            ->setOrderReferenceId(
81
                $request->request->get(static::URL_PARAM_REFERENCE_ID)
82
            );
83
84
        return new JsonResponse([static::SUCCESS => true]);
85
    }
86
87
    /**
88
     * @return array|\Symfony\Component\HttpFoundation\Response
89
     */
90
    public function getShipmentMethodsAction()
91
    {
92
        $quoteTransfer = $this->getFactory()
93
            ->getQuoteClient()
94
            ->getQuote();
95
96
        if (!$this->isAmazonPayment($quoteTransfer)) {
97
            $this->addErrorFromQuote($quoteTransfer);
98
99
            return $this->buildRedirectInternalResponse();
100
        }
101
102
        $quoteTransfer = $this->getClient()
103
            ->addSelectedAddressToQuote($quoteTransfer);
104
        $this->saveQuoteIntoSession($quoteTransfer);
105
        $shipmentMethods = $this->getFactory()
106
            ->getShipmentClient()
107
            ->getAvailableMethods($quoteTransfer);
108
109
        return [
110
            static::SELECTED_SHIPMENT_METHOD_ID => $this->getCurrentShipmentMethodId($quoteTransfer),
111
            static::SHIPMENT_METHODS => $shipmentMethods->getMethods(),
112
            static::IS_AMAZON_PAYMENT_INVALID => $this->isAmazonPaymentInvalid($quoteTransfer),
113
        ];
114
    }
115
116
    /**
117
     * @param \Symfony\Component\HttpFoundation\Request $request
118
     *
119
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
120
     */
121
    public function updateShipmentMethodAction(Request $request)
122
    {
123
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
124
125
        if (!$this->isAmazonPayment($quoteTransfer)) {
126
            $this->addErrorFromQuote($quoteTransfer);
127
128
            return $this->buildRedirectInternalResponse();
129
        }
130
131
        $quoteTransfer->getShipment()->setShipmentSelection(
132
            $request->request->get(static::URL_PARAM_SHIPMENT_METHOD_ID)
133
        );
134
        $quoteTransfer = $this->getClient()
135
            ->addSelectedShipmentMethodToQuote($quoteTransfer);
136
        $quoteTransfer = $this->getFactory()
137
            ->getCalculationClient()->recalculate($quoteTransfer);
138
        $this->saveQuoteIntoSession($quoteTransfer);
139
140
        return [
141
            static::QUOTE_TRANSFER => $quoteTransfer,
142
        ];
143
    }
144
145
    /**
146
     * @param \Symfony\Component\HttpFoundation\Request $request
147
     *
148
     * @return \Symfony\Component\HttpFoundation\Response
149
     */
150
    public function confirmPurchaseAction(Request $request)
151
    {
152
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
153
154
        if (!$this->isAmazonPayment($quoteTransfer)) {
155
            $this->addErrorFromQuote($quoteTransfer);
156
157
            return $this->buildRedirectInternalResponse();
158
        }
159
160
        $quoteTransfer = $this->getClient()->confirmPurchase($quoteTransfer);
161
162
        if (!$quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsSuccess()) {
163
            $this->addErrorFromQuote($quoteTransfer);
164
            $this->saveQuoteIntoSession($quoteTransfer);
165
166
            if ($this->isLogoutRedirect($quoteTransfer)) {
167
                return $this->buildRedirectInternalResponse();
168
            }
169
170
            return $this->buildRedirectExternalResponse($request);
171
        }
172
173
        $quoteTransfer = $this->getFactory()->getCalculationClient()->recalculate($quoteTransfer);
174
        $this->saveQuoteIntoSession($quoteTransfer);
175
176
        $checkoutResponseTransfer = $this->getFactory()->getCheckoutClient()->placeOrder($quoteTransfer);
177
178
        if ($checkoutResponseTransfer->getIsSuccess()) {
179
            return $this->redirectResponseInternal(AmazonPayControllerProvider::SUCCESS);
180
        }
181
182
        $this->addErrorFromQuote($quoteTransfer);
183
184
        return $this->buildRedirectInternalResponse();
185
    }
186
187
    /**
188
     * @param \Symfony\Component\HttpFoundation\Request $request
189
     *
190
     * @return array
191
     */
192
    public function successAction(Request $request)
193
    {
194
        $this->getFactory()->getQuoteClient()->clearQuote();
195
196
        return [
197
            static::IS_ASYNCHRONOUS => $this->isAsynchronous(),
198
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
199
        ];
200
    }
201
202
    /**
203
     * @param \Symfony\Component\HttpFoundation\Request $request
204
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
205
     *
206
     * @return void
207
     */
208
    protected function storeAmazonPaymentIntoQuote(Request $request, QuoteTransfer $quoteTransfer)
209
    {
210
        if ($quoteTransfer->getAmazonpayPayment() !== null) {
211
            return;
212
        }
213
214
        $amazonPaymentTransfer = $this->buildAmazonPaymentTransfer($request);
215
216
        $quoteTransfer->setAmazonpayPayment($amazonPaymentTransfer);
217
        $quoteTransfer = $this->getClient()
218
            ->handleCartWithAmazonPay($quoteTransfer);
219
        $this->saveQuoteIntoSession($quoteTransfer);
220
    }
221
222
    /**
223
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
224
     *
225
     * @return void
226
     */
227
    protected function saveQuoteIntoSession(QuoteTransfer $quoteTransfer)
228
    {
229
        $this->getFactory()
230
            ->getQuoteClient()
231
            ->setQuote($quoteTransfer);
232
    }
233
234
    /**
235
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
236
     *
237
     * @return int|null
238
     */
239
    protected function getCurrentShipmentMethodId(QuoteTransfer $quoteTransfer)
240
    {
241
        if ($quoteTransfer->getShipment() === null || $quoteTransfer->getShipment()->getMethod() === null) {
242
            return null;
243
        }
244
245
        return $quoteTransfer->getShipment()->getMethod()->getIdShipmentMethod();
246
    }
247
248
    /**
249
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
250
     *
251
     * @return \ArrayObject|\Generated\Shared\Transfer\ItemTransfer[]
252
     */
253
    protected function getCartItems(QuoteTransfer $quoteTransfer)
254
    {
255
        return $quoteTransfer->getItems();
256
    }
257
258
    /**
259
     * @param \Symfony\Component\HttpFoundation\Request $request
260
     *
261
     * @return bool
262
     */
263
    protected function isRequestComplete(Request $request)
264
    {
265
        return (
266
            $request->query->get(static::URL_PARAM_REFERENCE_ID) !== null &&
267
            $request->query->get(static::URL_PARAM_ACCESS_TOKEN) !== null
268
        );
269
    }
270
271
    /**
272
     * @param \Symfony\Component\HttpFoundation\Request $request
273
     *
274
     * @return \Generated\Shared\Transfer\AmazonpayPaymentTransfer
275
     */
276
    protected function buildAmazonPaymentTransfer(Request $request)
277
    {
278
        $amazonPaymentTransfer = new AmazonpayPaymentTransfer();
279
        $amazonPaymentTransfer->setOrderReferenceId($request->query->get(static::URL_PARAM_REFERENCE_ID));
280
        $amazonPaymentTransfer->setAddressConsentToken($request->query->get(static::URL_PARAM_ACCESS_TOKEN));
281
282
        return $amazonPaymentTransfer;
283
    }
284
285
    /**
286
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
287
     *
288
     * @return bool
289
     */
290
    protected function isAllowedCheckout(QuoteTransfer $quoteTransfer)
291
    {
292
        return $quoteTransfer->getTotals() !== null;
293
    }
294
295
    /**
296
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
297
     *
298
     * @return bool
299
     */
300
    protected function isLogoutRedirect(QuoteTransfer $quoteTransfer)
301
    {
302
        if ($this->isAmazonPaymentInvalid($quoteTransfer)) {
303
            return false;
304
        }
305
306
        if ($this->getAmazonPayConfig()->getCaptureNow() &&
307
            $quoteTransfer->getAmazonpayPayment() !== null
308
            && $quoteTransfer->getAmazonpayPayment()->getResponseHeader() !== null
309
            && !$quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsSuccess()
310
        ) {
311
            return true;
312
        }
313
314
        return false;
315
    }
316
317
    /**
318
     * @param \Symfony\Component\HttpFoundation\Request $request
319
     *
320
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
321
     */
322
    protected function buildRedirectExternalResponse(Request $request)
323
    {
324
        if ($request->headers->get('Referer') === null) {
0 ignored issues
show
introduced by
The condition $request->headers->get('Referer') === null is always false.
Loading history...
325
            return $this->buildRedirectInternalResponse();
326
        }
327
328
        return $this->redirectResponseExternal($request->headers->get('Referer'));
329
    }
330
331
    /**
332
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
333
     *
334
     * @return void
335
     */
336
    protected function addErrorFromQuote(QuoteTransfer $quoteTransfer)
337
    {
338
        $this->addErrorMessage(
339
            $this->getErrorMessageFromQuote($quoteTransfer)
340
        );
341
    }
342
343
    /**
344
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
345
     *
346
     * @return bool
347
     */
348
    protected function isAmazonPayment(QuoteTransfer $quoteTransfer)
349
    {
350
        return $quoteTransfer->getAmazonpayPayment() !== null;
351
    }
352
353
    /**
354
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
355
     *
356
     * @return string
357
     */
358
    protected function getErrorMessageFromQuote(QuoteTransfer $quoteTransfer)
359
    {
360
        if ($quoteTransfer->getAmazonpayPayment() === null
361
            || $quoteTransfer->getAmazonpayPayment()->getResponseHeader() === null
362
            || $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage() === null) {
363
            return static::ERROR_AMAZONPAY_PAYMENT_FAILED;
364
        }
365
366
        return $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage();
367
    }
368
369
    /**
370
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
371
     */
372
    protected function buildRedirectInternalResponse()
373
    {
374
        return $this->redirectResponseInternal($this->getPaymentRejectRoute());
375
    }
376
377
    /**
378
     * @return string
379
     */
380
    protected function getPaymentRejectRoute()
381
    {
382
        return Config::get(AmazonPayConstants::PAYMENT_REJECT_ROUTE);
383
    }
384
385
    /**
386
     * @return bool
387
     */
388
    protected function isAsynchronous()
389
    {
390
        return $this->getAmazonPayConfig()->getAuthTransactionTimeout() > 0
391
            && !$this->getAmazonPayConfig()->getCaptureNow();
392
    }
393
394
    /**
395
     * @return \SprykerEco\Shared\AmazonPay\AmazonPayConfigInterface
396
     */
397
    protected function getAmazonPayConfig()
398
    {
399
        return $this->getFactory()->createAmazonPayConfig();
400
    }
401
402
    /**
403
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
404
     *
405
     * @return bool
406
     */
407
    protected function isAmazonPaymentInvalid(QuoteTransfer $quoteTransfer)
408
    {
409
        if ($quoteTransfer->getAmazonpayPayment()->getResponseHeader() !== null
410
            && $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsInvalidPaymentMethod()) {
411
            return true;
412
        }
413
414
        return false;
415
    }
416
}
417