Completed
Push — feature/eco-3656/eco-3658-enab... ( 85b20e...4f4220 )
by
unknown
04:19
created

CallbackController::successPayPalAction()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
c 0
b 0
f 0
dl 0
loc 5
rs 10
cc 1
nc 1
nop 1
1
<?php
2
3
/**
4
 * MIT License
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace SprykerEco\Yves\Computop\Controller;
9
10
use Generated\Shared\Transfer\ComputopApiResponseHeaderTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...iResponseHeaderTransfer 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\ComputopNotificationTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...topNotificationTransfer 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\Computop\ComputopConfig;
15
use SprykerEco\Shared\Computop\Config\ComputopApiConfig;
16
use SprykerEco\Shared\ComputopApi\ComputopApiConstants;
17
use SprykerEco\Yves\Computop\Handler\ComputopPrePostPaymentHandlerInterface;
18
use Symfony\Component\HttpFoundation\Request;
19
use Symfony\Component\HttpFoundation\Response;
20
21
/**
22
 * @method \SprykerEco\Yves\Computop\ComputopFactory getFactory()
23
 * @method \SprykerEco\Client\Computop\ComputopClientInterface getClient()
24
 */
25
class CallbackController extends AbstractController
26
{
27
    public const MESSAGE_PAYMENT_SUCCESS = 'Your order has been placed successfully! Thank you for shopping with us!';
28
29
    public const MESSAGE_LOG_OUT_ERROR = 'Please login and try again.';
30
31
    public const MESSAGE_RESPONSE_ERROR = 'Error: %s ( %s )';
32
33
    /**
34
     * @param \Symfony\Component\HttpFoundation\Request $request
35
     *
36
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
37
     */
38
    public function successCreditCardAction(Request $request)
39
    {
40
        return $this->executeSuccessPostPlaceAction(
41
            $this->getFactory()->createCreditCardPaymentHandler(),
42
            $request->request->all()
43
        );
44
    }
45
46
    /**
47
     * @param \Symfony\Component\HttpFoundation\Request $request
48
     *
49
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
50
     */
51
    public function successPayNowAction(Request $request)
52
    {
53
        return $this->executeSuccessPostPlaceAction(
54
            $this->getFactory()->createPayNowPaymentHandler(),
55
            $request->request->all()
56
        );
57
    }
58
59
    /**
60
     * @param \Symfony\Component\HttpFoundation\Request $request
61
     *
62
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
63
     */
64
    public function successPayPalAction(Request $request)
65
    {
66
        return $this->executeSuccessPostPlaceAction(
67
            $this->getFactory()->createPayPalPaymentHandler(),
68
            $request->query->all()
69
        );
70
    }
71
72
    /**
73
     * @param \Symfony\Component\HttpFoundation\Request $request
74
     *
75
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
76
     */
77
    public function placeOrderPayPalExpressAction(Request $request)
0 ignored issues
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

77
    public function placeOrderPayPalExpressAction(/** @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...
78
    {
79
        $request = $this->mockRequest();
80
81
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
82
        $handler = $this->getFactory()->createPayPalExpressPaymentHandler();
0 ignored issues
show
Bug introduced by
The method createPayPalExpressPaymentHandler() does not exist on SprykerEco\Yves\Computop\ComputopFactory. Did you maybe mean createPayPalExpressInitHandler()? ( Ignorable by Annotation )

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

82
        $handler = $this->getFactory()->/** @scrutinizer ignore-call */ createPayPalExpressPaymentHandler();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
83
        $handler->handle($quoteTransfer, $request->query->all());
84
85
86
        return $this->redirectResponseInternal('/place-order');
87
    }
88
89
    /**
90
     * @param \Symfony\Component\HttpFoundation\Request $request
91
     *
92
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
93
     */
94
    public function successDirectDebitAction(Request $request)
95
    {
96
        return $this->executeSuccessPostPlaceAction(
97
            $this->getFactory()->createDirectDebitPaymentHandler(),
98
            $request->query->all()
99
        );
100
    }
101
102
    /**
103
     * @param \Symfony\Component\HttpFoundation\Request $request
104
     *
105
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
106
     */
107
    public function successEasyCreditAction(Request $request)
108
    {
109
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
110
        $quoteTransfer = $this->getFactory()
111
            ->createEasyCreditPaymentHandler()
112
            ->handle($quoteTransfer, $request->query->all());
113
114
        $this->getFactory()->getQuoteClient()->setQuote($quoteTransfer);
115
        $statusResponse = $quoteTransfer->getPayment()->getComputopEasyCredit()->getEasyCreditStatusResponse();
116
117
        if (!$statusResponse->getHeader()->getIsSuccess()) {
118
            $this->addErrorMessage($statusResponse->getErrorText());
119
120
            return $this->redirectResponseInternal($this->getFactory()->getComputopConfig()->getCallbackFailureRedirectPath());
121
        }
122
123
        return $this->redirectResponseInternal($this->getFactory()->getComputopConfig()->getEasyCreditSuccessAction());
124
    }
125
126
    /**
127
     * @param \Symfony\Component\HttpFoundation\Request $request
128
     *
129
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
130
     */
131
    public function successPaydirektAction(Request $request)
132
    {
133
        return $this->executeSuccessPostPlaceAction(
134
            $this->getFactory()->createPaydirektPaymentHandler(),
135
            $request->query->all()
136
        );
137
    }
138
139
    /**
140
     * @param \Symfony\Component\HttpFoundation\Request $request
141
     *
142
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
143
     */
144
    public function successSofortAction(Request $request)
145
    {
146
        return $this->executeSuccessPostPlaceAction(
147
            $this->getFactory()->createSofortPaymentHandler(),
148
            $request->query->all()
149
        );
150
    }
151
152
    /**
153
     * @param \Symfony\Component\HttpFoundation\Request $request
154
     *
155
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
156
     */
157
    public function successIdealAction(Request $request)
158
    {
159
        return $this->executeSuccessPostPlaceAction(
160
            $this->getFactory()->createIdealPaymentHandler(),
161
            $request->query->all()
162
        );
163
    }
164
165
    /**
166
     * @param \SprykerEco\Yves\Computop\Handler\ComputopPrePostPaymentHandlerInterface $handler
167
     * @param array $responseArray
168
     *
169
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
170
     */
171
    protected function executeSuccessPostPlaceAction(ComputopPrePostPaymentHandlerInterface $handler, array $responseArray)
172
    {
173
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
174
        $quoteTransfer = $handler->handle($quoteTransfer, $responseArray);
175
176
        if (!$quoteTransfer->getCustomer()) {
177
            $this->addSuccessMessage(static::MESSAGE_PAYMENT_SUCCESS);
178
        }
179
180
        return $this->redirectResponseInternal(
181
            $this->getFactory()->getComputopConfig()->getCallbackSuccessCaptureRedirectPath()
182
        );
183
    }
184
185
    /**
186
     * @param \Symfony\Component\HttpFoundation\Request $request
187
     *
188
     * @throws \SprykerEco\Service\ComputopApi\Exception\ComputopApiConverterException
189
     *
190
     */
191
    public function failureAction(Request $request)
192
    {
193
        $requestParameters = $request->query->all();
194
195
        if ($request->isMethod(Request::METHOD_POST)) {
196
            $requestParameters = $request->request->all();
197
        }
198
199
        $decryptedArray = $this->getFactory()
200
            ->getComputopApiService()
201
            ->decryptResponseHeader($requestParameters, Config::get(ComputopApiConstants::BLOWFISH_PASSWORD));
202
203
        $responseHeaderTransfer = $this->getFactory()
204
            ->getComputopApiService()
205
            ->extractResponseHeader($decryptedArray, ComputopConfig::INIT_METHOD);
206
207
        $this->addErrorMessage($this->getErrorMessageText($responseHeaderTransfer));
208
209
        return $this->redirectResponseInternal($this->getFactory()->getComputopConfig()->getCallbackFailureRedirectPath());
210
    }
211
212
    /**
213
     * @param \Symfony\Component\HttpFoundation\Request $request
214
     *
215
     * @return \Symfony\Component\HttpFoundation\Response
216
     */
217
    public function notifyAction(Request $request)
218
    {
219
        $decryptedArray = $this->getFactory()
220
            ->getComputopApiService()
221
            ->decryptResponseHeader($request->request->all(), Config::get(ComputopApiConstants::BLOWFISH_PASSWORD));
222
223
        $responseHeaderTransfer = $this->getFactory()
224
            ->getComputopApiService()
225
            ->extractResponseHeader($decryptedArray, '');
226
227
        $computopNotificationTransfer = (new ComputopNotificationTransfer())
228
            ->fromArray($responseHeaderTransfer->toArray(), true)
229
            ->setType($decryptedArray[ComputopApiConfig::NOTIFICATION_PARAMETER_PAYMENT_TYPE] ?? '');
230
231
        $computopNotificationTransfer = $this->getClient()->processNotification($computopNotificationTransfer);
232
233
        if ($computopNotificationTransfer->getIsProcessed()) {
234
            return new Response();
235
        }
236
237
        return new Response('', Response::HTTP_NOT_ACCEPTABLE);
238
    }
239
240
    /**
241
     * @param \Generated\Shared\Transfer\ComputopApiResponseHeaderTransfer $responseHeaderTransfer
242
     *
243
     * @return string
244
     */
245
    protected function getErrorMessageText(ComputopApiResponseHeaderTransfer $responseHeaderTransfer)
246
    {
247
        $errorText = $responseHeaderTransfer->getDescription();
248
        $errorCode = $responseHeaderTransfer->getCode();
249
        $errorMessageText = sprintf(static::MESSAGE_RESPONSE_ERROR, $errorText, $errorCode);
250
251
        return $errorMessageText;
252
    }
253
254
    private function mockRequest(): Request
255
    {
256
        $request = new Request();
257
258
        $data = [
259
            ComputopApiConfig::MERCHANT_ID_SHORT => 'spryker_test',
260
            ComputopApiConfig::PAY_ID => 123,
261
            ComputopApiConfig::MAC => '299BEB7656F5B1ED2FDE6D50C8F2CA38196F8658F853CE6471730726CB8FD0F9',
262
            ComputopApiConfig::TRANS_ID => 12355,
263
            ComputopApiConfig::CODE => 0,
264
265
266
            ComputopApiConfig::STATUS => 'AUTHORIZE_REQUEST',
267
            ComputopApiConfig::FIRST_NAME => 'Kos',
268
            ComputopApiConfig::LAST_NAME => 'Spryker',
269
            ComputopApiConfig::EMAIL => '[email protected]',
270
            ComputopApiConfig::ADDRESS_STREET => 'test street',
271
            ComputopApiConfig::BILLING_ADDRESS_STREET => 'test billing street',
272
        ];
273
274
        $encrData = $this->getFactory()->getComputopApiService()
275
            ->getEncryptedArray($data, $this->getFactory()->getConfig()->getBlowfishPassword());
276
277
        $request->query->set('Data', $encrData['Data']);
278
        $request->query->set('Len', $encrData['Len']);
279
280
        return $request;
281
    }
282
}
283