| Server IP : 213.186.33.4 / Your IP : 216.73.216.59 Web Server : Apache System : Linux webm006.cluster103.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 User : awebpaca ( 35430) PHP Version : 8.5.0 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/awebpaca/boutiques/app/code/core/Mage/Paygate/Model/ |
Upload File : |
<?php
/**
* Magento
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@magentocommerce.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade Magento to newer
* versions in the future. If you wish to customize Magento for your
* needs please refer to http://www.magentocommerce.com for more information.
*
* @category Mage
* @package Mage_Paygate
* @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
class Mage_Paygate_Model_Authorizenet extends Mage_Payment_Model_Method_Cc
{
const CGI_URL = 'https://secure.authorize.net/gateway/transact.dll';
const REQUEST_METHOD_CC = 'CC';
const REQUEST_METHOD_ECHECK = 'ECHECK';
const REQUEST_TYPE_AUTH_CAPTURE = 'AUTH_CAPTURE';
const REQUEST_TYPE_AUTH_ONLY = 'AUTH_ONLY';
const REQUEST_TYPE_CAPTURE_ONLY = 'CAPTURE_ONLY';
const REQUEST_TYPE_CREDIT = 'CREDIT';
const REQUEST_TYPE_VOID = 'VOID';
const REQUEST_TYPE_PRIOR_AUTH_CAPTURE = 'PRIOR_AUTH_CAPTURE';
const ECHECK_ACCT_TYPE_CHECKING = 'CHECKING';
const ECHECK_ACCT_TYPE_BUSINESS = 'BUSINESSCHECKING';
const ECHECK_ACCT_TYPE_SAVINGS = 'SAVINGS';
const ECHECK_TRANS_TYPE_CCD = 'CCD';
const ECHECK_TRANS_TYPE_PPD = 'PPD';
const ECHECK_TRANS_TYPE_TEL = 'TEL';
const ECHECK_TRANS_TYPE_WEB = 'WEB';
const RESPONSE_DELIM_CHAR = ',';
const RESPONSE_CODE_APPROVED = 1;
const RESPONSE_CODE_DECLINED = 2;
const RESPONSE_CODE_ERROR = 3;
const RESPONSE_CODE_HELD = 4;
protected $_code = 'authorizenet';
/**
* Availability options
*/
protected $_isGateway = true;
protected $_canAuthorize = true;
protected $_canCapture = true;
protected $_canCapturePartial = false;
protected $_canRefund = false;
protected $_canVoid = true;
protected $_canUseInternal = true;
protected $_canUseCheckout = true;
protected $_canUseForMultishipping = true;
protected $_canSaveCc = false;
protected $_allowCurrencyCode = array('USD');
/**
* Fields that should be replaced in debug with '***'
*
* @var array
*/
protected $_debugReplacePrivateDataKeys = array('x_login', 'x_tran_key',
'x_card_num', 'x_exp_date',
'x_card_code', 'x_bank_aba_code',
'x_bank_name', 'x_bank_acct_num',
'x_bank_acct_type','x_bank_acct_name',
'x_echeck_type');
/**
* Check method for processing with base currency
*
* @param string $currencyCode
* @return boolean
*/
public function canUseForCurrency($currencyCode)
{
if (!in_array($currencyCode, $this->getAcceptedCurrencyCodes())) {
return false;
}
return true;
}
/**
* Return array of currency codes supplied by Payment Gateway
*
* @return array
*/
public function getAcceptedCurrencyCodes()
{
if (!$this->hasData('_accepted_currency')) {
$acceptedCurrencyCodes = $this->_allowCurrencyCode;
$acceptedCurrencyCodes[] = $this->getConfigData('currency');
$this->setData('_accepted_currency', $acceptedCurrencyCodes);
}
return $this->_getData('_accepted_currency');
}
/**
* Send authorize request to gateway
*
* @param Varien_Object $payment
* @param decimal $amount
* @return Mage_Paygate_Model_Authorizenet
* @throws Mage_Core_Exception
*/
public function authorize(Varien_Object $payment, $amount)
{
if ($amount <= 0) {
Mage::throwException(Mage::helper('paygate')->__('Invalid amount for authorization.'));
}
$payment->setAnetTransType(self::REQUEST_TYPE_AUTH_ONLY);
$payment->setAmount($amount);
$request= $this->_buildRequest($payment);
$result = $this->_postRequest($request);
$payment->setCcApproval($result->getApprovalCode())
->setLastTransId($result->getTransactionId())
->setTransactionId($result->getTransactionId())
->setIsTransactionClosed(0)
->setCcTransId($result->getTransactionId())
->setCcAvsStatus($result->getAvsResultCode())
->setCcCidStatus($result->getCardCodeResponseCode());
switch ($result->getResponseCode()) {
case self::RESPONSE_CODE_APPROVED:
$payment->setStatus(self::STATUS_APPROVED);
return $this;
case self::RESPONSE_CODE_DECLINED:
Mage::throwException(Mage::helper('paygate')->__('Payment authorization transaction has been declined.'));
default:
Mage::throwException(Mage::helper('paygate')->__('Payment authorization error.'));
}
}
/**
* Send capture request to gateway
*
* @param Varien_Object $payment
* @param decimal $amount
* @return Mage_Paygate_Model_Authorizenet
* @throws Mage_Core_Exception
*/
public function capture(Varien_Object $payment, $amount)
{
if ($payment->getCcTransId()) {
$payment->setAnetTransType(self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE);
} else {
$payment->setAnetTransType(self::REQUEST_TYPE_AUTH_CAPTURE);
}
$payment->setAmount($amount);
$request= $this->_buildRequest($payment);
$result = $this->_postRequest($request);
if ($result->getResponseCode() == self::RESPONSE_CODE_APPROVED) {
$payment->setStatus(self::STATUS_APPROVED);
//$payment->setCcTransId($result->getTransactionId());
$payment->setLastTransId($result->getTransactionId());
if (!$payment->getParentTransactionId() || $result->getTransactionId() != $payment->getParentTransactionId()) {
$payment->setTransactionId($result->getTransactionId());
}
return $this;
}
if ($result->getResponseReasonText()) {
Mage::throwException($this->_wrapGatewayError($result->getResponseReasonText()));
}
Mage::throwException(Mage::helper('paygate')->__('Error in capturing the payment.'));
}
/**
* Void the payment through gateway
*
* @param Varien_Object $payment
* @return Mage_Paygate_Model_Authorizenet
* @throws Mage_Core_Exception
*/
public function void(Varien_Object $payment)
{
if ($payment->getParentTransactionId()) {
$payment->setAnetTransType(self::REQUEST_TYPE_VOID);
$request = $this->_buildRequest($payment);
$request->setXTransId($payment->getParentTransactionId());
$result = $this->_postRequest($request);
if ($result->getResponseCode()==self::RESPONSE_CODE_APPROVED) {
$payment->setStatus(self::STATUS_SUCCESS );
return $this;
}
$payment->setStatus(self::STATUS_ERROR);
Mage::throwException($this->_wrapGatewayError($result->getResponseReasonText()));
}
$payment->setStatus(self::STATUS_ERROR);
Mage::throwException(Mage::helper('paygate')->__('Invalid transaction ID.'));
}
/**
* refund the amount with transaction id
*
* @param string $payment Varien_Object object
* @return Mage_Paygate_Model_Authorizenet
* @throws Mage_Core_Exception
*/
public function refund(Varien_Object $payment, $amount)
{
if ($payment->getRefundTransactionId() && $amount > 0) {
$payment->setAnetTransType(self::REQUEST_TYPE_CREDIT);
$request = $this->_buildRequest($payment);
$request->setXTransId($payment->getRefundTransactionId());
/**
* need to send last 4 digit credit card number to authorize.net
* otherwise it will give an error
*/
$request->setXCardNum($payment->getCcLast4());
$result = $this->_postRequest($request);
if ($result->getResponseCode()==self::RESPONSE_CODE_APPROVED) {
$payment->setStatus(self::STATUS_SUCCESS);
return $this;
}
Mage::throwException($this->_wrapGatewayError($result->getResponseReasonText()));
}
Mage::throwException(Mage::helper('paygate')->__('Error in refunding the payment.'));
}
/**
* Prepare request to gateway
*
* @link http://www.authorize.net/support/AIM_guide.pdf
* @param Mage_Sales_Model_Document $order
* @return unknown
*/
protected function _buildRequest(Varien_Object $payment)
{
$order = $payment->getOrder();
$this->setStore($order->getStoreId());
if (!$payment->getAnetTransMethod()) {
$payment->setAnetTransMethod(self::REQUEST_METHOD_CC);
}
$request = Mage::getModel('paygate/authorizenet_request')
->setXVersion(3.1)
->setXDelimData('True')
->setXDelimChar(self::RESPONSE_DELIM_CHAR)
->setXRelayResponse('False');
if ($order && $order->getIncrementId()) {
$request->setXInvoiceNum($order->getIncrementId());
}
$request->setXTestRequest($this->getConfigData('test') ? 'TRUE' : 'FALSE');
$request->setXLogin($this->getConfigData('login'))
->setXTranKey($this->getConfigData('trans_key'))
->setXType($payment->getAnetTransType())
->setXMethod($payment->getAnetTransMethod());
if($payment->getAmount()){
$request->setXAmount($payment->getAmount(),2);
$request->setXCurrencyCode($order->getBaseCurrencyCode());
}
switch ($payment->getAnetTransType()) {
case self::REQUEST_TYPE_CREDIT:
case self::REQUEST_TYPE_VOID:
case self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE:
$request->setXTransId($payment->getCcTransId());
break;
case self::REQUEST_TYPE_CAPTURE_ONLY:
$request->setXAuthCode($payment->getCcAuthCode());
break;
}
if (!empty($order)) {
$billing = $order->getBillingAddress();
if (!empty($billing)) {
$request->setXFirstName($billing->getFirstname())
->setXLastName($billing->getLastname())
->setXCompany($billing->getCompany())
->setXAddress($billing->getStreet(1))
->setXCity($billing->getCity())
->setXState($billing->getRegion())
->setXZip($billing->getPostcode())
->setXCountry($billing->getCountry())
->setXPhone($billing->getTelephone())
->setXFax($billing->getFax())
->setXCustId($billing->getCustomerId())
->setXCustomerIp($order->getRemoteIp())
->setXCustomerTaxId($billing->getTaxId())
->setXEmail($order->getCustomerEmail())
->setXEmailCustomer($this->getConfigData('email_customer'))
->setXMerchantEmail($this->getConfigData('merchant_email'));
}
$shipping = $order->getShippingAddress();
if (!empty($shipping)) {
$request->setXShipToFirstName($shipping->getFirstname())
->setXShipToLastName($shipping->getLastname())
->setXShipToCompany($shipping->getCompany())
->setXShipToAddress($shipping->getStreet(1))
->setXShipToCity($shipping->getCity())
->setXShipToState($shipping->getRegion())
->setXShipToZip($shipping->getPostcode())
->setXShipToCountry($shipping->getCountry());
}
$request->setXPoNum($payment->getPoNumber())
->setXTax($order->getTaxAmount())
->setXFreight($order->getShippingAmount());
}
switch ($payment->getAnetTransMethod()) {
case self::REQUEST_METHOD_CC:
if($payment->getCcNumber()){
$request->setXCardNum($payment->getCcNumber())
->setXExpDate(sprintf('%02d-%04d', $payment->getCcExpMonth(), $payment->getCcExpYear()))
->setXCardCode($payment->getCcCid());
}
break;
case self::REQUEST_METHOD_ECHECK:
$request->setXBankAbaCode($payment->getEcheckRoutingNumber())
->setXBankName($payment->getEcheckBankName())
->setXBankAcctNum($payment->getEcheckAccountNumber())
->setXBankAcctType($payment->getEcheckAccountType())
->setXBankAcctName($payment->getEcheckAccountName())
->setXEcheckType($payment->getEcheckType());
break;
}
return $request;
}
protected function _postRequest(Varien_Object $request)
{
$debugData = array('request' => $request->getData());
$result = Mage::getModel('paygate/authorizenet_result');
$client = new Varien_Http_Client();
$uri = $this->getConfigData('cgi_url');
$client->setUri($uri ? $uri : self::CGI_URL);
$client->setConfig(array(
'maxredirects'=>0,
'timeout'=>30,
//'ssltransport' => 'tcp',
));
$client->setParameterPost($request->getData());
$client->setMethod(Zend_Http_Client::POST);
try {
$response = $client->request();
}
catch (Exception $e) {
$result->setResponseCode(-1)
->setResponseReasonCode($e->getCode())
->setResponseReasonText($e->getMessage());
$debugData['result'] = $result->getData();
$this->_debug($debugData);
Mage::throwException($this->_wrapGatewayError($e->getMessage()));
}
$responseBody = $response->getBody();
$r = explode(self::RESPONSE_DELIM_CHAR, $responseBody);
if ($r) {
$result->setResponseCode((int)str_replace('"','',$r[0]))
->setResponseSubcode((int)str_replace('"','',$r[1]))
->setResponseReasonCode((int)str_replace('"','',$r[2]))
->setResponseReasonText($r[3])
->setApprovalCode($r[4])
->setAvsResultCode($r[5])
->setTransactionId($r[6])
->setInvoiceNumber($r[7])
->setDescription($r[8])
->setAmount($r[9])
->setMethod($r[10])
->setTransactionType($r[11])
->setCustomerId($r[12])
->setMd5Hash($r[37])
->setCardCodeResponseCode($r[38])
->setCAVVResponseCode( (isset($r[39])) ? $r[39] : null);
}
else {
Mage::throwException(
Mage::helper('paygate')->__('Error in payment gateway.')
);
}
$debugData['result'] = $result->getData();
$this->_debug($debugData);
return $result;
}
/**
* Gateway response wrapper
*
* @param string $text
* @return string
*/
protected function _wrapGatewayError($text)
{
return Mage::helper('paygate')->__('Gateway error: %s', $text);
}
}