Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Public Member Functions | Data Fields | Protected Member Functions | Protected Attributes
Payflowlink Class Reference
Inheritance diagram for Payflowlink:
Payflowpro GatewayInterface Payflowadvanced

Public Member Functions

 __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\Store\Model\StoreManagerInterface $storeManager, ConfigInterfaceFactory $configFactory, \Magento\Paypal\Model\Payflow\Service\Gateway $gateway, HandlerInterface $errorHandler, \Magento\Framework\Math\Random $mathRandom, \Magento\Paypal\Model\Payflow\RequestFactory $requestFactory, \Magento\Quote\Api\CartRepositoryInterface $quoteRepository, \Magento\Sales\Model\OrderFactory $orderFactory, \Magento\Framework\App\RequestInterface $requestHttp, \Magento\Store\Model\WebsiteFactory $websiteFactory, OrderSender $orderSender, \Magento\Framework\Model\ResourceModel\AbstractResource $resource=null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection=null, array $data=[])
 
 validate ()
 
 isAvailable (\Magento\Quote\Api\Data\CartInterface $quote=null)
 
 isActive ($storeId=null)
 
 getResponse ()
 
 process ($responseData)
 
- Public Member Functions inherited from Payflowpro
 __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\Store\Model\StoreManagerInterface $storeManager, ConfigInterfaceFactory $configFactory, Gateway $gateway, HandlerInterface $errorHandler, \Magento\Framework\Model\ResourceModel\AbstractResource $resource=null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection=null, array $data=[])
 
 isAvailable (\Magento\Quote\Api\Data\CartInterface $quote=null)
 
 isActive ($storeId=null)
 
 getConfigPaymentAction ()
 
 authorize (\Magento\Payment\Model\InfoInterface $payment, $amount)
 
 capture (\Magento\Payment\Model\InfoInterface $payment, $amount)
 
 void (\Magento\Payment\Model\InfoInterface $payment)
 
 canVoid ()
 
 cancel (\Magento\Payment\Model\InfoInterface $payment)
 
 refund (\Magento\Payment\Model\InfoInterface $payment, $amount)
 
 fetchTransactionInfo (InfoInterface $payment, $transactionId)
 
 getConfig ()
 
 postRequest (DataObject $request, ConfigInterface $config)
 
 processErrors (DataObject $response)
 
 acceptPayment (InfoInterface $payment)
 
 denyPayment (InfoInterface $payment)
 
 reviewPayment (InfoInterface $payment, $action)
 
 setBilling (DataObject $request, $billing)
 
 setShipping ($request, $shipping)
 
 mapGatewayResponse (array $postData, DataObject $response)
 
 setTransStatus ($payment, $response)
 
 fillCustomerContacts (DataObject $order, DataObject $request)
 
 addRequestOrderInfo (DataObject $request, Order $order)
 
 assignData (DataObject $data)
 

Data Fields

const LAYOUT_TEMPLATE = 'mobile'
 
const TRANSACTION_PAYFLOW_URL = 'https://payflowlink.paypal.com/'
 
const RESPONSE_ERROR_MSG = 'Payment error. %s was not found.'
 
- Data Fields inherited from Payflowpro
const TRXTYPE_AUTH_ONLY = 'A'
 
const TRXTYPE_SALE = 'S'
 
const TRXTYPE_CREDIT = 'C'
 
const TRXTYPE_DELAYED_CAPTURE = 'D'
 
const TRXTYPE_DELAYED_VOID = 'V'
 
const TRXTYPE_DELAYED_VOICE = 'F'
 
const TRXTYPE_DELAYED_INQUIRY = 'I'
 
const TRXTYPE_ACCEPT_DENY = 'U'
 
const UPDATEACTION_APPROVED = 'APPROVE'
 
const UPDATEACTION_DECLINED_BY_MERCHANT = 'FPS_MERCHANT_DECLINE'
 
const TENDER_CC = 'C'
 
const TRANSACTION_URL = 'https://payflowpro.paypal.com/transaction'
 
const TRANSACTION_URL_TEST_MODE = 'https://pilot-payflowpro.paypal.com/transaction'
 
const RESPONSE_CODE_APPROVED = 0
 
const RESPONSE_CODE_INVALID_AMOUNT = 4
 
const RESPONSE_CODE_FRAUDSERVICE_FILTER = 126
 
const RESPONSE_CODE_DECLINED = 12
 
const RESPONSE_CODE_DECLINED_BY_FILTER = 125
 
const RESPONSE_CODE_DECLINED_BY_MERCHANT = 128
 
const RESPONSE_CODE_CAPTURE_ERROR = 111
 
const RESPONSE_CODE_VOID_ERROR = 108
 
const PNREF = 'pnref'
 

Protected Member Functions

 _processOrder (\Magento\Sales\Model\Order $order)
 
 _getOrderFromResponse ()
 
 _buildTokenRequest (\Magento\Sales\Model\Order\Payment $payment)
 
 _getStoreId ()
 
 _getTrxTokenType ()
 
 _processTokenErrors ($response, $payment)
 
 _getSecureSilentPostHash ($payment)
 
 _generateSecureSilentPostHash ($payment)
 
- Protected Member Functions inherited from Payflowpro
 _getCaptureAmount ($amount)
 
 _buildPlaceRequest (DataObject $payment, $amount)
 
 transactionInquiryRequest (InfoInterface $payment, $transactionId)
 

Protected Attributes

 $_callbackController = 'payflow'
 
 $_code = \Magento\Paypal\Model\Config::METHOD_PAYFLOWLINK
 
 $_formBlockType = \Magento\Paypal\Block\Payflow\Link\Form::class
 
 $_infoBlockType = \Magento\Paypal\Block\Payment\Info::class
 
 $_canUseInternal = false
 
 $_isInitializeNeeded = true
 
 $_response
 
 $_secureSilentPostHashKey = 'secure_silent_post_hash'
 
 $_requestFactory
 
 $quoteRepository
 
 $_orderFactory
 
 $_websiteFactory
 
 $orderSender
 
- Protected Attributes inherited from Payflowpro
 $_responseParamsMappings
 
 $_code = \Magento\Paypal\Model\Config::METHOD_PAYFLOWPRO
 
 $_isGateway = true
 
 $_canAuthorize = true
 
 $_canCapture = true
 
 $_canCapturePartial = true
 
 $_canRefund = true
 
 $_canRefundInvoicePartial = true
 
 $_canVoid = true
 
 $_canUseInternal = true
 
 $_canUseCheckout = true
 
 $_canSaveCc = false
 
 $_isProxy = false
 
 $_canFetchTransactionInfo = true
 
 $_canReviewPayment = true
 
 $_clientTimeout = 45
 
 $_debugReplacePrivateDataKeys = ['user', 'pwd', 'acct', 'expdate', 'cvv2']
 
 $storeManager
 
 $configFactory
 

Additional Inherited Members

- Static Protected Member Functions inherited from Payflowpro
static _isTransactionUnderReview ($status)
 

Detailed Description

Payflow Link payment gateway model @SuppressWarnings(PHPMD.CouplingBetweenObjects)

Definition at line 20 of file Payflowlink.php.

Constructor & Destructor Documentation

◆ __construct()

__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\Store\Model\StoreManagerInterface  $storeManager,
ConfigInterfaceFactory  $configFactory,
\Magento\Paypal\Model\Payflow\Service\Gateway  $gateway,
HandlerInterface  $errorHandler,
\Magento\Framework\Math\Random  $mathRandom,
\Magento\Paypal\Model\Payflow\RequestFactory  $requestFactory,
\Magento\Quote\Api\CartRepositoryInterface  $quoteRepository,
\Magento\Sales\Model\OrderFactory  $orderFactory,
\Magento\Framework\App\RequestInterface  $requestHttp,
\Magento\Store\Model\WebsiteFactory  $websiteFactory,
OrderSender  $orderSender,
\Magento\Framework\Model\ResourceModel\AbstractResource  $resource = null,
\Magento\Framework\Data\Collection\AbstractDb  $resourceCollection = null,
array  $data = [] 
)
Parameters
\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\Store\Model\StoreManagerInterface$storeManager
ConfigInterfaceFactory$configFactory
Payflow\Service\Gateway$gateway
HandlerInterface$errorHandler
\Magento\Framework\Math\Random$mathRandom
Payflow\RequestFactory$requestFactory
\Magento\Quote\Api\CartRepositoryInterface$quoteRepository
\Magento\Sales\Model\OrderFactory$orderFactory
\Magento\Framework\App\RequestInterface$requestHttp
\Magento\Store\Model\WebsiteFactory$websiteFactory
OrderSender$orderSender
\Magento\Framework\Model\ResourceModel\AbstractResource$resource
\Magento\Framework\Data\Collection\AbstractDb$resourceCollection
array$data@SuppressWarnings(PHPMD.ExcessiveParameterList)

Definition at line 145 of file Payflowlink.php.

169  {
170  $this->_requestFactory = $requestFactory;
171  $this->quoteRepository = $quoteRepository;
172  $this->_orderFactory = $orderFactory;
173  $this->_requestHttp = $requestHttp;
174  $this->_websiteFactory = $websiteFactory;
175  $this->orderSender = $orderSender;
176  parent::__construct(
177  $context,
178  $registry,
179  $extensionFactory,
180  $customAttributeFactory,
181  $paymentData,
182  $scopeConfig,
183  $logger,
184  $moduleList,
185  $localeDate,
188  $gateway,
189  $errorHandler,
190  $resource,
191  $resourceCollection,
192  $data
193  );
194  $this->mathRandom = $mathRandom;
195  }
$resource
Definition: bulk.php:12
$logger

Member Function Documentation

◆ _buildTokenRequest()

_buildTokenRequest ( \Magento\Sales\Model\Order\Payment  $payment)
protected

Build request for getting token

Parameters
\Magento\Sales\Model\Order\Payment$payment
Returns
\Magento\Framework\DataObject

Definition at line 422 of file Payflowlink.php.

423  {
424  $request = $this->buildBasicRequest();
425  $request->setCreatesecuretoken('Y')
426  ->setSecuretokenid($this->mathRandom->getUniqueHash())
427  ->setTrxtype($this->_getTrxTokenType());
428 
429  $order = $payment->getOrder();
430  $request->setAmt(sprintf('%.2F', $order->getBaseTotalDue()))
431  ->setCurrency($order->getBaseCurrencyCode());
433 
435  //pass store Id to request
436  $request->setData('USER1', $order->getStoreId());
437  $request->setData('USER2', $this->_getSecureSilentPostHash($payment));
438 
439  return $request;
440  }
$order
Definition: order.php:55
fillCustomerContacts(DataObject $order, DataObject $request)
Definition: Payflowpro.php:855
$payment
Definition: order.php:17
addRequestOrderInfo(DataObject $request, Order $order)
Definition: Payflowpro.php:876

◆ _generateSecureSilentPostHash()

_generateSecureSilentPostHash (   $payment)
protected

Generate end return new secure hash value

Parameters
\Magento\Sales\Model\Order\Payment$payment
Returns
string

Definition at line 559 of file Payflowlink.php.

560  {
561  $secureHash = md5($this->mathRandom->getRandomString(10));
562  $payment->setAdditionalInformation($this->_secureSilentPostHashKey, $secureHash);
563  return $secureHash;
564  }
$payment
Definition: order.php:17

◆ _getOrderFromResponse()

_getOrderFromResponse ( )
protected

Check response from Payflow gateway.

Returns
false|\Magento\Sales\Model\Order in case of validation passed
Exceptions

Definition at line 374 of file Payflowlink.php.

375  {
376  $response = $this->getResponse();
377  $order = $this->_orderFactory->create()->loadByIncrementId($response->getInvnum());
378 
379  if ($this->_getSecureSilentPostHash(
380  $order->getPayment()
381  ) != $response->getData('user2') || $this->_code != $order->getPayment()->getMethodInstance()->getCode()
382  ) {
383  return false;
384  }
385 
386  if ($response->getResult() != self::RESPONSE_CODE_FRAUDSERVICE_FILTER &&
387  $response->getResult() != self::RESPONSE_CODE_DECLINED_BY_FILTER &&
389  ) {
391  $order->registerCancellation($response->getRespmsg())->save();
392  }
393  throw new \Magento\Framework\Exception\LocalizedException(__($response->getRespmsg()));
394  }
395 
396  $amountCompared = $response->getAmt() == $order->getPayment()->getBaseAmountAuthorized() ? true : false;
397  if (!$order->getId() ||
399  !$amountCompared
400  ) {
401  throw new \Magento\Framework\Exception\LocalizedException(
402  __('Payment error. %value was not found.', ['value' => 'Order'])
403  );
404  }
405 
406  $fetchData = $this->fetchTransactionInfo($order->getPayment(), $response->getPnref());
407  if (!isset($fetchData['custref']) || $fetchData['custref'] != $order->getIncrementId()) {
408  throw new \Magento\Framework\Exception\LocalizedException(
409  __('Payment error. %value was not found.', ['value' => 'Transaction'])
410  );
411  }
412 
413  return $order;
414  }
$response
Definition: 404.php:11
fetchTransactionInfo(InfoInterface $payment, $transactionId)
Definition: Payflowpro.php:533
$order
Definition: order.php:55
__()
Definition: __.php:13

◆ _getSecureSilentPostHash()

_getSecureSilentPostHash (   $payment)
protected

Return secure hash value for silent post request

Parameters
\Magento\Sales\Model\Order\Payment$payment
Returns
string

Definition at line 548 of file Payflowlink.php.

549  {
550  return $payment->getAdditionalInformation($this->_secureSilentPostHashKey);
551  }
$payment
Definition: order.php:17

◆ _getStoreId()

_getStoreId ( )
protected

Get store id from response if exists or default

Returns
int

Definition at line 448 of file Payflowlink.php.

449  {
450  $response = $this->getResponse();
451  if ($response->getData('user1')) {
452  return (int)$response->getData('user1');
453  }
454  return $this->storeManager->getStore($this->getStore())->getId();
455  }
$response
Definition: 404.php:11

◆ _getTrxTokenType()

_getTrxTokenType ( )
protected

Get payment action code

Returns
string

Definition at line 503 of file Payflowlink.php.

504  {
505  switch ($this->getConfigData('payment_action')) {
506  case \Magento\Paypal\Model\Config::PAYMENT_ACTION_AUTH:
508  case \Magento\Paypal\Model\Config::PAYMENT_ACTION_SALE:
509  return self::TRXTYPE_SALE;
510  default:
511  break;
512  }
513  }

◆ _processOrder()

_processOrder ( \Magento\Sales\Model\Order  $order)
protected

Operate with order using information from silent post

Parameters
\Magento\Sales\Model\Order$order
Returns
void
Exceptions

Definition at line 308 of file Payflowlink.php.

309  {
310  $response = $this->getResponse();
311  $payment = $order->getPayment();
312  $payment->setTransactionId($response->getPnref())->setIsTransactionClosed(0);
313  $payment->setCcType($response->getData(OrderPaymentInterface::CC_TYPE));
314 
315  $canSendNewOrderEmail = true;
316  if ($response->getResult() == self::RESPONSE_CODE_FRAUDSERVICE_FILTER ||
318  ) {
319  $canSendNewOrderEmail = false;
320 
321  $payment->setIsTransactionPending(true)
322  ->setIsFraudDetected(true);
323 
324  $fraudMessage = $response->getData('respmsg');
325  if ($response->getData('fps_prexmldata')) {
326  $xml = new \SimpleXMLElement($response->getData('fps_prexmldata'));
327  $fraudMessage = (string)$xml->rule->triggeredMessage;
328  }
329  $payment->setAdditionalInformation(
331  $fraudMessage
332  );
333  }
334 
335  if ($response->getData('avsdata') && strstr(substr($response->getData('avsdata'), 0, 2), 'N')) {
336  $payment->setAdditionalInformation(Info::PAYPAL_AVS_CODE, substr($response->getData('avsdata'), 0, 2));
337  }
338 
339  if ($response->getData('cvv2match') && $response->getData('cvv2match') != 'Y') {
340  $payment->setAdditionalInformation(Info::PAYPAL_CVV_2_MATCH, $response->getData('cvv2match'));
341  }
342 
343  switch ($response->getType()) {
345  $payment->registerAuthorizationNotification($payment->getBaseAmountAuthorized());
346  break;
347  case self::TRXTYPE_SALE:
348  $payment->registerCaptureNotification($payment->getBaseAmountAuthorized());
349  break;
350  default:
351  break;
352  }
353  $order->save();
354 
355  try {
356  if ($canSendNewOrderEmail) {
357  $this->orderSender->send($order);
358  }
359  $quote = $this->quoteRepository->get($order->getQuoteId())->setIsActive(false);
360  $this->quoteRepository->save($quote);
361  } catch (\Exception $e) {
362  throw new \Magento\Framework\Exception\LocalizedException(__('We cannot send the new order email.'));
363  }
364  }
$response
Definition: 404.php:11
$quote
$order
Definition: order.php:55
__()
Definition: __.php:13
$payment
Definition: order.php:17

◆ _processTokenErrors()

_processTokenErrors (   $response,
  $payment 
)
protected

If response is failed throw exception Set token data in payment object

Parameters
\Magento\Framework\DataObject$response
\Magento\Sales\Model\Order\Payment$payment
Returns
void
Exceptions

Definition at line 524 of file Payflowlink.php.

525  {
526  if (!$response->getSecuretoken() &&
527  $response->getResult() != self::RESPONSE_CODE_APPROVED &&
529  ) {
530  throw new \Magento\Framework\Exception\LocalizedException(__($response->getRespmsg()));
531  } else {
532  $payment->setAdditionalInformation(
533  'secure_token_id',
534  $response->getSecuretokenid()
535  )->setAdditionalInformation(
536  'secure_token',
537  $response->getSecuretoken()
538  );
539  }
540  }
$response
Definition: 404.php:11
__()
Definition: __.php:13
$payment
Definition: order.php:17

◆ getResponse()

getResponse ( )

Return response model.

Returns
\Magento\Paypal\Model\Payflow\Request

Definition at line 271 of file Payflowlink.php.

272  {
273  if (!$this->_response) {
274  $this->_response = $this->_requestFactory->create();
275  }
276 
277  return $this->_response;
278  }

◆ isActive()

isActive (   $storeId = null)

Is active

Parameters
int | null$storeId
Returns
bool

Definition at line 225 of file Payflowlink.php.

226  {
227  return (bool)(int)$this->getConfigData('active', $storeId);
228  }

◆ isAvailable()

isAvailable ( \Magento\Quote\Api\Data\CartInterface  $quote = null)

Check whether payment method can be used

Parameters
\Magento\Quote\Api\Data\CartInterface | \Magento\Quote\Model\Quote | null$quote
Returns
bool
Exceptions

Definition at line 214 of file Payflowlink.php.

215  {
216  return AbstractMethod::isAvailable($quote) && $this->getConfig()->isMethodAvailable($this->getCode());
217  }
$quote
isAvailable(\Magento\Quote\Api\Data\CartInterface $quote=null)

◆ process()

process (   $responseData)

Operate with order using data from $_POST which came from Silent Post Url.

Parameters
array$responseData
Returns
void
Exceptions

Definition at line 287 of file Payflowlink.php.

288  {
289  $debugData = ['response' => $responseData];
290  $this->_debug($debugData);
291 
292  $this->mapGatewayResponse($responseData, $this->getResponse());
293  $order = $this->_getOrderFromResponse();
294  if ($order) {
295  $this->_processOrder($order);
296  }
297  }
mapGatewayResponse(array $postData, DataObject $response)
Definition: Payflowpro.php:781
$order
Definition: order.php:55

◆ validate()

validate ( )

Do not validate payment form using server methods

Returns
true

Definition at line 202 of file Payflowlink.php.

203  {
204  return true;
205  }

Field Documentation

◆ $_callbackController

$_callbackController = 'payflow'
protected

Definition at line 32 of file Payflowlink.php.

◆ $_canUseInternal

$_canUseInternal = false
protected

Definition at line 56 of file Payflowlink.php.

◆ $_code

Definition at line 39 of file Payflowlink.php.

◆ $_formBlockType

$_formBlockType = \Magento\Paypal\Block\Payflow\Link\Form::class
protected

Definition at line 44 of file Payflowlink.php.

◆ $_infoBlockType

$_infoBlockType = \Magento\Paypal\Block\Payment\Info::class
protected

Definition at line 49 of file Payflowlink.php.

◆ $_isInitializeNeeded

$_isInitializeNeeded = true
protected

Definition at line 63 of file Payflowlink.php.

◆ $_orderFactory

$_orderFactory
protected

Definition at line 102 of file Payflowlink.php.

◆ $_requestFactory

$_requestFactory
protected

Definition at line 92 of file Payflowlink.php.

◆ $_response

$_response
protected

Definition at line 70 of file Payflowlink.php.

◆ $_secureSilentPostHashKey

$_secureSilentPostHashKey = 'secure_silent_post_hash'
protected

Definition at line 87 of file Payflowlink.php.

◆ $_websiteFactory

$_websiteFactory
protected

Definition at line 107 of file Payflowlink.php.

◆ $orderSender

$orderSender
protected

Definition at line 112 of file Payflowlink.php.

◆ $quoteRepository

$quoteRepository
protected

Definition at line 97 of file Payflowlink.php.

◆ LAYOUT_TEMPLATE

const LAYOUT_TEMPLATE = 'mobile'

Default layout template

Definition at line 25 of file Payflowlink.php.

◆ RESPONSE_ERROR_MSG

const RESPONSE_ERROR_MSG = 'Payment error. %s was not found.'

Error message

Definition at line 80 of file Payflowlink.php.

◆ TRANSACTION_PAYFLOW_URL

const TRANSACTION_PAYFLOW_URL = 'https://payflowlink.paypal.com/'

Gateway request URL

Definition at line 75 of file Payflowlink.php.


The documentation for this class was generated from the following file: