Our store’s currency is US $ and we use PayPal for international customers. We want to use ccAvenue (INR) as a payment gateway for Indian customers. Unfortunately, ccAvenue does not read currency. Thus, $ 12 will be squeezed out of our site, and ccAvenue will read it as INR 12 instead of the correct amount of ~ INR 600.
How can I convert the amount on the fly (from USD to INR) so that our site sends the correct amount to ccAvenue? Preferably, this should be done in the plugin using the real-time currency conversion service. But we are open to rough workarounds - for example, manually updating the conversion rate twice a week, etc. Here is a link to the free wocommerce ccavenue plugin .
Any help would be greatly appreciated.
Here's the index.php of the plugin:
<?php /* Plugin Name: WooCommerce CCAvenue gateway Plugin URI: http://mrova.com/ Description: Extends WooCommerce with mrova ccavenue gateway. Version: 1.1 Author: mRova Author URI: http://mrova.com/ Copyright: © 2009-2012 mRova. License: GNU General Public License v3.0 License URI: http://www.gnu.org/licenses/gpl-3.0.html */ add_action('plugins_loaded', 'woocommerce_mrova_ccave_init', 0); function woocommerce_mrova_ccave_init() { if ( !class_exists( 'WC_Payment_Gateway' ) ) return; /** * Localisation */ load_plugin_textdomain('wc-mrova-ccave', false, dirname( plugin_basename( __FILE__ ) ) . '/languages'); /** * Gateway class */ class WC_Mrova_Ccave extends WC_Payment_Gateway { protected $msg = array(); public function __construct(){ // Go wild in here $this -> id = 'ccavenue'; $this -> method_title = __('CCAvenue', 'mrova'); $this -> icon = WP_PLUGIN_URL . "/" . plugin_basename(dirname(__FILE__)) . '/images/logo.gif'; $this -> has_fields = false; $this -> init_form_fields(); $this -> init_settings(); $this -> title = $this -> settings['title']; $this -> description = $this -> settings['description']; $this -> merchant_id = $this -> settings['merchant_id']; $this -> working_key = $this -> settings['working_key']; $this -> redirect_page_id = $this -> settings['redirect_page_id']; $this -> liveurl = 'https://www.ccavenue.com/shopzone/cc_details.jsp'; $this -> msg['message'] = ""; $this -> msg['class'] = ""; add_action('init', array(&$this, 'check_ccavenue_response')); add_action('valid-ccavenue-request', array(&$this, 'successful_request')); add_action('woocommerce_update_options_payment_gateways', array(&$this, 'process_admin_options')); add_action('woocommerce_receipt_ccavenue', array(&$this, 'receipt_page')); add_action('woocommerce_thankyou_ccavenue',array(&$this, 'thankyou_page')); } function init_form_fields(){ $this -> form_fields = array( 'enabled' => array( 'title' => __('Enable/Disable', 'mrova'), 'type' => 'checkbox', 'label' => __('Enable CCAvenue Payment Module.', 'mrova'), 'default' => 'no'), 'title' => array( 'title' => __('Title:', 'mrova'), 'type'=> 'text', 'description' => __('This controls the title which the user sees during checkout.', 'mrova'), 'default' => __('CCAvenue', 'mrova')), 'description' => array( 'title' => __('Description:', 'mrova'), 'type' => 'textarea', 'description' => __('This controls the description which the user sees during checkout.', 'mrova'), 'default' => __('Pay securely by Credit or Debit card or internet banking through CCAvenue Secure Servers.', 'mrova')), 'merchant_id' => array( 'title' => __('Merchant ID', 'mrova'), 'type' => 'text', 'description' => __('This id(USER ID) available at "Generate Working Key" of "Settings and Options at CCAvenue."')), 'working_key' => array( 'title' => __('Working Key', 'mrova'), 'type' => 'text', 'description' => __('Given to Merchant by CCAvenue', 'mrova'), ), 'redirect_page_id' => array( 'title' => __('Return Page'), 'type' => 'select', 'options' => $this -> get_pages('Select Page'), 'description' => "URL of success page" ) ); } /** * Admin Panel Options * - Options for bits like 'title' and availability on a country-by-country basis **/ public function admin_options(){ echo '<h3>'.__('CCAvenue Payment Gateway', 'mrova').'</h3>'; echo '<p>'.__('CCAvenue is most popular payment gateway for online shopping in India').'</p>'; echo '<table class="form-table">'; $this -> generate_settings_html(); echo '</table>'; } /** * There are no payment fields for CCAvenue, but we want to show the description if set. **/ function payment_fields(){ if($this -> description) echo wpautop(wptexturize($this -> description)); } /** * Receipt Page **/ function receipt_page($order){ echo '<p>'.__('Thank you for your order, please click the button below to pay with CCAvenue.', 'mrova').'</p>'; echo $this -> generate_ccavenue_form($order); } /** * Process the payment and return the result **/ function process_payment($order_id){ $order = &new woocommerce_order($order_id); return array('result' => 'success', 'redirect' => add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, get_permalink(get_option('woocommerce_pay_page_id')))) ); } /** * Check for valid CCAvenue server callback **/ function check_ccavenue_response(){ global $woocommerce; if(isset($_REQUEST['Order_Id']) && isset($_REQUEST['AuthDesc'])){ $order_id_time = $_REQUEST['Order_Id']; $order_id = explode('_', $_REQUEST['Order_Id']); $order_id = (int)$order_id[0]; if($order_id != ''){ try{ $order = new woocommerce_order($order_id); $merchant_id = $_REQUEST['Merchant_Id']; $amount = $_REQUEST['Amount']; $checksum = $_REQUEST['Checksum']; $AuthDesc = $_REQUEST['AuthDesc']; $Checksum = $this -> verifyCheckSum($merchant_id, $order_id_time, $amount, $AuthDesc, $checksum, $this -> working_key); $transauthorised = false; if($order -> status !=='completed'){ if($Checksum=="true") { if($AuthDesc=="Y"){ $transauthorised = true; $this -> msg['message'] = "Thank you for shopping with us. Your account has been charged and your transaction is successful. We will be shipping your order to you soon."; $this -> msg['class'] = 'success'; if($order -> status == 'processing'){ }else{ $order -> payment_complete(); $order -> add_order_note('CCAvenue payment successful<br/>Bank Ref Number: '.$_REQUEST['nb_bid']); $order -> add_order_note($this->msg['message']); $woocommerce -> cart -> empty_cart(); } }else if($AuthDesc=="B"){ $this -> msg['message'] = "Thank you for shopping with us. We will keep you posted regarding the status of your order through e-mail"; $this -> msg['class'] = 'info'; //Here you need to put in the routines/e-mail for a "Batch Processing" order //This is only if payment for this transaction has been made by an American Express Card //since American Express authorisation status is available only after 5-6 hours by mail from ccavenue and at the "View Pending Orders" } else{ $this -> msg['class'] = 'error'; $this -> msg['message'] = "Thank you for shopping with us. However, the transaction has been declined."; //Here you need to put in the routines for a failed //transaction such as sending an email to customer //setting database status etc etc } }else{ $this -> msg['class'] = 'error'; $this -> msg['message'] = "Security Error. Illegal access detected"; //Here you need to simply ignore this and dont need //to perform any operation in this condition } if($transauthorised==false){ $order -> update_status('failed'); $order -> add_order_note('Failed'); $order -> add_order_note($this->msg['message']); } add_action('the_content', array(&$this, 'showMessage')); }}catch(Exception $e){ // $errorOccurred = true; $msg = "Error"; } } } } function showMessage($content){ return '<div class="box '.$this -> msg['class'].'-box">'.$this -> msg['message'].'</div>'.$content; } /** * Generate CCAvenue button link **/ public function generate_ccavenue_form($order_id){ global $woocommerce; $order = &new woocommerce_order($order_id); $redirect_url = ($this -> redirect_page_id=="" || $this -> redirect_page_id==0)?get_site_url() . "/":get_permalink($this -> redirect_page_id); $order_id = $order_id.'_'.date("ymds"); $checksum = $this -> getCheckSum($this -> merchant_id, $order -> order_total, $order_id, $redirect_url, $this -> working_key); $ccavenue_args = array( 'Merchant_Id' => $this -> merchant_id, 'Amount' => $order -> order_total, 'Order_Id' => $order_id, 'Redirect_Url' => $redirect_url, 'Checksum' => $checksum, 'billing_cust_name' => $order -> billing_first_name .' '. $order -> billing_last_name, 'billing_cust_address' => $order -> billing_address_1, 'billing_cust_country' => $order -> billing_country, 'billing_cust_state' => $order -> billing_state, 'billing_cust_city' => $order -> billing_city, 'billing_zip' => $order -> shipping_postcode, 'billing_cust_tel', 'billing_cust_email' => $order -> billing_email, 'delivery_cust_name' => $order -> shipping_first_name .' '. $order -> shipping_last_name, 'delivery_cust_address' => $order -> shipping_address_1, 'delivery_cust_country' => $order -> shipping_country, 'delivery_cust_state' => $order -> shipping_state, 'delivery_cust_tel' => '', 'delivery_cust_notes' => '', 'Merchant_Param' => '', 'billing_zip_code' => $order -> billing_postcode, 'delivery_cust_city' => $order -> shipping_city, 'delivery_zip_code' => $order -> shipping_postcode); $ccavenue_args_array = array(); foreach($ccavenue_args as $key => $value){ $ccavenue_args_array[] = "<input type='hidden' name='$key' value='$value'/>"; } return '<form action="'.$this -> liveurl.'" method="post" id="ccavenue_payment_form"> ' . implode('', $ccavenue_args_array) . ' <input type="submit" class="button-alt" id="submit_ccavenue_payment_form" value="'.__('Pay via CCAvenue', 'mrova').'" /> <a class="button cancel" href="'.$order->get_cancel_order_url().'">'.__('Cancel order & restore cart', 'mrova').'</a> <script type="text/javascript"> jQuery(function(){ jQuery("body").block( { message: "<img src=\"'.$woocommerce->plugin_url().'/assets/images/ajax-loader.gif\" alt=\"Redirecting…\" style=\"float:left; margin-right: 10px;\" />'.__('Thank you for your order. We are now redirecting you to CCAvenue to make payment.', 'mrova').'", overlayCSS: { background: "#fff", opacity: 0.6 }, css: { padding: 20, textAlign: "center", color: "#555", border: "3px solid #aaa", backgroundColor:"#fff", cursor: "wait", lineHeight:"32px" } }); jQuery("#submit_ccavenue_payment_form").click(); }); </script> </form>'; } /** * CCAvenue Essential Functions **/ private function getCheckSum($MerchantId,$Amount,$OrderId ,$URL,$WorkingKey) { $str ="$MerchantId|$OrderId|$Amount|$URL|$WorkingKey"; $adler = 1; $adler = $this -> adler32($adler,$str); return $adler; } private function verifyCheckSum($MerchantId,$OrderId,$Amount,$AuthDesc,$CheckSum,$WorkingKey) { $str = "$MerchantId|$OrderId|$Amount|$AuthDesc|$WorkingKey"; $adler = 1; $adler = $this -> adler32($adler,$str); if($adler == $CheckSum) return "true" ; else return "false" ; } private function adler32($adler , $str) { $BASE = 65521 ; $s1 = $adler & 0xffff ; $s2 = ($adler >> 16) & 0xffff; for($i = 0 ; $i < strlen($str) ; $i++) { $s1 = ($s1 + Ord($str[$i])) % $BASE ; $s2 = ($s2 + $s1) % $BASE ; //echo "s1 : $s1 <BR> s2 : $s2 <BR>"; } return $this -> leftshift($s2 , 16) + $s1; } private function leftshift($str , $num) { $str = DecBin($str); for( $i = 0 ; $i < (64 - strlen($str)) ; $i++) $str = "0".$str ; for($i = 0 ; $i < $num ; $i++) { $str = $str."0"; $str = substr($str , 1 ) ; //echo "str : $str <BR>"; } return $this -> cdec($str) ; } private function cdec($num) { for ($n = 0 ; $n < strlen($num) ; $n++) { $temp = $num[$n] ; $dec = $dec + $temp*pow(2 , strlen($num) - $n - 1); } return $dec; } /* * End CCAvenue Essential Functions **/ // get all pages function get_pages($title = false, $indent = true) { $wp_pages = get_pages('sort_column=menu_order'); $page_list = array(); if ($title) $page_list[] = $title; foreach ($wp_pages as $page) { $prefix = ''; // show indented child pages? if ($indent) { $has_parent = $page->post_parent; while($has_parent) { $prefix .= ' - '; $next_page = get_page($has_parent); $has_parent = $next_page->post_parent; } } // add to page list array array $page_list[$page->ID] = $prefix . $page->post_title; } return $page_list; } } /** * Add the Gateway to WooCommerce **/ function woocommerce_add_mrova_ccave_gateway($methods) { $methods[] = 'WC_Mrova_Ccave'; return $methods; } add_filter('woocommerce_payment_gateways', 'woocommerce_add_mrova_ccave_gateway' ); } ?>