Completed
Pull Request — dev (#22)
by Andrey
08:21 queued 03:45
created

PaymentController::isAmazonPaymentInvalid()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 2
nc 2
nop 1
dl 0
loc 4
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
            return $this->buildRedirectExternalResponse($request);
167
        }
168
169
        $quoteTransfer = $this->getFactory()->getCalculationClient()->recalculate($quoteTransfer);
170
        $this->saveQuoteIntoSession($quoteTransfer);
171
172
        $checkoutResponseTransfer = $this->getFactory()->getCheckoutClient()->placeOrder($quoteTransfer);
173
174
        if ($checkoutResponseTransfer->getIsSuccess()) {
175
            return $this->redirectResponseInternal(AmazonPayControllerProvider::SUCCESS);
176
        }
177
178
        $this->addErrorFromQuote($quoteTransfer);
179
180
        return $this->buildRedirectInternalResponse();
181
    }
182
183
    /**
184
     * @param \Symfony\Component\HttpFoundation\Request $request
185
     *
186
     * @return array
187
     */
188
    public function successAction(Request $request)
189
    {
190
        $this->getFactory()->getQuoteClient()->clearQuote();
191
192
        return [
193
            static::IS_ASYNCHRONOUS => $this->isAsynchronous(),
194
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
195
        ];
196
    }
197
198
    /**
199
     * @param \Symfony\Component\HttpFoundation\Request $request
200
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
201
     *
202
     * @return void
203
     */
204
    protected function storeAmazonPaymentIntoQuote(Request $request, QuoteTransfer $quoteTransfer)
205
    {
206
        if ($quoteTransfer->getAmazonpayPayment() !== null) {
207
            return;
208
        }
209
210
        $amazonPaymentTransfer = $this->buildAmazonPaymentTransfer($request);
211
212
        $quoteTransfer->setAmazonpayPayment($amazonPaymentTransfer);
213
        $quoteTransfer = $this->getClient()
214
            ->handleCartWithAmazonPay($quoteTransfer);
215
        $this->saveQuoteIntoSession($quoteTransfer);
216
    }
217
218
    /**
219
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
220
     *
221
     * @return void
222
     */
223
    protected function saveQuoteIntoSession(QuoteTransfer $quoteTransfer)
224
    {
225
        $this->getFactory()
226
            ->getQuoteClient()
227
            ->setQuote($quoteTransfer);
228
    }
229
230
    /**
231
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
232
     *
233
     * @return int|null
234
     */
235
    protected function getCurrentShipmentMethodId(QuoteTransfer $quoteTransfer)
236
    {
237
        if ($quoteTransfer->getShipment() === null || $quoteTransfer->getShipment()->getMethod() === null) {
238
            return null;
239
        }
240
241
        return $quoteTransfer->getShipment()->getMethod()->getIdShipmentMethod();
242
    }
243
244
    /**
245
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
246
     *
247
     * @return \ArrayObject|\Generated\Shared\Transfer\ItemTransfer[]
248
     */
249
    protected function getCartItems(QuoteTransfer $quoteTransfer)
250
    {
251
        return $quoteTransfer->getItems();
252
    }
253
254
    /**
255
     * @param \Symfony\Component\HttpFoundation\Request $request
256
     *
257
     * @return bool
258
     */
259
    protected function isRequestComplete(Request $request)
260
    {
261
        return (
262
            $request->query->get(static::URL_PARAM_REFERENCE_ID) !== null &&
263
            $request->query->get(static::URL_PARAM_ACCESS_TOKEN) !== null
264
        );
265
    }
266
267
    /**
268
     * @param \Symfony\Component\HttpFoundation\Request $request
269
     *
270
     * @return \Generated\Shared\Transfer\AmazonpayPaymentTransfer
271
     */
272
    protected function buildAmazonPaymentTransfer(Request $request)
273
    {
274
        $amazonPaymentTransfer = new AmazonpayPaymentTransfer();
275
        $amazonPaymentTransfer->setOrderReferenceId($request->query->get(static::URL_PARAM_REFERENCE_ID));
276
        $amazonPaymentTransfer->setAddressConsentToken($request->query->get(static::URL_PARAM_ACCESS_TOKEN));
277
278
        return $amazonPaymentTransfer;
279
    }
280
281
    /**
282
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
283
     *
284
     * @return bool
285
     */
286
    protected function isAllowedCheckout(QuoteTransfer $quoteTransfer)
287
    {
288
        return $quoteTransfer->getTotals() !== null;
289
    }
290
291
    /**
292
     * @param \Symfony\Component\HttpFoundation\Request $request
293
     *
294
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
295
     */
296
    protected function buildRedirectExternalResponse(Request $request)
297
    {
298
        if ($request->headers->get('Referer') === null) {
0 ignored issues
show
introduced by
The condition $request->headers->get('Referer') === null is always false.
Loading history...
299
            return $this->buildRedirectInternalResponse();
300
        }
301
302
        return $this->redirectResponseExternal($request->headers->get('Referer'));
303
    }
304
305
    /**
306
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
307
     *
308
     * @return void
309
     */
310
    protected function addErrorFromQuote(QuoteTransfer $quoteTransfer)
311
    {
312
        $this->addErrorMessage(
313
            $this->getErrorMessageFromQuote($quoteTransfer)
314
        );
315
    }
316
317
    /**
318
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
319
     *
320
     * @return bool
321
     */
322
    protected function isAmazonPayment(QuoteTransfer $quoteTransfer)
323
    {
324
        return $quoteTransfer->getAmazonpayPayment() !== null;
325
    }
326
327
    /**
328
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
329
     *
330
     * @return string
331
     */
332
    protected function getErrorMessageFromQuote(QuoteTransfer $quoteTransfer)
333
    {
334
        if ($quoteTransfer->getAmazonpayPayment() === null
335
            || $quoteTransfer->getAmazonpayPayment()->getResponseHeader() === null
336
            || $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage() === null) {
337
            return static::ERROR_AMAZONPAY_PAYMENT_FAILED;
338
        }
339
340
        return $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage();
341
    }
342
343
    /**
344
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
345
     */
346
    protected function buildRedirectInternalResponse()
347
    {
348
        return $this->redirectResponseInternal($this->getPaymentRejectRoute());
349
    }
350
351
    /**
352
     * @return string
353
     */
354
    protected function getPaymentRejectRoute()
355
    {
356
        return Config::get(AmazonPayConstants::PAYMENT_REJECT_ROUTE);
357
    }
358
359
    /**
360
     * @return bool
361
     */
362
    protected function isAsynchronous()
363
    {
364
        return $this->getAmazonPayConfig()->getAuthTransactionTimeout() > 0
365
            && !$this->getAmazonPayConfig()->getCaptureNow();
366
    }
367
368
    /**
369
     * @return \SprykerEco\Shared\AmazonPay\AmazonPayConfigInterface
370
     */
371
    protected function getAmazonPayConfig()
372
    {
373
        return $this->getFactory()->createAmazonPayConfig();
374
    }
375
376
    /**
377
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
378
     *
379
     * @return bool
380
     */
381
    protected function isAmazonPaymentInvalid(QuoteTransfer $quoteTransfer)
382
    {
383
        return $quoteTransfer->getAmazonpayPayment()->getResponseHeader() !== null
384
            && false === $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsSuccess();
385
    }
386
}
387