Skip to content

Commit

Permalink
ENGCOM-7916: [GraphQL] PayFlowPro store the payment details in myacco…
Browse files Browse the repository at this point in the history
…unt for future #28821
  • Loading branch information
prabhuram93 authored Aug 3, 2020
2 parents 9b0e514 + 0f5e0c9 commit 6f4d800
Show file tree
Hide file tree
Showing 8 changed files with 438 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\PaypalGraphQl\Model\Plugin\Cart\PayflowPro;

use Magento\Framework\GraphQl\Exception\GraphQlInputException;
use Magento\Paypal\Model\Config;
use Magento\Quote\Model\Quote;
use Magento\QuoteGraphQl\Model\Cart\Payment\AdditionalDataProviderPool;
use Magento\Sales\Model\Order\Payment\Repository as PaymentRepository;
use Magento\PaypalGraphQl\Observer\PayflowProSetCcData;

/**
* Set additionalInformation on payment for PayflowPro method
*/
class SetPaymentMethodOnCart
{
/**
* @var PaymentRepository
*/
private $paymentRepository;

/**
* @var AdditionalDataProviderPool
*/
private $additionalDataProviderPool;

/**
* @param PaymentRepository $paymentRepository
* @param AdditionalDataProviderPool $additionalDataProviderPool
*/
public function __construct(
PaymentRepository $paymentRepository,
AdditionalDataProviderPool $additionalDataProviderPool
) {
$this->paymentRepository = $paymentRepository;
$this->additionalDataProviderPool = $additionalDataProviderPool;
}

/**
* Set redirect URL paths on payment additionalInformation
*
* @param \Magento\QuoteGraphQl\Model\Cart\SetPaymentMethodOnCart $subject
* @param mixed $result
* @param Quote $cart
* @param array $paymentData
* @return void
* @throws GraphQlInputException
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterExecute(
\Magento\QuoteGraphQl\Model\Cart\SetPaymentMethodOnCart $subject,
$result,
Quote $cart,
array $paymentData
): void {
$paymentData = $this->additionalDataProviderPool->getData(Config::METHOD_PAYFLOWPRO, $paymentData);
$cartCustomerId = (int)$cart->getCustomerId();
if ($cartCustomerId === 0 &&
array_key_exists(PayflowProSetCcData::IS_ACTIVE_PAYMENT_TOKEN_ENABLER, $paymentData)) {
$payment = $cart->getPayment();
$payment->unsAdditionalInformation(PayflowProSetCcData::IS_ACTIVE_PAYMENT_TOKEN_ENABLER);
$payment->save();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,9 @@ public function resolve(
$this->parameters->fromString(urldecode($paypalPayload));
$data = $this->parameters->toArray();
try {
$do = $this->dataObjectFactory->create(['data' => array_change_key_case($data, CASE_LOWER)]);
$this->responseValidator->validate($do, $this->transparent);
$this->transaction->savePaymentInQuote($do, $cart->getId());
$response = $this->transaction->getResponseObject($data);
$this->responseValidator->validate($response, $this->transparent);
$this->transaction->savePaymentInQuote($response, $cart->getId());
} catch (LocalizedException $exception) {
$parameters['error'] = true;
$parameters['error_msg'] = $exception->getMessage();
Expand Down
88 changes: 88 additions & 0 deletions app/code/Magento/PaypalGraphQl/Observer/PayflowProSetCcData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

declare(strict_types=1);

namespace Magento\PaypalGraphQl\Observer;

use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\Event\Observer;
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
use Magento\Payment\Observer\AbstractDataAssignObserver;
use Magento\Quote\Api\Data\PaymentInterface;

/**
* Class PayflowProSetCcData set CcData to quote payment
* @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
*/
class PayflowProSetCcData extends AbstractDataAssignObserver
{
const XML_PATH_PAYMENT_PAYFLOWPRO_CC_VAULT_ACTIVE = "payment/payflowpro_cc_vault/active";
const IS_ACTIVE_PAYMENT_TOKEN_ENABLER = "is_active_payment_token_enabler";

/**
* Core store config
*
* @var ScopeConfigInterface
*/
private $scopeConfig;

/**
* @param ScopeConfigInterface $scopeConfig
*/
public function __construct(
ScopeConfigInterface $scopeConfig
) {
$this->scopeConfig = $scopeConfig;
}

/**
* Set CcData
*
* @param Observer $observer
*
* @throws GraphQlInputException
*/
public function execute(Observer $observer)
{
$dataObject = $this->readDataArgument($observer);
$additionalData = $dataObject->getData(PaymentInterface::KEY_ADDITIONAL_DATA);
$paymentModel = $this->readPaymentModelArgument($observer);

if (!isset($additionalData['cc_details'])) {
return;
}

if ($this->isPayflowProVaultEnable()) {
if (!isset($additionalData[self::IS_ACTIVE_PAYMENT_TOKEN_ENABLER])) {
$paymentModel->setData(self::IS_ACTIVE_PAYMENT_TOKEN_ENABLER, false);
}

$paymentModel->setData(
self::IS_ACTIVE_PAYMENT_TOKEN_ENABLER,
$additionalData[self::IS_ACTIVE_PAYMENT_TOKEN_ENABLER]
);
} else {
$paymentModel->setData(self::IS_ACTIVE_PAYMENT_TOKEN_ENABLER, false);
}

$ccData = $additionalData['cc_details'];
$paymentModel->setCcType($ccData['cc_type']);
$paymentModel->setCcExpYear($ccData['cc_exp_year']);
$paymentModel->setCcExpMonth($ccData['cc_exp_month']);
$paymentModel->setCcLast4($ccData['cc_last_4']);
}

/**
* Check if payflowpro vault is enable
*
* @return bool
*/
private function isPayflowProVaultEnable()
{
return (bool)$this->scopeConfig->getValue(self::XML_PATH_PAYMENT_PAYFLOWPRO_CC_VAULT_ACTIVE);
}
}
3 changes: 2 additions & 1 deletion app/code/Magento/PaypalGraphQl/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
"magento/module-store": "*"
},
"suggest": {
"magento/module-graph-ql": "*"
"magento/module-graph-ql": "*",
"magento/module-store-graph-ql": "*"
},
"type": "magento2-module",
"license": [
Expand Down
9 changes: 9 additions & 0 deletions app/code/Magento/PaypalGraphQl/etc/graphql/di.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
</type>
<type name="Magento\QuoteGraphQl\Model\Cart\SetPaymentMethodOnCart">
<plugin name="hosted_pro_payment_method" type="Magento\PaypalGraphQl\Model\Plugin\Cart\HostedPro\SetPaymentMethodOnCart"/>
<plugin name="payflowpro_payment_method" type="Magento\PaypalGraphQl\Model\Plugin\Cart\PayflowPro\SetPaymentMethodOnCart"/>
</type>
<type name="Magento\Paypal\Model\Payflowlink">
<plugin name="payflow_link_update_redirect_urls" type="Magento\PaypalGraphQl\Model\Plugin\Payflowlink"/>
Expand Down Expand Up @@ -53,4 +54,12 @@
</argument>
</arguments>
</type>

<type name="Magento\StoreGraphQl\Model\Resolver\Store\StoreConfigDataProvider">
<arguments>
<argument name="extendedConfigData" xsi:type="array">
<item name="payment_payflowpro_cc_vault_active" xsi:type="string">payment/payflowpro_cc_vault/active</item>
</argument>
</arguments>
</type>
</config>
3 changes: 3 additions & 0 deletions app/code/Magento/PaypalGraphQl/etc/graphql/events.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,7 @@
<event name="payment_method_assign_data_payflow_advanced">
<observer name="payflow_advanced_data_assigner" instance="Magento\PaypalGraphQl\Observer\PayflowLinkSetAdditionalData"/>
</event>
<event name="payment_method_assign_data_payflowpro">
<observer name="payflowpro_cc_data_assigner" instance="Magento\PaypalGraphQl\Observer\PayflowProSetCcData" />
</event>
</config>
5 changes: 5 additions & 0 deletions app/code/Magento/PaypalGraphQl/etc/schema.graphqls
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ input PayflowProTokenInput @doc(description:"Input required to fetch payment tok

input PayflowProInput @doc(description:"Required input for Payflow Pro and Payments Pro payment methods.") {
cc_details: CreditCardDetailsInput! @doc(description: "Required input for credit card related information")
is_active_payment_token_enabler: Boolean @doc(description:"States whether details about the customer's credit/debit card should be tokenized for later usage. Required only if Vault is enabled for PayPal Payflow Pro payment integration.")
}

input CreditCardDetailsInput @doc(description:"Required fields for Payflow Pro and Payments Pro credit card payments") {
Expand Down Expand Up @@ -141,3 +142,7 @@ input PayflowProResponseInput @doc(description:"Input required to complete payme
type PayflowProResponseOutput {
cart: Cart!
}

type StoreConfig {
payment_payflowpro_cc_vault_active: String @doc(description: "Payflow Pro vault status.")
}
Loading

0 comments on commit 6f4d800

Please sign in to comment.