Skip to content

Instantly share code, notes, and snippets.

@onamfc
Created July 12, 2019 01:29
Show Gist options
  • Save onamfc/9bd3b556fd85fc4f9a9d7c47b4f195b1 to your computer and use it in GitHub Desktop.
Save onamfc/9bd3b556fd85fc4f9a9d7c47b4f195b1 to your computer and use it in GitHub Desktop.
<?php
/* FILE LOCATION: /public_html/vendor/magento/module-authorizenet/Model/Directpost/Request.php */
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\Authorizenet\Model\Directpost;
use Magento\Authorizenet\Model\Request as AuthorizenetRequest;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Intl\DateTimeFactory;
/**
* Authorize.net request model for DirectPost model
* @deprecated 100.3.1 Authorize.net is removing all support for this payment method
*/
class Request extends AuthorizenetRequest
{
/**
* @var string
*/
protected $_transKey = null;
/**
* Hexadecimal signature key.
*
* @var string
*/
private $signatureKey = '';
/**
* @var DateTimeFactory
*/
private $dateTimeFactory;
/**
* @param array $data
* @param DateTimeFactory $dateTimeFactory
*/
public function __construct(
array $data = [],
DateTimeFactory $dateTimeFactory = null
) {
$this->dateTimeFactory = $dateTimeFactory ?? ObjectManager::getInstance()
->get(DateTimeFactory::class);
parent::__construct($data);
}
/**
* Return merchant transaction key.
*
* Needed to generate MD5 sign.
*
* @return string
*/
protected function _getTransactionKey()
{
return $this->_transKey;
}
/**
* Set merchant transaction key.
*
* Needed to generate MD5 sign.
*
* @param string $transKey
* @return $this
*/
protected function _setTransactionKey($transKey)
{
$this->_transKey = $transKey;
return $this;
}
/**
* Generates the MD5 fingerprint for request.
*
* @param string $merchantApiLoginId
* @param string $merchantTransactionKey
* @param string $amount
* @param string $currencyCode
* @param string $fpSequence An invoice number or random number.
* @param string $fpTimestamp
* @return string The fingerprint.
*/
public function generateRequestSign(
$merchantApiLoginId,
$merchantTransactionKey,
$amount,
$currencyCode,
$fpSequence,
$fpTimestamp
) {
return hash_hmac(
"md5",
$merchantApiLoginId . '^' . $fpSequence . '^' . $fpTimestamp . '^' . $amount . '^' . $currencyCode,
$merchantTransactionKey
);
}
/**
* Set Authorizenet data to request.
*
* @param \Magento\Authorizenet\Model\Directpost $paymentMethod
* @return $this
*/
public function setConstantData(\Magento\Authorizenet\Model\Directpost $paymentMethod)
{
$this->setXVersion('3.1')->setXDelimData('FALSE')->setXRelayResponse('TRUE');
$this->setSignatureKey($paymentMethod->getConfigData('signature_key'));
$this->setXLogin($paymentMethod->getConfigData('login'))
->setXMethod(\Magento\Authorizenet\Model\Authorizenet::REQUEST_METHOD_CC)
->setXRelayUrl($paymentMethod->getRelayUrl());
$this->_setTransactionKey($paymentMethod->getConfigData('trans_key'));
return $this;
}
/**
* Set entity data to request
*
* @param \Magento\Sales\Model\Order $order
* @param \Magento\Authorizenet\Model\Directpost $paymentMethod
* @return $this
*/
public function setDataFromOrder(
\Magento\Sales\Model\Order $order,
\Magento\Authorizenet\Model\Directpost $paymentMethod
) {
$payment = $order->getPayment();
$this->setXType($payment->getAnetTransType());
$this->setXFpSequence($order->getQuoteId());
$this->setXInvoiceNum($order->getIncrementId());
$this->setXAmount($payment->getBaseAmountAuthorized());
$this->setXCurrencyCode($order->getBaseCurrencyCode());
$this->setXTax(
sprintf('%.2F', $order->getBaseTaxAmount())
)->setXFreight(
sprintf('%.2F', $order->getBaseShippingAmount())
);
//need to use (string) because NULL values IE6-8 decodes as "null" in JSON in JavaScript,
//but we need "" for null values.
$billing = $order->getBillingAddress();
if (!empty($billing)) {
$this->setXFirstName((string)$billing->getFirstname())
->setXLastName((string)$billing->getLastname())
->setXCompany((string)$billing->getCompany())
->setXAddress((string)$billing->getStreetLine(1))
->setXCity((string)$billing->getCity())
->setXState((string)$billing->getRegion())
->setXZip((string)$billing->getPostcode())
->setXCountry((string)$billing->getCountryId())
->setXPhone((string)$billing->getTelephone())
->setXFax((string)$billing->getFax())
->setXCustId((string)$billing->getCustomerId())
->setXCustomerIp((string)$order->getRemoteIp())
->setXCustomerTaxId((string)$billing->getTaxId())
->setXEmail((string)$order->getCustomerEmail())
->setXEmailCustomer((string)$paymentMethod->getConfigData('email_customer'))
->setXMerchantEmail((string)$paymentMethod->getConfigData('merchant_email'));
}
$shipping = $order->getShippingAddress();
if (!empty($shipping)) {
$this->setXShipToFirstName(
(string)$shipping->getFirstname()
)->setXShipToLastName(
(string)$shipping->getLastname()
)->setXShipToCompany(
(string)$shipping->getCompany()
)->setXShipToAddress(
(string)$shipping->getStreetLine(1)
)->setXShipToCity(
(string)$shipping->getCity()
)->setXShipToState(
(string)$shipping->getRegion()
)->setXShipToZip(
(string)$shipping->getPostcode()
)->setXShipToCountry(
(string)$shipping->getCountryId()
);
}
$this->setXPoNum((string)$payment->getPoNumber());
return $this;
}
/**
* Set sign hash into the request object.
*
* All needed fields should be placed in the object first.
*
* @return $this
*/
public function signRequestData()
{
$fpDate = $this->dateTimeFactory->create('now', new \DateTimeZone('UTC'));
$fpTimestamp = $fpDate->getTimestamp();
if (!empty($this->getSignatureKey())) {
$hash = $this->generateSha2RequestSign(
(string)$this->getXLogin(),
(string)$this->getSignatureKey(),
(string)$this->getXAmount(),
(string)$this->getXCurrencyCode(),
(string)$this->getXFpSequence(),
$fpTimestamp
);
} else {
$hash = $this->generateRequestSign(
$this->getXLogin(),
$this->_getTransactionKey(),
$this->getXAmount(),
$this->getXCurrencyCode(),
$this->getXFpSequence(),
$fpTimestamp
);
}
$this->setXFpTimestamp($fpTimestamp);
$this->setXFpHash($hash);
return $this;
}
/**
* Generates the SHA2 fingerprint for request.
*
* @param string $merchantApiLoginId
* @param string $merchantSignatureKey
* @param string $amount
* @param string $currencyCode
* @param string $fpSequence An invoice number or random number.
* @param int $fpTimestamp
* @return string The fingerprint.
*/
private function generateSha2RequestSign(
string $merchantApiLoginId,
string $merchantSignatureKey,
string $amount,
string $currencyCode,
string $fpSequence,
int $fpTimestamp
): string {
$message = $merchantApiLoginId . '^' . $fpSequence . '^' . $fpTimestamp . '^' . $amount . '^' . $currencyCode;
return strtoupper(hash_hmac('sha512', $message, pack('H*', $merchantSignatureKey)));
}
/**
* Return merchant hexadecimal signature key.
*
* Needed to generate SHA2 sign.
*
* @return string
*/
private function getSignatureKey(): string
{
return $this->signatureKey;
}
/**
* Set merchant hexadecimal signature key.
*
* Needed to generate SHA2 sign.
*
* @param string $signatureKey
* @return void
*/
private function setSignatureKey(string $signatureKey)
{
$this->signatureKey = $signatureKey;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment