"3.1", "delim_char" => ",", "delim_data" => "TRUE", "relay_response" => "FALSE", "encap_char" => "|", ); public $approved; public $declined; public $error; public $held; const APPROVED = 1; const DECLINED = 2; const ERROR = 3; const HELD = 4; const AUTHORIZE_DEFAULT_PAYMENT_CURRENCY = "USD"; /** * Constructor * * For php4 compatability we must not use the __constructor as a constructor for plugins * because func_get_args ( void ) returns a copy of all passed arguments NOT references. * This causes problems with cross-referencing necessary for the observer design pattern. * * @param object $subject The object to observe * @param array $config An array that holds the plugin configuration * @since 1.5 */ // instance of class function __construct (& $subject, $config) { parent::__construct($subject, $config); $this->_loggable = TRUE; $this->_tablepkey = 'id'; $this->_tableId = 'id'; $this->tableFields = array_keys($this->getTableSQLFields()); $varsToPush = $this->getVarsToPush(); //$this->setCryptedFields(array('transaction_key', 'sandbox_transaction_key')); $this->setConfigParameterable($this->_configTableFieldName, $varsToPush); } protected function getVmPluginCreateTableSQL () { return $this->createTableSQL('Payment AuthorizeNet Table'); } function getTableSQLFields () { $SQLfields = array( 'id' => 'int(1) UNSIGNED NOT NULL AUTO_INCREMENT', 'virtuemart_order_id' => 'int(1) UNSIGNED', 'order_number' => 'char(64)', 'virtuemart_paymentmethod_id' => 'mediumint(1) UNSIGNED', 'payment_name' => 'varchar(5000)', 'payment_order_total' => 'decimal(15,5) NOT NULL', 'payment_currency' => 'smallint(1)', 'return_context' => 'char(255)', 'cost_per_transaction' => 'decimal(10,2)', 'cost_percent_total' => 'char(10)', 'tax_id' => 'smallint(1)', 'authorizenet_response_authorization_code' => 'char(10)', 'authorizenet_response_transaction_id' => 'char(128)', 'authorizenet_response_response_code' => 'char(128)', 'authorizenet_response_response_subcode' => 'char(13)', 'authorizenet_response_response_reason_code' => 'decimal(10,2)', 'authorizenet_response_response_reason_text' => 'text', 'authorizenet_response_transaction_type' => 'char(50)', 'authorizenet_response_account_number' => 'char(4)', 'authorizenet_response_card_type' => 'char(128)', 'authorizenet_response_card_code_response' => 'char(5)', 'authorizenet_response_cavv_response' => 'char(1)', 'authorizeresponse_raw' => 'text' ); return $SQLfields; } /** * This shows the plugin for choosing in the payment list of the checkout process. * * @author Valerie Cartan Isaksen */ function plgVmDisplayListFEPayment (VirtueMartCart $cart, $selected = 0, &$htmlIn) { //JHTML::_ ('behavior.tooltip'); if ($this->getPluginMethods($cart->vendorId) === 0) { if (empty($this->_name)) { $app = JFactory::getApplication(); $app->enqueueMessage(vmText::_('COM_VIRTUEMART_CART_NO_' . strtoupper($this->_psType))); return FALSE; } else { return FALSE; } } $html = array(); $method_name = $this->_psType . '_name'; JHTML::script('vmcreditcard.js', 'components/com_virtuemart/assets/js/', FALSE); VmConfig::loadJLang('com_virtuemart', true); vmJsApi::jCreditCard(); $htmla = ''; $html = array(); foreach ($this->methods as $this->_currentMethod) { if ($this->checkConditions($cart, $this->_currentMethod, $cart->pricesUnformatted)) { $methodSalesPrice = $this->setCartPrices($cart, $cart->pricesUnformatted, $this->_currentMethod); $this->_currentMethod->$method_name = $this->renderPluginName($this->_currentMethod); $html = $this->getPluginHtml($this->_currentMethod, $selected, $methodSalesPrice); if ($selected == $this->_currentMethod->virtuemart_paymentmethod_id) { $this->_getAuthorizeNetFromSession(); } else { $this->_cc_type = ''; $this->_cc_number = ''; $this->_cc_cvv = ''; $this->_cc_expire_month = ''; $this->_cc_expire_year = ''; } if (empty($this->_currentMethod->creditcards)) { $this->_currentMethod->creditcards = self::getCreditCards(); } elseif (!is_array($this->_currentMethod->creditcards)) { $this->_currentMethod->creditcards = (array)$this->_currentMethod->creditcards; } $creditCards = $this->_currentMethod->creditcards; $creditCardList = ''; if ($creditCards) { $creditCardList = ($this->_renderCreditCardList($creditCards, $this->_cc_type, $this->_currentMethod->virtuemart_paymentmethod_id, FALSE)); } $sandbox_msg = ""; if ($this->_currentMethod->sandbox) { $sandbox_msg .= '
' . vmText::_('VMPAYMENT_AUTHORIZENET_SANDBOX_TEST_NUMBERS'); } $cvv_images = $this->_displayCVVImages($this->_currentMethod); $html .= '
' . vmText::_('VMPAYMENT_AUTHORIZENET_COMPLETE_FORM') . $sandbox_msg . '
' . $creditCardList . '
' . vmText::_('VMPAYMENT_AUTHORIZENET_WHATISCVV') . '
' . vmText::_('VMPAYMENT_AUTHORIZENET_EXDATE') . ' '; $html .= shopfunctions::listMonths('cc_expire_month_' . $this->_currentMethod->virtuemart_paymentmethod_id, $this->_cc_expire_month); $html .= " / "; $html .= ' '; $html .= shopfunctions::listYears('cc_expire_year_' . $this->_currentMethod->virtuemart_paymentmethod_id, $this->_cc_expire_year, NULL, null, " onchange=\"javascript:changeDate(" . $this->_currentMethod->virtuemart_paymentmethod_id . ", this);\" "); $html .= '
'; $html .= '
'; $htmla[] = $html; } } $htmlIn[] = $htmla; return TRUE; } /** */ static function getCreditCards () { return array( 'Visa', 'Mastercard', 'AmericanExpress', 'Discover', 'DinersClub', 'JCB', ); } /** * Check if the payment conditions are fulfilled for this payment method * * @author: Valerie Isaksen * * @param $cart_prices : cart prices * @param $payment * @return true: if the conditions are fulfilled, false otherwise * */ protected function checkConditions ($cart, $method, $cart_prices) { $this->convert_condition_amount($method); $amount = $this->getCartAmount($cart_prices); $address = (($cart->ST == 0) ? $cart->BT : $cart->ST); $amount_cond = ($amount >= $method->min_amount AND $amount <= $method->max_amount OR ($method->min_amount <= $amount AND ($method->max_amount == 0))); if (!$amount_cond) { return FALSE; } $countries = array(); if (!empty($method->countries)) { if (!is_array($method->countries)) { $countries[0] = $method->countries; } else { $countries = $method->countries; } } // probably did not gave his BT:ST address if (!is_array($address)) { $address = array(); $address['virtuemart_country_id'] = 0; } if (!isset($address['virtuemart_country_id'])) { $address['virtuemart_country_id'] = 0; } if (count($countries) == 0 || in_array($address['virtuemart_country_id'], $countries) || count($countries) == 0) { return TRUE; } return FALSE; } function _setAuthorizeNetIntoSession () { if (!class_exists('vmCrypt')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'vmcrypt.php'); } $session = JFactory::getSession(); $sessionAuthorizeNet = new stdClass(); // card information $sessionAuthorizeNet->cc_type = $this->_cc_type; $sessionAuthorizeNet->cc_number = vmCrypt::encrypt($this->_cc_number); $sessionAuthorizeNet->cc_cvv = vmCrypt::encrypt($this->_cc_cvv); $sessionAuthorizeNet->cc_expire_month = $this->_cc_expire_month; $sessionAuthorizeNet->cc_expire_year = $this->_cc_expire_year; $sessionAuthorizeNet->cc_valid = $this->_cc_valid; $session->set('authorizenet', json_encode($sessionAuthorizeNet), 'vm'); } function _getAuthorizeNetFromSession () { if (!class_exists('vmCrypt')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'vmcrypt.php'); } $session = JFactory::getSession(); $authorizenetSession = $session->get('authorizenet', 0, 'vm'); if (!empty($authorizenetSession)) { $authorizenetData = (object)json_decode($authorizenetSession, true); $this->_cc_type = $authorizenetData->cc_type; $this->_cc_number = vmCrypt::decrypt($authorizenetData->cc_number); $this->_cc_cvv = vmCrypt::decrypt($authorizenetData->cc_cvv); $this->_cc_expire_month = $authorizenetData->cc_expire_month; $this->_cc_expire_year = $authorizenetData->cc_expire_year; $this->_cc_valid = $authorizenetData->cc_valid; } } /** * This is for checking the input data of the payment method within the checkout * * @author Valerie Cartan Isaksen */ function plgVmOnCheckoutCheckDataPayment (VirtueMartCart $cart) { if (!$this->selectedThisByMethodId($cart->virtuemart_paymentmethod_id)) { return NULL; // Another method was selected, do nothing } if (!($this->_currentMethod = $this->getVmPluginMethod($cart->virtuemart_paymentmethod_id))) { return FALSE; } $this->_getAuthorizeNetFromSession(); } /** * Create the table for this plugin if it does not yet exist. * This functions checks if the called plugin is active one. * When yes it is calling the standard method to create the tables * */ function plgVmOnStoreInstallPaymentPluginTable ($jplugin_id) { return parent::onStoreInstallPluginTable($jplugin_id); } /** * This is for adding the input data of the payment method to the cart, after selecting * * @author Valerie Isaksen * * @param VirtueMartCart $cart * @return null if payment not selected; true if card infos are correct; string containing the errors id cc is not valid */ public function plgVmOnSelectCheckPayment (VirtueMartCart $cart, &$msg) { if (!$this->selectedThisByMethodId($cart->virtuemart_paymentmethod_id)) { return null; // Another method was selected, do nothing } if (!($this->_currentMethod = $this->getVmPluginMethod($cart->virtuemart_paymentmethod_id))) { return FALSE; } if (vRequest::getInt('virtuemart_paymentmethod_id')) { //$cart->creditcard_id = vRequest::getVar('creditcard', '0'); $this->_cc_type = vRequest::getVar('cc_type_' . $cart->virtuemart_paymentmethod_id, ''); $this->_cc_name = vRequest::getVar('cc_name_' . $cart->virtuemart_paymentmethod_id, ''); $this->_cc_number = str_replace(" ", "", vRequest::getVar('cc_number_' . $cart->virtuemart_paymentmethod_id, '')); $this->_cc_cvv = vRequest::getVar('cc_cvv_' . $cart->virtuemart_paymentmethod_id, ''); $this->_cc_expire_month = vRequest::getVar('cc_expire_month_' . $cart->virtuemart_paymentmethod_id, ''); $this->_cc_expire_year = vRequest::getVar('cc_expire_year_' . $cart->virtuemart_paymentmethod_id, ''); if (!$this->_validate_creditcard_data(TRUE)) { return FALSE; // returns string containing errors } $this->_setAuthorizeNetIntoSession(); } return TRUE; } public function plgVmOnSelectedCalculatePricePayment (VirtueMartCart $cart, array &$cart_prices, &$payment_name) { if (!($this->_currentMethod = $this->getVmPluginMethod($cart->virtuemart_paymentmethod_id))) { return NULL; // Another method was selected, do nothing } if (!$this->selectedThisElement($this->_currentMethod->payment_element)) { return FALSE; } $this->_getAuthorizeNetFromSession(); $cart_prices['payment_tax_id'] = 0; $cart_prices['payment_value'] = 0; if (!$this->checkConditions($cart, $this->_currentMethod, $cart_prices)) { return FALSE; } $payment_name = $this->renderPluginName($this->_currentMethod); $this->setCartPrices($cart, $cart_prices, $this->_currentMethod); return TRUE; } /* * @param $plugin plugin */ protected function renderPluginName ($plugin) { $return = ''; $plugin_name = $this->_psType . '_name'; $plugin_desc = $this->_psType . '_desc'; $description = ''; // $params = new JParameter($plugin->$plugin_params); // $logo = $params->get($this->_psType . '_logos'); $logosFieldName = $this->_psType . '_logos'; $logos = $plugin->$logosFieldName; if (!empty($logos)) { $return = $this->displayLogos($logos) . ' '; } $sandboxWarning = ''; if ($plugin->sandbox) { $sandboxWarning .= ' Sandbox (' . $plugin->virtuemart_paymentmethod_id . ')
'; } if (!empty($plugin->$plugin_desc)) { $description = '' . $plugin->$plugin_desc . ''; } $this->_getAuthorizeNetFromSession(); $extrainfo = $this->getExtraPluginNameInfo(); $pluginName = $return . '' . $plugin->$plugin_name . '' . $description; $pluginName .= $sandboxWarning . $extrainfo; return $pluginName; } /** * Display stored payment data for an order * * @see components/com_virtuemart/helpers/vmPaymentPlugin::plgVmOnShowOrderPaymentBE() */ function plgVmOnShowOrderBEPayment ($virtuemart_order_id, $virtuemart_payment_id) { if (!($this->_currentMethod = $this->selectedThisByMethodId($virtuemart_payment_id))) { return NULL; // Another method was selected, do nothing } if (!($paymentTable = $this->getDataByOrderId($virtuemart_order_id))) { return NULL; } VmConfig::loadJLang('com_virtuemart'); $html = '' . "\n"; $html .= $this->getHtmlHeaderBE(); $html .= $this->getHtmlRowBE('COM_VIRTUEMART_PAYMENT_NAME', $paymentTable->payment_name); $html .= $this->getHtmlRowBE('AUTHORIZENET_PAYMENT_ORDER_TOTAL', $paymentTable->payment_order_total . " " . self::AUTHORIZE_DEFAULT_PAYMENT_CURRENCY); $html .= $this->getHtmlRowBE('AUTHORIZENET_COST_PER_TRANSACTION', $paymentTable->cost_per_transaction); $html .= $this->getHtmlRowBE('AUTHORIZENET_COST_PERCENT_TOTAL', $paymentTable->cost_percent_total); $code = "authorizenet_response_"; foreach ($paymentTable as $key => $value) { if (substr($key, 0, strlen($code)) == $code) { $html .= $this->getHtmlRowBE($key, $value); } } $html .= '
' . "\n"; return $html; } /** * Reimplementation of vmPaymentPlugin::plgVmOnConfirmedOrderStorePaymentData() * * @author Valerie Isaken * * function plgVmOnConfirmedOrderStoreDataPayment( $virtuemart_order_id, VirtueMartCart $cart, $prices) { * return null; * } */ /** * Reimplementation of vmPaymentPlugin::plgVmOnConfirmedOrder() * * @link http://www.authorize.net/support/AIM_guide.pdf * Credit Cards Test Numbers * Visa Test Account 4007000000027 * Amex Test Account 370000000000002 * Master Card Test Account 6011000000000012 * Discover Test Account 5424000000000015 * @author Valerie Isaksen */ function plgVmConfirmedOrder (VirtueMartCart $cart, $order) { if (!($this->_currentMethod = $this->getVmPluginMethod($order['details']['BT']->virtuemart_paymentmethod_id))) { return NULL; // Another method was selected, do nothing } if (!$this->selectedThisElement($this->_currentMethod->payment_element)) { return FALSE; } $this->setInConfirmOrder($cart); $usrBT = $order['details']['BT']; $usrST = ((isset($order['details']['ST'])) ? $order['details']['ST'] : ''); $session = JFactory::getSession(); $return_context = $session->getId(); $payment_currency_id = shopFunctions::getCurrencyIDByName(self::AUTHORIZE_DEFAULT_PAYMENT_CURRENCY); $totalInPaymentCurrency = vmPSPlugin::getAmountInCurrency($order['details']['BT']->order_total, $payment_currency_id); $cd = CurrencyDisplay::getInstance($cart->pricesCurrency); // Set up data $formdata = array(); $formdata = array_merge($this->_setHeader(), $formdata); $formdata = array_merge($this->_setResponseConfiguration(), $formdata); $formdata = array_merge($this->_setBillingInformation($usrBT), $formdata); if (!empty($usrST)) { $formdata = array_merge($this->_setShippingInformation($usrST), $formdata); } $formdata = array_merge($this->_setTransactionData($order['details']['BT'], $totalInPaymentCurrency['value']), $formdata); $formdata = array_merge($this->_setMerchantData(), $formdata); // prepare the array to post $poststring = ''; foreach ($formdata AS $key => $val) { $poststring .= urlencode($key) . "=" . urlencode($val) . "&"; } $poststring = rtrim($poststring, "& "); // Prepare data that should be stored in the database $dbValues['order_number'] = $order['details']['BT']->order_number; $dbValues['virtuemart_order_id'] = $order['details']['BT']->virtuemart_order_id; $dbValues['payment_method_id'] = $order['details']['BT']->virtuemart_paymentmethod_id; $dbValues['return_context'] = $return_context; $dbValues['payment_name'] = parent::renderPluginName($this->_currentMethod); $dbValues['cost_per_transaction'] = $this->_currentMethod->cost_per_transaction; $dbValues['cost_percent_total'] = $this->_currentMethod->cost_percent_total; $dbValues['payment_order_total'] = $totalInPaymentCurrency['value']; $dbValues['payment_currency'] = $payment_currency_id; $this->storePSPluginInternalData($dbValues); // send a request $response = $this->_sendRequest($poststring); $this->debugLog($response, "plgVmConfirmedOrder", 'debug'); $authnet_values = array(); // to check the values??? // evaluate the response $html = $this->_handleResponse($response, $authnet_values, $order, $dbValues['payment_name']); if ($this->error) { $new_status = $this->_currentMethod->payment_declined_status; $this->_handlePaymentCancel($order['details']['BT']->virtuemart_order_id, $html); return; // will not process the order } else { if ($this->approved) { $this->_clearAuthorizeNetSession(); $new_status = $this->_currentMethod->payment_approved_status; } else { if ($this->declined) { vRequest::setVar('html', $html); $new_status = $this->_currentMethod->payment_declined_status; $this->_handlePaymentCancel($order['details']['BT']->virtuemart_order_id, $html); return; } else { if ($this->held) { $this->_clearAuthorizeNetSession(); $new_status = $this->_currentMethod->payment_held_status; } } } } $modelOrder = VmModel::getModel('orders'); $order['order_status'] = $new_status; $order['customer_notified'] = 1; $order['comments'] = ''; $modelOrder->updateStatusForOneOrder($order['details']['BT']->virtuemart_order_id, $order, TRUE); //We delete the old stuff $cart->emptyCart(); vRequest::setVar('html', $html); } function _handlePaymentCancel ($virtuemart_order_id, $html) { if (!class_exists('VirtueMartModelOrders')) { require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'orders.php'); } $modelOrder = VmModel::getModel('orders'); //Removing order should be obsolete since vm2.6.8 $modelOrder->remove(array('virtuemart_order_id' => $virtuemart_order_id)); // error while processing the payment $mainframe = JFactory::getApplication(); $mainframe->enqueueMessage($html); $mainframe->redirect(JRoute::_('index.php?option=com_virtuemart&view=cart&task=editpayment', FALSE), vmText::_('COM_VIRTUEMART_CART_ORDERDONE_DATA_NOT_VALID')); } /** * @param $virtuemart_paymentmethod_id * @param $paymentCurrencyId * @return bool|null */ function plgVmgetPaymentCurrency ($virtuemart_paymentmethod_id, &$paymentCurrencyId) { if (!($this->_currentMethod = $this->getVmPluginMethod($virtuemart_paymentmethod_id))) { return NULL; // Another method was selected, do nothing } if (!$this->selectedThisElement($this->_currentMethod->payment_element)) { return FALSE; } $this->_currentMethod->payment_currency = self::AUTHORIZE_DEFAULT_PAYMENT_CURRENCY; if (!class_exists('VirtueMartModelVendor')) { require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'vendor.php'); } $vendorId = 1; //VirtueMartModelVendor::getLoggedVendor(); $db = JFactory::getDBO(); $q = 'SELECT `virtuemart_currency_id` FROM `#__virtuemart_currencies` WHERE `currency_code_3`= "' . self::AUTHORIZE_DEFAULT_PAYMENT_CURRENCY . '"'; $db->setQuery($q); $paymentCurrencyId = $db->loadResult(); } function _clearAuthorizeNetSession () { $session = JFactory::getSession(); $session->clear('authorizenet', 'vm'); } /** * renderPluginName * Get the name of the payment method * * @author Valerie Isaksen * @param $payment * @return string Payment method name */ function getExtraPluginNameInfo () { $creditCardInfos = ''; if ($this->_validate_creditcard_data(FALSE)) { $cc_number = "**** **** **** " . substr($this->_cc_number, -4); $creditCardInfos .= '
' . vmText::_('VMPAYMENT_AUTHORIZENET_CCTYPE') . $this->_cc_type . '
'; $creditCardInfos .= vmText::_('VMPAYMENT_AUTHORIZENET_CCNUM') . $cc_number . '
'; $creditCardInfos .= vmText::_('VMPAYMENT_AUTHORIZENET_CVV2') . '****' . '
'; $creditCardInfos .= vmText::_('VMPAYMENT_AUTHORIZENET_EXDATE') . $this->_cc_expire_month . '/' . $this->_cc_expire_year; $creditCardInfos .= "
"; } return $creditCardInfos; } /** * Creates a Drop Down list of available Creditcards * * @author Valerie Isaksen */ function _renderCreditCardList ($creditCards, $selected_cc_type, $paymentmethod_id, $multiple = FALSE, $attrs = '') { $idA = $id = 'cc_type_' . $paymentmethod_id; //$options[] = JHTML::_('select.option', '', vmText::_('VMPAYMENT_AUTHORIZENET_SELECT_CC_TYPE'), 'creditcard_type', $name); if (!is_array($creditCards)) { $creditCards = (array)$creditCards; } foreach ($creditCards as $creditCard) { $options[] = JHTML::_('select.option', $creditCard, vmText::_('VMPAYMENT_AUTHORIZENET_' . strtoupper($creditCard))); } if ($multiple) { $attrs = 'multiple="multiple"'; $idA .= '[]'; } return JHTML::_('select.genericlist', $options, $idA, $attrs, 'value', 'text', $selected_cc_type); } /* * validate_creditcard_data * @author Valerie isaksen */ function _validate_creditcard_data ($enqueueMessage = TRUE) { if(empty($this->_cc_number) and empty($this->_cc_cvv) ){ return false; } $html = ''; $this->_cc_valid = TRUE; if (!Creditcard::validate_credit_card_number($this->_cc_type, $this->_cc_number)) { $this->_errormessage[] = 'VMPAYMENT_AUTHORIZENET_CARD_NUMBER_INVALID'; $this->_cc_valid = FALSE; } if (!Creditcard::validate_credit_card_cvv($this->_cc_type, $this->_cc_cvv)) { $this->_errormessage[] = 'VMPAYMENT_AUTHORIZENET_CARD_CVV_INVALID'; $this->_cc_valid = FALSE; } if (!Creditcard::validate_credit_card_date($this->_cc_type, $this->_cc_expire_month, $this->_cc_expire_year)) { $this->_errormessage[] = 'VMPAYMENT_AUTHORIZENET_CARD_EXPIRATION_DATE_INVALID'; $this->_cc_valid = FALSE; } if (!$this->_cc_valid) { //$html.= ""; } if (!$this->_cc_valid && $enqueueMessage) { $app = JFactory::getApplication(); $app->enqueueMessage($html); } return $this->_cc_valid; } function _getLoginId () { return trim($this->_currentMethod->sandbox ? $this->_currentMethod->sandbox_login_id : $this->_currentMethod->login_id); } function _getTransactionKey () { $transaction_key = $this->_currentMethod->sandbox ? $this->_currentMethod->sandbox_transaction_key : $this->_currentMethod->transaction_key; return trim($transaction_key); } /** * Gets the gateway Authorize.net URL * * @return string * @access protected */ function _getPostUrl () { if ($this->_currentMethod->sandbox) { if (isset($this->_currentMethod->sandbox_hostname)) { return $this->_currentMethod->sandbox_hostname; } else { return 'https://test.authorize.net/gateway/transact.dll'; } } else { if (isset($this->_currentMethod->hostname)) { return $this->_currentMethod->hostname; } else { return 'https://secure.authorize.net/gateway/transact.dll'; } } } function _recurringPayment () { return ''; //$params->get('recurring_payment', '0'); } /** * _getFormattedDate * * */ function _getFormattedDate ($month, $year) { return sprintf('%02d-%04d', $month, $year); } function _setHeader () { return $this->_authorizenet_params; } function _setMerchantData () { return array( 'x_login' => $this->_getLoginId(), 'x_tran_key' => $this->_getTransactionKey(), 'x_relay_response' => 'FALSE' ); } function _setResponseConfiguration () { return array( 'x_delim_data' => 'TRUE', 'x_delim_char' => '|', 'x_relay_response' => 'FALSE' ); } function _getfield ($string, $length) { return substr($string, 0, $length); } function _setBillingInformation ($usrBT) { // Customer Name and Billing Address return array( 'x_email' => isset($usrBT->email) ? $this->_getField($usrBT->email, 100) : '', //get email 'x_first_name' => isset($usrBT->first_name) ? $this->_getField($usrBT->first_name, 50) : '', 'x_last_name' => isset($usrBT->last_name) ? $this->_getField($usrBT->last_name, 50) : '', 'x_company' => isset($usrBT->company) ? $this->_getField($usrBT->company, 50) : '', 'x_address' => isset($usrBT->address_1) ? $this->_getField($usrBT->address_1, 60) : '', 'x_city' => isset($usrBT->city) ? $this->_getField($usrBT->city, 40) : '', 'x_zip' => isset($usrBT->zip) ? $this->_getField($usrBT->zip, 40) : '', 'x_state' => isset($usrBT->virtuemart_state_id) ? $this->_getField(ShopFunctions::getStateByID($usrBT->virtuemart_state_id), 20) : '', 'x_country' => isset($usrBT->virtuemart_country_id) ? $this->_getField(ShopFunctions::getCountryByID($usrBT->virtuemart_country_id), 60) : '', 'x_phone' => isset($usrBT->phone_1) ? $this->_getField($usrBT->phone_1, 25) : '', 'x_fax' => isset($usrBT->fax) ? $this->_getField($usrBT->fax, 25) : '', 'x_customer_ip' => $_SERVER["REMOTE_ADDR"], ); } function _setShippingInformation ($usrST) { // Customer Name and Billing Address return array( 'x_ship_to_first_name' => isset($usrST->first_name) ? $this->_getField($usrST->first_name, 50) : '', 'x_ship_to_last_name' => isset($usrST->first_name) ? $this->_getField($usrST->last_name, 50) : '', 'x_ship_to_company' => isset($usrST->company) ? $this->_getField($usrST->company, 50) : '', 'x_ship_to_address' => isset($usrST->first_name) ? $this->_getField($usrST->address_1, 60) : '', 'x_ship_to_city' => isset($usrST->city) ? $this->_getField($usrST->city, 40) : '', 'x_ship_to_zip' => isset($usrST->zip) ? $this->_getField($usrST->zip, 40) : '', 'x_ship_to_state' => isset($usrST->virtuemart_state_id) ? $this->_getField(ShopFunctions::getStateByID($usrST->virtuemart_state_id), 20) : '', 'x_ship_to_country' => isset($usrST->virtuemart_country_id) ? $this->_getField(ShopFunctions::getCountryByID($usrST->virtuemart_country_id), 60) : '', ); } function _setTransactionData ($orderDetails, $totalInPaymentCurrency) { // backward compatible if (isset($this->_currentMethod->xtype)) { $xtype = $this->_currentMethod->xtype; } else { $xtype = 'AUTH_CAPTURE'; } return array( 'x_amount' => $totalInPaymentCurrency, 'x_invoice_num' => $orderDetails->order_number, 'x_method' => 'CC', 'x_type' => $xtype, 'x_recurring_billing' => 0, //$this->_recurringPayment($params), 'x_card_num' => $this->_cc_number, 'x_card_code' => $this->_cc_cvv, 'x_exp_date' => $this->_getFormattedDate($this->_cc_expire_month, $this->_cc_expire_year) ); } /** * _sendRequest * Posts the request to AuthorizeNet & returns response using curl * * @author Valerie Isaksen * @param string $url * @param string $content * */ function _sendRequest ($post_string) { $post_url = $this->_getPostUrl(); $this->debugLog($this->removeCC($post_string), "_sendRequest", 'debug'); $curl_request = curl_init($post_url); //Added the next line to fix SSL verification issue (CURL error verifying the far end SSL Cert) curl_setopt($curl_request, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl_request, CURLOPT_POSTFIELDS, $post_string); curl_setopt($curl_request, CURLOPT_HEADER, 0); curl_setopt($curl_request, CURLOPT_TIMEOUT, 45); curl_setopt($curl_request, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl_request, CURLOPT_POST, 1); if (preg_match('/xml/', $post_url)) { curl_setopt($curl_request, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml")); } $response = curl_exec($curl_request); if ($curl_error = curl_error($curl_request)) { $this->debugLog($curl_error, '_sendRequest CURL error', 'error'); vmError('Authorize.net: ' . "----CURL ERROR---- " . $curl_error); } curl_close($curl_request); return $response; } /** * Proceeds the simple payment * * @param string $resp * @param array $submitted_values * @return object Message object * */ function _handleResponse ($response, $submitted_values, $order, $payment_name) { $delimiter = $this->_authorizenet_params['delim_char']; $encap_char = $this->_authorizenet_params['encap_char']; if ($response) { // Split Array if ($encap_char) { //$response_array = explode($encap_char . $delimiter . $encap_char, substr($response, 1, -1)); $response_array = explode($encap_char, $response); } else { $response_array = explode($delimiter, $response); } /** * If AuthorizeNet doesn't return a delimited response. */ if (count($response_array) < 10) { $this->approved = FALSE; $this->error = TRUE; $error_message = vmText::_('VMPAYMENT_AUTHORIZENET_UNKNOWN') . $response; $this->debugLog($error_message, '_handleResponse', 'error'); return $error_message; } $authorizeNetResponse['response_code'] = $response_array[0]; $this->approved = ($authorizeNetResponse['response_code'] == self::APPROVED); $this->declined = ($authorizeNetResponse['response_code'] == self::DECLINED); $this->error = ($authorizeNetResponse['response_code'] == self::ERROR); $this->held = ($authorizeNetResponse['response_code'] == self::HELD); $authorizeNetResponse['response_subcode'] = $response_array[1]; $authorizeNetResponse['response_reason_code'] = $response_array[2]; $authorizeNetResponse['response_reason_text'] = $response_array[3]; $authorizeNetResponse['authorization_code'] = $response_array[4]; $authorizeNetResponse['avs_response'] = $response_array[5]; //Address Verification Service $authorizeNetResponse['transaction_id'] = $response_array[6]; $authorizeNetResponse['invoice_number'] = $response_array[7]; $authorizeNetResponse['description'] = $response_array[8]; if ($this->approved) { $authorizeNetResponse['amount'] = $response_array[9]; $authorizeNetResponse['method'] = $response_array[10]; $authorizeNetResponse['transaction_type'] = $response_array[11]; $authorizeNetResponse['customer_id'] = $response_array[12]; $authorizeNetResponse['first_name'] = $response_array[13]; $authorizeNetResponse['last_name'] = $response_array[14]; $authorizeNetResponse['company'] = $response_array[15]; $authorizeNetResponse['address'] = $response_array[16]; $authorizeNetResponse['city'] = $response_array[17]; $authorizeNetResponse['state'] = $response_array[18]; $authorizeNetResponse['zip_code'] = $response_array[19]; $authorizeNetResponse['country'] = $response_array[20]; $authorizeNetResponse['phone'] = $response_array[21]; $authorizeNetResponse['fax'] = $response_array[22]; $authorizeNetResponse['email_address'] = $response_array[23]; $authorizeNetResponse['ship_to_first_name'] = $response_array[24]; $authorizeNetResponse['ship_to_last_name'] = $response_array[25]; $authorizeNetResponse['ship_to_company'] = $response_array[26]; $authorizeNetResponse['ship_to_address'] = $response_array[27]; $authorizeNetResponse['ship_to_city'] = $response_array[28]; $authorizeNetResponse['ship_to_state'] = $response_array[29]; $authorizeNetResponse['ship_to_zip_code'] = $response_array[30]; $authorizeNetResponse['ship_to_country'] = $response_array[31]; $authorizeNetResponse['tax'] = $response_array[32]; $authorizeNetResponse['duty'] = $response_array[33]; $authorizeNetResponse['freight'] = $response_array[34]; $authorizeNetResponse['tax_exempt'] = $response_array[35]; $authorizeNetResponse['purchase_order_number'] = $response_array[36]; $authorizeNetResponse['md5_hash'] = $response_array[37]; $authorizeNetResponse['card_code_response'] = $response_array[38]; $authorizeNetResponse['cavv_response'] = $response_array[39]; //// cardholder_authentication_verification_response $authorizeNetResponse['account_number'] = $response_array[50]; $authorizeNetResponse['card_type'] = $response_array[51]; $authorizeNetResponse['split_tender_id'] = $response_array[52]; $authorizeNetResponse['requested_amount'] = $response_array[53]; $authorizeNetResponse['balance_on_card'] = $response_array[54]; } if ($this->error or $this->declined) { // Prepare data that should be stored in the database $dbValues['authorizenet_response_response_code'] = $authorizeNetResponse['response_code']; $dbValues['authorizenet_response_response_subcode'] = $authorizeNetResponse['response_subcode']; $dbValues['authorizenet_response_response_reason_code'] = $authorizeNetResponse['response_reason_code']; $dbValues['authorizenet_response_response_reason_text'] = $authorizeNetResponse['response_reason_text']; //$this->storePSPluginInternalData($dbValues, 'id', true); $html = vmText::sprintf('VMPAYMENT_AUTHORIZENET_ERROR', $authorizeNetResponse['response_reason_text'], $authorizeNetResponse['response_code']) . "
"; $this->debugLog($html, '_handleResponse PAYMENT DECLINED', 'message'); return $html; } $virtuemart_order_id = VirtueMartModelOrders::getOrderIdByOrderNumber($authorizeNetResponse['invoice_number']); if (!$virtuemart_order_id) { $this->approved = FALSE; $this->error = TRUE; $this->debugLog(vmText::sprintf('VMPAYMENT_AUTHORIZENET_NO_ORDER_NUMBER', $authorizeNetResponse['invoice_number']), 'getOrderIdByOrderNumber', 'error'); $html = vmText::sprintf('VMPAYMENT_AUTHORIZENET_ERROR', $authorizeNetResponse['response_reason_text'], $authorizeNetResponse['response_code']) . "
"; $this->debugLog($html, '_handleResponse PAYMENT DECLINED', 'message'); return $html; } } else { $this->approved = FALSE; $this->error = TRUE; $this->debugLog(vmText::_('VMPAYMENT_AUTHORIZENET_CONNECTING_ERROR'), '_handleResponse', 'error'); return vmText::_('VMPAYMENT_AUTHORIZENET_CONNECTING_ERROR'); } // Prep // get all know columns of the table $db = JFactory::getDBO(); $query = 'SHOW COLUMNS FROM `' . $this->_tablename . '` '; $db->setQuery($query); $columns = $db->loadColumn(0); foreach ($authorizeNetResponse as $key => $value) { $table_key = 'authorizenet_response_' . $key; if (in_array($table_key, $columns)) { $response_fields[$table_key] = $value; } } $response_fields['virtuemart_order_id'] = $virtuemart_order_id; $response_fields['invoice_number'] = $authorizeNetResponse['invoice_number']; $response_fields['authorizeresponse_raw'] = $response; $this->storePSPluginInternalData($response_fields, 'virtuemart_order_id', true); $html = '' . "\n"; $html .= $this->getHtmlRow('AUTHORIZENET_PAYMENT_NAME', $payment_name); $html .= $this->getHtmlRow('AUTHORIZENET_ORDER_NUMBER', $authorizeNetResponse['invoice_number']); $html .= $this->getHtmlRow('AUTHORIZENET_AMOUNT', $authorizeNetResponse['amount'] . ' ' . self::AUTHORIZE_DEFAULT_PAYMENT_CURRENCY); //$html .= $this->getHtmlRow('AUTHORIZENET_RESPONSE_AUTHORIZATION_CODE', $authorizeNetResponse['authorization_code']); $html .= $this->getHtmlRow('AUTHORIZENET_RESPONSE_TRANSACTION_ID', $authorizeNetResponse['transaction_id']); $html .= '
' . "\n"; $this->debugLog(vmText::_('VMPAYMENT_AUTHORIZENET_ORDER_NUMBER') . " " . $authorizeNetResponse['invoice_number'] . ' payment approved', '_handleResponse', 'debug'); return $html; } /** * displays the CVV images of for CVV tooltip plugin * * @author Valerie Isaksen * @param array $logo_list * @return html with logos */ public function _displayCVVImages ($method) { $cvv_images = $method->cvv_images; $img = ''; if ($cvv_images) { $img = $this->displayLogos($cvv_images); $img = str_replace('"', "'", $img); } return $img; } /** * We must reimplement this triggers for joomla 1.7 */ /** * plgVmOnCheckAutomaticSelectedPayment * Checks how many plugins are available. If only one, the user will not have the choice. Enter edit_xxx page * The plugin must check first if it is the correct type * * @author Valerie Isaksen * @param VirtueMartCart cart: the cart object * @return null if no plugin was found, 0 if more then one plugin was found, virtuemart_xxx_id if only one plugin is found * */ function plgVmOnCheckAutomaticSelectedPayment (VirtueMartCart $cart, array $cart_prices = array(), &$paymentCounter) { $return = $this->onCheckAutomaticSelected($cart, $cart_prices); if (isset($return)) { return 0; } else { return NULL; } } /** * This method is fired when showing the order details in the frontend. * It displays the method-specific data. * * @param integer $order_id The order ID * @return mixed Null for methods that aren't active, text (HTML) otherwise * @author Valerie Isaksen */ protected function plgVmOnShowOrderFEPayment ($virtuemart_order_id, $virtuemart_paymentmethod_id, &$payment_name) { $this->onShowOrderFE($virtuemart_order_id, $virtuemart_paymentmethod_id, $payment_name); return TRUE; } /** * This method is fired when showing when priting an Order * It displays the the payment method-specific data. * * @param integer $_virtuemart_order_id The order ID * @param integer $method_id method used for this order * @return mixed Null when for payment methods that were not selected, text (HTML) otherwise * @author Valerie Isaksen */ function plgVmOnShowOrderPrintPayment ($order_number, $method_id) { return parent::onShowOrderPrint($order_number, $method_id); } /** * Save updated order data to the method specific table * * @param array $_formData Form data * @return mixed, True on success, false on failures (the rest of the save-process will be * skipped!), or null when this method is not actived. * * * public function plgVmOnUpdateOrderPayment( $_formData) { * return null; * } */ /** * Save updated orderline data to the method specific table * * @param array $_formData Form data * @return mixed, True on success, false on failures (the rest of the save-process will be * skipped!), or null when this method is not actived. * * * public function plgVmOnUpdateOrderLine( $_formData) { * return null; * } */ /** * plgVmOnEditOrderLineBE * This method is fired when editing the order line details in the backend. * It can be used to add line specific package codes * * @param integer $_orderId The order ID * @param integer $_lineId * @return mixed Null for method that aren't active, text (HTML) otherwise * * * public function plgVmOnEditOrderLineBE( $_orderId, $_lineId) { * return null; * } */ /** * This method is fired when showing the order details in the frontend, for every orderline. * It can be used to display line specific package codes, e.g. with a link to external tracking and * tracing systems * * @param integer $_orderId The order ID * @param integer $_lineId * @return mixed Null for method that aren't active, text (HTML) otherwise * * public function plgVmOnShowOrderLineFE( $_orderId, $_lineId) { * return null; * } */ function plgVmDeclarePluginParamsPayment ($name, $id, &$data) { return $this->declarePluginParams('payment', $name, $id, $data); } function plgVmSetOnTablePluginParamsPayment ($name, $id, &$table) { return $this->setOnTablePluginParams($name, $id, $table); } function removeCC ($data) { $keys = array('x_card_num=', 'x_card_code='); foreach ($keys as $key) { preg_match('/' . $key . '[^&]+&/i', $data, $result); if (is_array($result) and isset($result[0])) { $field = $result[0]; $old_value = substr($field, strlen($key), -1); $new_value = str_repeat('*', strlen($old_value)); $data = str_replace($old_value, $new_value, $data); } } return $data; } } // No closing tag