Skip to content

Commit 02d8cfc

Browse files
committed
Merge remote-tracking branch 'origin/MC-17117' into payflow-graphql-pr
2 parents b8564bf + d157d3b commit 02d8cfc

File tree

20 files changed

+1209
-39
lines changed

20 files changed

+1209
-39
lines changed

app/code/Magento/Paypal/Controller/Transparent/Response.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
use Magento\Paypal\Model\Payflow\Transparent;
2020
use Magento\Sales\Api\PaymentFailuresInterface;
2121
use Magento\Framework\Session\Generic as Session;
22+
use Magento\Framework\App\Action\HttpPostActionInterface;
2223

2324
/**
25+
* Class for requesting the response result form the paypal controller.
2426
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
2527
*/
26-
class Response extends \Magento\Framework\App\Action\Action implements CsrfAwareActionInterface
28+
class Response extends \Magento\Framework\App\Action\Action implements CsrfAwareActionInterface, HttpPostActionInterface
2729
{
2830
/**
2931
* Core registry
@@ -112,6 +114,8 @@ public function validateForCsrf(RequestInterface $request): ?bool
112114
}
113115

114116
/**
117+
* Saves the payment in quote
118+
*
115119
* @return ResultInterface
116120
*/
117121
public function execute()
@@ -120,7 +124,7 @@ public function execute()
120124
try {
121125
$response = $this->transaction->getResponseObject($this->getRequest()->getPostValue());
122126
$this->responseValidator->validate($response, $this->transparent);
123-
$this->transaction->savePaymentInQuote($response);
127+
$this->transaction->savePaymentInQuote($response, (int)$this->sessionTransparent->getQuoteId());
124128
} catch (LocalizedException $exception) {
125129
$parameters['error'] = true;
126130
$parameters['error_msg'] = $exception->getMessage();

app/code/Magento/Paypal/Model/Payflow/Service/Request/SecureToken.php

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
7+
declare(strict_types=1);
8+
69
namespace Magento\Paypal\Model\Payflow\Service\Request;
710

811
use Magento\Framework\Math\Random;
@@ -13,7 +16,7 @@
1316
use Magento\Quote\Model\Quote;
1417

1518
/**
16-
* Class SecureToken
19+
* Class for requesting a secure Payflow Pro token from Paypal
1720
*/
1821
class SecureToken
1922
{
@@ -42,7 +45,6 @@ public function __construct(
4245
Random $mathRandom,
4346
Transparent $transparent
4447
) {
45-
4648
$this->url = $url;
4749
$this->mathRandom = $mathRandom;
4850
$this->transparent = $transparent;
@@ -52,11 +54,12 @@ public function __construct(
5254
* Get the Secure Token from Paypal for TR
5355
*
5456
* @param Quote $quote
57+
* @param string[] $urls
5558
*
5659
* @return DataObject
5760
* @throws \Exception
5861
*/
59-
public function requestToken(Quote $quote)
62+
public function requestToken(Quote $quote, array $urls = [])
6063
{
6164
$this->transparent->setStore($quote->getStoreId());
6265
$request = $this->transparent->buildBasicRequest();
@@ -67,9 +70,9 @@ public function requestToken(Quote $quote)
6770
$request->setCurrency($quote->getBaseCurrencyCode());
6871
$request->setCreatesecuretoken('Y');
6972
$request->setSecuretokenid($this->mathRandom->getUniqueHash());
70-
$request->setReturnurl($this->url->getUrl('paypal/transparent/response'));
71-
$request->setErrorurl($this->url->getUrl('paypal/transparent/response'));
72-
$request->setCancelurl($this->url->getUrl('paypal/transparent/cancel'));
73+
$request->setReturnurl($urls['return_url'] ?? $this->url->getUrl('paypal/transparent/response'));
74+
$request->setErrorurl($urls['error_url'] ?? $this->url->getUrl('paypal/transparent/response'));
75+
$request->setCancelurl($urls['cancel_url'] ?? $this->url->getUrl('paypal/transparent/cancel'));
7376
$request->setDisablereceipt('TRUE');
7477
$request->setSilenttran('TRUE');
7578

app/code/Magento/Paypal/Model/Payflow/Service/Response/Transaction.php

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
use Magento\Framework\Intl\DateTimeFactory;
1212
use Magento\Payment\Model\Method\Logger;
1313
use Magento\Paypal\Model\Payflow\Service\Response\Handler\HandlerInterface;
14-
use Magento\Framework\Session\Generic;
1514
use Magento\Paypal\Model\Payflowpro;
1615
use Magento\Quote\Api\CartRepositoryInterface;
1716
use Magento\Paypal\Model\Payflow\Transparent;
@@ -25,11 +24,6 @@
2524
*/
2625
class Transaction
2726
{
28-
/**
29-
* @var Generic
30-
*/
31-
protected $sessionTransparent;
32-
3327
/**
3428
* @var CartRepositoryInterface
3529
*/
@@ -61,7 +55,6 @@ class Transaction
6155
private $dateTimeFactory;
6256

6357
/**
64-
* @param Generic $sessionTransparent
6558
* @param CartRepositoryInterface $quoteRepository
6659
* @param Transparent $transparent
6760
* @param PaymentMethodManagementInterface $paymentManagement
@@ -70,15 +63,13 @@ class Transaction
7063
* @param DateTimeFactory $dateTimeFactory
7164
*/
7265
public function __construct(
73-
Generic $sessionTransparent,
7466
CartRepositoryInterface $quoteRepository,
7567
Transparent $transparent,
7668
PaymentMethodManagementInterface $paymentManagement,
7769
HandlerInterface $errorHandler,
7870
Logger $logger,
7971
DateTimeFactory $dateTimeFactory
8072
) {
81-
$this->sessionTransparent = $sessionTransparent;
8273
$this->quoteRepository = $quoteRepository;
8374
$this->transparent = $transparent;
8475
$this->paymentManagement = $paymentManagement;
@@ -111,13 +102,13 @@ public function getResponseObject($gatewayTransactionResponse)
111102
* Saves payment information in quote.
112103
*
113104
* @param DataObject $response
105+
* @param int $cartId
114106
* @return void
115107
* @throws \InvalidArgumentException
116108
*/
117-
public function savePaymentInQuote($response)
109+
public function savePaymentInQuote($response, $cartId)
118110
{
119-
$quote = $this->quoteRepository->get($this->sessionTransparent->getQuoteId());
120-
111+
$quote = $this->quoteRepository->get($cartId);
121112
$payment = $this->paymentManagement->get($quote->getId());
122113
if (!$payment instanceof Payment) {
123114
throw new \InvalidArgumentException("Variable must contain instance of \\Quote\\Payment.");

app/code/Magento/Paypal/Test/Unit/Model/Payflow/Service/Response/TransactionTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public function testGetResponseObject($gatewayTransactionResponse)
4949
*/
5050
public function testSavePaymentInQuote()
5151
{
52+
$cartId = 12;
5253
/** @var Transaction $transactionService */
5354
$transactionService = (new ObjectManager($this))->getObject(
5455
Transaction::class,
@@ -57,7 +58,7 @@ public function testSavePaymentInQuote()
5758
]
5859
);
5960

60-
$transactionService->savePaymentInQuote(new DataObject);
61+
$transactionService->savePaymentInQuote(new DataObject, $cartId);
6162
}
6263

6364
/**

app/code/Magento/PaypalGraphQl/Model/PaypalExpressAdditionalDataProvider.php renamed to app/code/Magento/PaypalGraphQl/Model/PaypalAdditionalDataProvider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
/**
1414
* Get payment additional data for Paypal Express payment
1515
*/
16-
class PaypalExpressAdditionalDataProvider implements AdditionalDataProviderInterface
16+
class PaypalAdditionalDataProvider implements AdditionalDataProviderInterface
1717
{
1818

1919
private const PATH_ADDITIONAL_DATA = 'input/payment_method/additional_data';

app/code/Magento/PaypalGraphQl/Model/Plugin/Resolver/SetPaymentMethodOnCart.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
use Magento\Framework\GraphQl\Config\Element\Field;
1515
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1616
use Magento\Paypal\Model\Express\Checkout\Factory as CheckoutFactory;
17-
use Magento\PaypalGraphQl\Model\PaypalExpressAdditionalDataProvider;
17+
use Magento\PaypalGraphQl\Model\PaypalAdditionalDataProvider;
1818
use Magento\Framework\Stdlib\ArrayManager;
1919
use Magento\PaypalGraphQl\Model\Provider\Checkout as CheckoutProvider;
2020
use Magento\PaypalGraphQl\Model\Provider\Config as ConfigProvider;
@@ -34,9 +34,9 @@ class SetPaymentMethodOnCart
3434
private $checkoutFactory;
3535

3636
/**
37-
* @var PaypalExpressAdditionalDataProvider
37+
* @var PaypalAdditionalDataProvider
3838
*/
39-
private $paypalExpressAdditionalDataProvider;
39+
private $paypalAdditionalDataProvider;
4040

4141
/**
4242
* @var ArrayManager
@@ -55,22 +55,22 @@ class SetPaymentMethodOnCart
5555

5656
/**
5757
* @param CheckoutFactory $checkoutFactory
58-
* @param PaypalExpressAdditionalDataProvider $paypalExpressAdditionalDataProvider
58+
* @param PaypalAdditionalDataProvider $paypalAdditionalDataProvider
5959
* @param ArrayManager $arrayManager
6060
* @param CheckoutProvider $checkoutProvider
6161
* @param ConfigProvider $configProvider
6262
* @param array $allowedPaymentMethodCodes
6363
*/
6464
public function __construct(
6565
CheckoutFactory $checkoutFactory,
66-
PaypalExpressAdditionalDataProvider $paypalExpressAdditionalDataProvider,
66+
PaypalAdditionalDataProvider $paypalAdditionalDataProvider,
6767
ArrayManager $arrayManager,
6868
CheckoutProvider $checkoutProvider,
6969
ConfigProvider $configProvider,
7070
array $allowedPaymentMethodCodes = []
7171
) {
7272
$this->checkoutFactory = $checkoutFactory;
73-
$this->paypalExpressAdditionalDataProvider = $paypalExpressAdditionalDataProvider;
73+
$this->paypalAdditionalDataProvider = $paypalAdditionalDataProvider;
7474
$this->arrayManager = $arrayManager;
7575
$this->checkoutProvider = $checkoutProvider;
7676
$this->configProvider = $configProvider;
@@ -105,7 +105,7 @@ public function afterResolve(
105105
return $resolvedValue;
106106
}
107107

108-
$paypalAdditionalData = $this->paypalExpressAdditionalDataProvider->getData($args);
108+
$paypalAdditionalData = $this->paypalAdditionalDataProvider->getData($args);
109109
$payerId = $paypalAdditionalData[$paymentCode]['payer_id'] ?? null;
110110
$token = $paypalAdditionalData[$paymentCode]['token'] ?? null;
111111
$cart = $resolvedValue['cart']['model'];
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\PaypalGraphQl\Model\Resolver;
9+
10+
use Magento\Paypal\Model\Payflow\Service\Response\Transaction;
11+
use Magento\Paypal\Model\Payflow\Service\Response\Validator\ResponseValidator;
12+
use Magento\Sales\Api\PaymentFailuresInterface;
13+
use Magento\Framework\Serialize\Serializer\Json;
14+
use Magento\Paypal\Model\Payflow\Transparent;
15+
use Magento\Framework\GraphQl\Query\ResolverInterface;
16+
use Magento\Framework\GraphQl\Config\Element\Field;
17+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
18+
use Magento\QuoteGraphQl\Model\Cart\GetCartForUser;
19+
use Magento\Framework\Exception\LocalizedException;
20+
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
21+
use Magento\Framework\Stdlib\Parameters;
22+
23+
/**
24+
* Resolver for handling PayflowPro response
25+
*/
26+
class PayflowProResponse implements ResolverInterface
27+
{
28+
29+
/**
30+
* @var Transaction
31+
*/
32+
private $transaction;
33+
34+
/**
35+
* @var ResponseValidator
36+
*/
37+
private $responseValidator;
38+
39+
/**
40+
* @var PaymentFailuresInterface
41+
*/
42+
private $paymentFailures;
43+
44+
/**
45+
* @var Json
46+
*/
47+
private $json;
48+
49+
/**
50+
* @var Transparent
51+
*/
52+
private $transparent;
53+
54+
/**
55+
* @var GetCartForUser
56+
*/
57+
private $getCartForUser;
58+
59+
/**
60+
* @var Parameters
61+
*/
62+
private $parameters;
63+
64+
/**
65+
* @param Transaction $transaction
66+
* @param ResponseValidator $responseValidator
67+
* @param PaymentFailuresInterface $paymentFailures
68+
* @param Json $json
69+
* @param Transparent $transparent
70+
* @param GetCartForUser $getCartForUser
71+
* @param Parameters $parameters
72+
*/
73+
public function __construct(
74+
Transaction $transaction,
75+
ResponseValidator $responseValidator,
76+
PaymentFailuresInterface $paymentFailures,
77+
Json $json,
78+
Transparent $transparent,
79+
GetCartForUser $getCartForUser,
80+
Parameters $parameters
81+
) {
82+
$this->transaction = $transaction;
83+
$this->responseValidator = $responseValidator;
84+
$this->paymentFailures = $paymentFailures;
85+
$this->json = $json;
86+
$this->transparent = $transparent;
87+
$this->getCartForUser = $getCartForUser;
88+
$this->parameters = $parameters;
89+
}
90+
91+
/**
92+
* @inheritdoc
93+
*/
94+
public function resolve(
95+
Field $field,
96+
$context,
97+
ResolveInfo $info,
98+
array $value = null,
99+
array $args = null
100+
) {
101+
if (!isset($args['input']['cart_id']) || empty($args['input']['cart_id'])) {
102+
throw new GraphQlInputException(__('Required parameter "cart_id" is missing.'));
103+
}
104+
105+
if (!isset($args['input']['paypal_payload']) || empty($args['input']['paypal_payload'])) {
106+
throw new GraphQlInputException(__('Required parameter "paypal_payload" is missing.'));
107+
}
108+
109+
$maskedCartId = $args['input']['cart_id'];
110+
$cart = $this->getCartForUser->execute($maskedCartId, $context->getUserId());
111+
112+
$paypalPayload = $args['input']['paypal_payload'] ?? '';
113+
114+
// this is a replacement for parse_str()
115+
$this->parameters->fromString(urldecode($paypalPayload));
116+
$data = $this->parameters->toArray();
117+
try {
118+
$do = new \Magento\Framework\DataObject(array_change_key_case($data, CASE_LOWER));
119+
$this->responseValidator->validate($do, $this->transparent);
120+
$this->transaction->savePaymentInQuote($do, $cart->getId());
121+
} catch (LocalizedException $exception) {
122+
$parameters['error'] = true;
123+
$parameters['error_msg'] = $exception->getMessage();
124+
$this->paymentFailures->handle((int) $cart->getId(), $parameters['error_msg']);
125+
throw new GraphQlInputException(__($exception->getMessage()));
126+
}
127+
return [
128+
'cart' => [
129+
'model' => $cart,
130+
],
131+
];
132+
}
133+
}

0 commit comments

Comments
 (0)