saleem145 Posted July 6, 2004 Share Posted July 6, 2004 Hello, I notice there have been posts in the past about accepting multi currency payments using 2checkout. However the 2checkout module supplied with osCommerce does not support this functionality even though 2checkout itself can process multi currency payments. I have managed to create a new module. And I have tested it once -- it did work!! I paid myself in GBP. The code is adapted from some 2checkout code written by someone else but not for osCommerce. But it does need to be thoroughly tested and cleant up and documented and written up as a contribution. I would be glad if someone would take this project where I am leaving it for the time being and see it through to the end. Instructions -- 1. Create an empty file called rates in your store directory. In my case I made one in /home/saleem/store. echo "" > /home/saleem/rates would do it!! Next set the permissions on this file. Use chmod a+w /home/saleem/rates 2. Set the return url to http://your.domain.name/store/checkout_process.php by logging into your 2checkout account. 3. Replace your pm2checkout.php file in store/includes/modules/payment by the one below. It should work. Saleem <?php /* $Id: pm2checkout.php,v 1.19 2003/01/29 19:57:15 hpdl Exp $ osCommerce, Open Source E-Commerce Solutions http://www.oscommerce.com Copyright © 2003 osCommerce Released under the GNU General Public License */ class pm2checkout { var $code, $title, $description, $enabled; // class constructor function pm2checkout() { global $order; $this->code = 'pm2checkout'; $this->title = MODULE_PAYMENT_2CHECKOUT_TEXT_TITLE; $this->description = MODULE_PAYMENT_2CHECKOUT_TEXT_DESCRIPTION; $this->sort_order = MODULE_PAYMENT_2CHECKOUT_SORT_ORDER; $this->enabled = ((MODULE_PAYMENT_2CHECKOUT_STATUS == 'True') ? true : false); if ((int)MODULE_PAYMENT_2CHECKOUT_ORDER_STATUS_ID > 0) { $this->order_status = MODULE_PAYMENT_2CHECKOUT_ORDER_STATUS_ID; } if (is_object($order)) $this->update_status(); $this->form_action_url = 'https://www.2checkout.com/cgi-bin/sbuyers/cartpurchase.2c'; } // class methods function update_status() { global $order; if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_2CHECKOUT_ZONE > 0) ) { $check_flag = false; $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_2CHECKOUT_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id"); while ($check = tep_db_fetch_array($check_query)) { if ($check['zone_id'] < 1) { $check_flag = true; break; } elseif ($check['zone_id'] == $order->billing['zone_id']) { $check_flag = true; break; } } if ($check_flag == false) { $this->enabled = false; } } } function javascript_validation() { return false; } function selection() { return array('id' => $this->code, 'module' => $this->title); } function pre_confirmation_check() { return false; } function confirmation() { return false; } function process_button() { global $order, $currency, $currencies; $my_currency = $currency; if (!in_array($my_currency, array('AUD', 'CAD', 'CHF', 'DKK', 'EUR', 'GBP', 'HKD', 'JPY', 'NOK', 'NZD', 'SEK', 'USD'))) { $my_currency = 'USD'; } $url = "http://www.2checkout.com/cgi-bin/rk_buyers/rates.2c"; $num = file($url); if ($num === FALSE) { $url = "http://www.scylaxonline.com/store/rates"; $num = file($url); } else { $url = "http://www.2checkout.com/cgi-bin/rk_buyers/rates.2c"; $num = file($url); $datafile = fopen("http://www.2checkout.com/cgi-bin/rk_buyers/rates.2c","r"); $contents = fread($datafile,2048); fclose($datafile); $stream = fopen("/home/scylaxon/public_html/store/rates","r+"); fwrite($stream,"$contents"); fclose($stream); } foreach($num as $line=>$data) { if(substr($data,0,3) == "$my_currency") { $line_to_use = $num[$line]; $num = explode(" ","$line_to_use"); $er = $num[1]; $q = $num[2]; $t = round(number_format($order->info['total'] * $currencies->currencies[$my_currency]['value'],$currencies->currencies[$my_currency]['decimal_places']) / $er, 4); if ( in_array ( $my_currency, array ( 'EUR', 'GBP' , 'AUD' , 'CHF' ))) { $t = $t - 0.007;} } } $process_button_string = tep_draw_hidden_field('sid', MODULE_PAYMENT_2CHECKOUT_LOGIN) . tep_draw_hidden_field('total', number_format($t, 2)) . tep_draw_hidden_field('cart_order_id', date('YmdHis')) . tep_draw_hidden_field('quote', $q) . tep_draw_hidden_field('street_address', $order->customer['street_address']) . tep_draw_hidden_field('city', $order->customer['city']) . tep_draw_hidden_field('state', $order->customer['state']) . tep_draw_hidden_field('zip', $order->customer['postcode']) . tep_draw_hidden_field('country', $order->customer['country']['title']) . tep_draw_hidden_field('email', $order->customer['email_address']) . tep_draw_hidden_field('phone', $order->customer['telephone']) . tep_draw_hidden_field('demo', ((MODULE_PAYMENT_2CHECKOUT_TESTMODE == 'Test') ? 'Y' : 'N')) . tep_draw_hidden_field('acc_can', 'Y') . tep_draw_hidden_field('acc_int', 'Y'); return $process_button_string; } function before_process() { return false; } function after_process() { return false; } function output_error() { return false; } function check() { if (!isset($this->_check)) { $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_2CHECKOUT_STATUS'"); $this->_check = tep_db_num_rows($check_query); } return $this->_check; } function install() { tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable 2CheckOut Module', 'MODULE_PAYMENT_2CHECKOUT_STATUS', 'True', 'Do you want to accept 2CheckOut payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())"); tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Login/Store Number', 'MODULE_PAYMENT_2CHECKOUT_LOGIN', '18157', 'Login/Store Number used for the 2CheckOut service', '6', '0', now())"); tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Mode', 'MODULE_PAYMENT_2CHECKOUT_TESTMODE', 'Test', 'Transaction mode used for the 2Checkout service', '6', '0', 'tep_cfg_select_option(array(\'Test\', \'Production\'), ', now())"); tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Merchant Notifications', 'MODULE_PAYMENT_2CHECKOUT_EMAIL_MERCHANT', 'True', 'Should 2CheckOut e-mail a receipt to the store owner?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())"); tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_2CHECKOUT_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())"); tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_2CHECKOUT_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())"); tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_2CHECKOUT_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())"); } function remove() { tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')"); } function keys() { return array('MODULE_PAYMENT_2CHECKOUT_STATUS', 'MODULE_PAYMENT_2CHECKOUT_LOGIN', 'MODULE_PAYMENT_2CHECKOUT_TESTMODE', 'MODULE_PAYMENT_2CHECKOUT_EMAIL_MERCHANT', 'MODULE_PAYMENT_2CHECKOUT_ZONE', 'MODULE_PAYMENT_2CHECKOUT_ORDER_STATUS_ID', 'MODULE_PAYMENT_2CHECKOUT_SORT_ORDER'); } } ?> Quote Link to comment Share on other sites More sharing options...
desiredin Posted October 3, 2004 Share Posted October 3, 2004 Though I show my prices in CDN, I have my OSCommerce send the total to 2checkout in USD (that is what they process). How can I modify this script to still function that way? How can I use 2checkout's conversion rate to convert to USD so that my CDN price match their conversion from USD to CDN? Quote Link to comment Share on other sites More sharing options...
Guest Posted October 4, 2004 Share Posted October 4, 2004 hello, I tried your module, after a few tweaks (path of the rates file etc) it ALMOST works. For some reason it does a convertion on my value in euros for another. The final value in Euros is passed to 2CO and suffers some conversion, but presents a value in Euros also. Any tips? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.