/vendor/magento/module-paypal/Model/Direct.php
PHP | 511 lines | 225 code | 49 blank | 237 comment | 15 complexity | 88af8106e3d4891a1dcfff62a8ea9fe5 MD5 | raw file
- <?php
- /**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Paypal\Model;
- use Magento\Quote\Api\Data\PaymentInterface;
- use Magento\Sales\Model\Order\Payment;
- /**
- * PayPal Direct Module
- * @SuppressWarnings(PHPMD.TooManyFields)
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class Direct extends \Magento\Payment\Model\Method\Cc
- {
- /**
- * @var string
- */
- protected $_code = \Magento\Paypal\Model\Config::METHOD_WPP_DIRECT;
- /**
- * @var string
- */
- protected $_infoBlockType = 'Magento\Paypal\Block\Payment\Info';
- /**
- * Availability option
- *
- * @var bool
- */
- protected $_isGateway = true;
- /**
- * Availability option
- *
- * @var bool
- */
- protected $_canAuthorize = true;
- /**
- * Availability option
- *
- * @var bool
- */
- protected $_canCapture = true;
- /**
- * Availability option
- *
- * @var bool
- */
- protected $_canCapturePartial = true;
- /**
- * Availability option
- *
- * @var bool
- */
- protected $_canRefund = true;
- /**
- * Availability option
- *
- * @var bool
- */
- protected $_canRefundInvoicePartial = true;
- /**
- * Availability option
- *
- * @var bool
- */
- protected $_canVoid = true;
- /**
- * Availability option
- *
- * @var bool
- */
- protected $_canUseInternal = true;
- /**
- * Availability option
- *
- * @var bool
- */
- protected $_canUseCheckout = true;
- /**
- * Availability option
- *
- * @var bool
- */
- protected $_canSaveCc = false;
- /**
- * @var bool
- */
- protected $_canFetchTransactionInfo = true;
- /**
- * Availability option
- *
- * @var bool
- */
- protected $_canReviewPayment = true;
- /**
- * Website Payments Pro instance
- *
- * @var \Magento\Paypal\Model\Pro
- */
- protected $_pro;
- /**
- * @var \Magento\Store\Model\StoreManagerInterface
- */
- protected $_storeManager;
- /**
- * @var \Magento\Framework\UrlInterface
- */
- protected $_urlBuilder;
- /**
- * @var \Magento\Framework\App\RequestInterface
- */
- protected $_requestHttp;
- /**
- * @var \Magento\Paypal\Model\CartFactory
- */
- protected $_cartFactory;
- /**
- * @param \Magento\Framework\Model\Context $context
- * @param \Magento\Framework\Registry $registry
- * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
- * @param \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory
- * @param \Magento\Payment\Helper\Data $paymentData
- * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
- * @param \Magento\Payment\Model\Method\Logger $logger
- * @param \Magento\Framework\Module\ModuleListInterface $moduleList
- * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
- * @param ProFactory $proFactory
- * @param \Magento\Store\Model\StoreManagerInterface $storeManager
- * @param \Magento\Framework\UrlInterface $urlBuilder
- * @param \Magento\Framework\App\RequestInterface $requestHttp
- * @param CartFactory $cartFactory
- * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
- * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
- * @param array $data
- * @SuppressWarnings(PHPMD.ExcessiveParameterList)
- */
- public function __construct(
- \Magento\Framework\Model\Context $context,
- \Magento\Framework\Registry $registry,
- \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
- \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory,
- \Magento\Payment\Helper\Data $paymentData,
- \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
- \Magento\Payment\Model\Method\Logger $logger,
- \Magento\Framework\Module\ModuleListInterface $moduleList,
- \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
- \Magento\Paypal\Model\ProFactory $proFactory,
- \Magento\Store\Model\StoreManagerInterface $storeManager,
- \Magento\Framework\UrlInterface $urlBuilder,
- \Magento\Framework\App\RequestInterface $requestHttp,
- \Magento\Paypal\Model\CartFactory $cartFactory,
- \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
- \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
- array $data = []
- ) {
- parent::__construct(
- $context,
- $registry,
- $extensionFactory,
- $customAttributeFactory,
- $paymentData,
- $scopeConfig,
- $logger,
- $moduleList,
- $localeDate,
- $resource,
- $resourceCollection,
- $data
- );
- $this->_storeManager = $storeManager;
- $this->_urlBuilder = $urlBuilder;
- $this->_requestHttp = $requestHttp;
- $this->_cartFactory = $cartFactory;
- $proInstance = array_shift($data);
- if ($proInstance && $proInstance instanceof \Magento\Paypal\Model\Pro) {
- $this->_pro = $proInstance;
- } else {
- $this->_pro = $proFactory->create();
- }
- $this->_pro->setMethod($this->_code);
- }
- /**
- * Store setter
- * Also updates store ID in config object
- *
- * @param \Magento\Store\Model\Store|int $store
- * @return $this
- */
- public function setStore($store)
- {
- $this->setData('store', $store);
- if (null === $store) {
- $store = $this->_storeManager->getStore()->getId();
- }
- $this->_pro->getConfig()->setStoreId(is_object($store) ? $store->getId() : $store);
- return $this;
- }
- /**
- * Whether method is available for specified currency
- *
- * @param string $currencyCode
- * @return bool
- */
- public function canUseForCurrency($currencyCode)
- {
- return $this->_pro->getConfig()->isCurrencyCodeSupported($currencyCode);
- }
- /**
- * Payment action getter compatible with payment model
- *
- * @see \Magento\Sales\Model\Payment::place()
- * @return string
- */
- public function getConfigPaymentAction()
- {
- return $this->_pro->getConfig()->getPaymentAction();
- }
- /**
- * Return available CC types for gateway based on merchant country
- *
- * @return string
- */
- public function getAllowedCcTypes()
- {
- $ccTypes = explode(',', $this->_pro->getConfig()->getValue('cctypes'));
- $country = $this->_pro->getConfig()->getMerchantCountry();
- if ($country == 'GB') {
- $ccTypes = array_intersect(['SM', 'SO', 'MC', 'DI', 'VI'], $ccTypes);
- } elseif ($country == 'CA') {
- $ccTypes = array_intersect(['MC', 'VI'], $ccTypes);
- }
- return implode(',', $ccTypes);
- }
- /**
- * Check whether payment method can be used
- *
- * @param \Magento\Quote\Api\Data\CartInterface|\Magento\Quote\Model\Quote|null $quote
- * @return bool
- */
- public function isAvailable(\Magento\Quote\Api\Data\CartInterface $quote = null)
- {
- return parent::isAvailable($quote) && $this->_pro->getConfig()->isMethodAvailable();
- }
- /**
- * Custom getter for payment configuration
- *
- * @param string $field
- * @param int|null $storeId
- * @return null|string
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function getConfigData($field, $storeId = null)
- {
- $value = null;
- switch ($field) {
- case 'cctypes':
- $value = $this->getAllowedCcTypes();
- break;
- case 'order_place_redirect_url':
- $value = $this->getOrderPlaceRedirectUrl();
- break;
- default:
- $value = $this->_pro->getConfig()->getValue($field);
- }
- return $value;
- }
- /**
- * Authorize payment
- *
- * @param \Magento\Framework\DataObject|\Magento\Payment\Model\InfoInterface|Payment $payment
- * @param float $amount
- * @return $this
- */
- public function authorize(\Magento\Payment\Model\InfoInterface $payment, $amount)
- {
- return $this->_placeOrder($payment, $amount);
- }
- /**
- * Void payment
- *
- * @param \Magento\Framework\DataObject|\Magento\Payment\Model\InfoInterface|Payment $payment
- * @return $this
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- public function void(\Magento\Payment\Model\InfoInterface $payment)
- {
- $this->_pro->void($payment);
- return $this;
- }
- /**
- * Capture payment
- *
- * @param \Magento\Framework\DataObject|\Magento\Payment\Model\InfoInterface|Payment $payment
- * @param float $amount
- * @return $this
- */
- public function capture(\Magento\Payment\Model\InfoInterface $payment, $amount)
- {
- if (false === $this->_pro->capture($payment, $amount)) {
- $this->_placeOrder($payment, $amount);
- }
- return $this;
- }
- /**
- * Refund capture
- *
- * @param \Magento\Framework\DataObject|\Magento\Payment\Model\InfoInterface|Payment $payment
- * @param float $amount
- * @return $this
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- public function refund(\Magento\Payment\Model\InfoInterface $payment, $amount)
- {
- $this->_pro->refund($payment, $amount);
- return $this;
- }
- /**
- * Cancel payment
- *
- * @param \Magento\Framework\DataObject|\Magento\Payment\Model\InfoInterface|Payment $payment
- * @return $this
- */
- public function cancel(\Magento\Payment\Model\InfoInterface $payment)
- {
- $this->void($payment);
- return $this;
- }
- /**
- * Whether payment can be reviewed
- * @return bool
- */
- public function canReviewPayment()
- {
- return parent::canReviewPayment() && $this->_pro->canReviewPayment($this->getInfoInstance());
- }
- /**
- * Attempt to accept a pending payment
- *
- * @param \Magento\Payment\Model\Info|Payment $payment
- * @return bool
- */
- public function acceptPayment(\Magento\Payment\Model\InfoInterface $payment)
- {
- parent::acceptPayment($payment);
- return $this->_pro->reviewPayment($payment, \Magento\Paypal\Model\Pro::PAYMENT_REVIEW_ACCEPT);
- }
- /**
- * Attempt to deny a pending payment
- *
- * @param \Magento\Payment\Model\Info|PaymentInterface $payment
- * @return bool
- */
- public function denyPayment(\Magento\Payment\Model\InfoInterface $payment)
- {
- parent::denyPayment($payment);
- return $this->_pro->reviewPayment($payment, \Magento\Paypal\Model\Pro::PAYMENT_REVIEW_DENY);
- }
- /**
- * Fetch transaction details info
- *
- * @param \Magento\Payment\Model\InfoInterface $payment
- * @param string $transactionId
- * @return array
- */
- public function fetchTransactionInfo(\Magento\Payment\Model\InfoInterface $payment, $transactionId)
- {
- return $this->_pro->fetchTransactionInfo($payment, $transactionId);
- }
- /**
- * Place an order with authorization or capture action
- *
- * @param Payment $payment
- * @param float $amount
- * @return $this
- */
- protected function _placeOrder(Payment $payment, $amount)
- {
- $order = $payment->getOrder();
- $api = $this->_pro->getApi()->setPaymentAction(
- $this->_pro->getConfig()->getValue('paymentAction')
- )->setIpAddress(
- $this->_requestHttp->getClientIp(false)
- )->setAmount(
- $amount
- )->setCurrencyCode(
- $order->getBaseCurrencyCode()
- )->setInvNum(
- $order->getIncrementId()
- )->setEmail(
- $order->getCustomerEmail()
- )->setNotifyUrl(
- $this->_urlBuilder->getUrl('paypal/ipn/')
- )->setCreditCardType(
- $payment->getCcType()
- )->setCreditCardNumber(
- $payment->getCcNumber()
- )->setCreditCardExpirationDate(
- $this->_getFormattedCcExpirationDate($payment->getCcExpMonth(), $payment->getCcExpYear())
- )->setCreditCardCvv2(
- $payment->getCcCid()
- )->setMaestroSoloIssueNumber(
- $payment->getCcSsIssue()
- );
- if ($payment->getCcSsStartMonth() && $payment->getCcSsStartYear()) {
- $year = sprintf('%02d', substr($payment->getCcSsStartYear(), -2, 2));
- $api->setMaestroSoloIssueDate($this->_getFormattedCcExpirationDate($payment->getCcSsStartMonth(), $year));
- }
- // add shipping and billing addresses
- if ($order->getIsVirtual()) {
- $api->setAddress($order->getBillingAddress())->setSuppressShipping(true);
- } else {
- $api->setAddress($order->getShippingAddress());
- $api->setBillingAddress($order->getBillingAddress());
- }
- // add line items
- $cart = $this->_cartFactory->create(['salesModel' => $order]);
- $api->setPaypalCart($cart)->setIsLineItemsEnabled($this->_pro->getConfig()->getValue('lineItemsEnabled'));
- // call api and import transaction and other payment information
- $api->callDoDirectPayment();
- $this->_importResultToPayment($api, $payment);
- try {
- $api->callGetTransactionDetails();
- } catch (\Magento\Framework\Exception\LocalizedException $e) {
- // if we receive errors, but DoDirectPayment response is Success, then set Pending status for transaction
- $payment->setIsTransactionPending(true);
- }
- $this->_importResultToPayment($api, $payment);
- return $this;
- }
- /**
- * Format credit card expiration date based on month and year values
- * Format: mmyyyy
- *
- * @param string|int $month
- * @param string|int $year
- * @return string
- */
- protected function _getFormattedCcExpirationDate($month, $year)
- {
- return sprintf('%02d%02d', $month, $year);
- }
- /**
- * Import direct payment results to payment
- *
- * @param \Magento\Paypal\Model\Api\Nvp $api
- * @param Payment $payment
- * @return void
- */
- protected function _importResultToPayment($api, $payment)
- {
- $payment->setTransactionId($api->getTransactionId())->setIsTransactionClosed(0);
- $this->_pro->importPaymentInfo($api, $payment);
- }
- /**
- * Check void availability
- * @return bool
- * @internal param \Magento\Framework\DataObject $payment
- */
- public function canVoid()
- {
- return $this->_canVoid;
- }
- }