Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?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_Payment
- * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.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())
- ->setCcLast4(substr($data->getCcNumber(), -4))
- ->setCcNumber($data->getCcNumber())
- ->setCcCid($data->getCcCid())
- ->setCcExpMonth($data->getCcExpMonth())
- ->setCcExpYear($data->getCcExpYear());
- return $this;
- }
- /**
- * 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 (!$this->_validateExpDate($info->getCcExpYear(), $info->getCcExpMonth())) {
- $errorCode = 'ccsave_expiration,ccsave_expiration_yr';
- $errorMsg = $this->_getHelper()->__('Incorrect credit card expiration date');
- }
- 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(
- 'VI' => '/^4[0-9]{12}([0-9]{3})?$/', // Visa
- 'MC' => '/^5[1-5][0-9]{14}$/', // Master Card
- 'AE' => '/^3[47][0-9]{13}$/', // American Express
- 'DI' => '/^6011[0-9]{12}$/', // Discovery
- 'SS' => '/^((6759[0-9]{12})|(49[013][1356][0-9]{13})|(633[34][0-9]{12})|(633110[0-9]{10})|(564182[0-9]{10}))([0-9]{2,3})?$/'
- );
- foreach ($ccTypeRegExpList as $ccTypeMatch=>$ccTypeRegExp) {
- if (preg_match($ccTypeRegExp, $ccNumber)) {
- $ccType = $ccTypeMatch;
- break;
- }
- }
- if (!$this->OtherCcType($info->getCcType()) && $ccType!=$info->getCcType()) {
- $errorCode = 'ccsave_cc_type,ccsave_cc_number';
- $errorMsg = $this->_getHelper()->__('Credit card number mismatch with credit card type');
- }
- }
- else {
- $errorCode = 'ccsave_cc_number';
- $errorMsg = $this->_getHelper()->__('Invalid Credit Card Number');
- }
- }
- else {
- $errorCode = 'ccsave_cc_type';
- $errorMsg = $this->_getHelper()->__('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 = $this->_getHelper()->__('Please enter a valid credit card verification number.');
- }
- }
- if($errorMsg){
- Mage::throwException($errorMsg);
- //throw Mage::exception('Mage_Payment', $errorMsg, $errorCode);
- }
- 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]{4}$/',
- 'OT' => '/^[0-9]{3,4}$/'
- );
- 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);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement