Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

Multi Currency 2checkout Module


saleem145

Recommended Posts

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');

}

}

?>

Link to comment
Share on other sites

  • 2 months later...

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?

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...