Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

AlexStudio

[contribution] Super Download Store

Recommended Posts

If you want to update the order status manually and include the download link in the email, you need to modify your catalog/admin/orders.php for the job. Most of other payment modules don't need this because the download link is in the email sent by checkout_process.php.


Super Download Shop, PayPal Express Checkout IPN, Selling Downloads, Visual Validation (preventing robotic flood), phpBB2 Integration

 

Yes, I'm willing to help, but please ask in the right place. Think twice before trying to PM me, it might be ignored.

Share this post


Link to post
Share on other sites

I'm trying to see if people are interested in uploading the files via the admin system. I would like to create such a contribution, either as a contribution to super download shop, or as a stand-alone.

At the moment it is necessary to upload the files via FTP/SCP but it would be easier for the administrator to browse and attach the file at the same time as entering the filename in the product attributes.

 

Alex has pointed out that there are possible security issues in uploading files via http. Does anyone have any thoughts or ideas on this? I think if using SSL then it is only a small risk. What other risks are there?

Share this post


Link to post
Share on other sites
Can this contribution live side-by-side with Pending Order Downloads Contribution? Or must I un-install that contribution first?

No. SDS doesn't work with that contribution.


Super Download Shop, PayPal Express Checkout IPN, Selling Downloads, Visual Validation (preventing robotic flood), phpBB2 Integration

 

Yes, I'm willing to help, but please ask in the right place. Think twice before trying to PM me, it might be ignored.

Share this post


Link to post
Share on other sites

I've installed this contrib and cannot set the Order Status on any standard payment module to anything but default.

 

Also, would this work at all with Easy Populate contrib? I'm setting up an mp3 download store.

 

Thanks

Edited by warky

Share this post


Link to post
Share on other sites
I've installed this contrib and cannot set the Order Status on any standard payment module to anything but default.

Did you setup orders status other than default?

 

Also, would this work at all with Easy Populate contrib? I'm setting up an mp3 download store.

 

Thanks

I think SDS should work with Easy Populate contrib, though I didn't try. If the file group feature not in use, SDS only improves the download module, and I don't think Easy Populate has anything to do with that part. Only that SDS currently doesn't support creating file groups via Easy Populate, the only interface is the products attributes page in admin.


Super Download Shop, PayPal Express Checkout IPN, Selling Downloads, Visual Validation (preventing robotic flood), phpBB2 Integration

 

Yes, I'm willing to help, but please ask in the right place. Think twice before trying to PM me, it might be ignored.

Share this post


Link to post
Share on other sites

hi,

 

This looks to be a great contribution and I can't wait to get it all working properly! A few questions ....

 

1) I am working with a test server at the moment and my transactions are being processed and assigned to 'PayPal IPN Verified' order status. I DO NOT get the download links when I return from paypal, is this the correct behaviour? Does the site admin actually have to go in and manually alter all the orders to 'Download Now Available' for users to get their files? What if the admin goes on holiday for a week? Users won't get their downloads until he / she returns. Is there a security risk (free downloads etc.) with setting the downloads to show when the status = PayPal IPN Verified ??

 

2) No matter what I do, my download links simply WILL NOT appear! I have my status set to 'Download Now Available' which is status 12 & my cutoff is 10 - so it should work.

 

Everything else seems to be working (the link section in the account appears and tells me how many DLs & days I have left, just not link!!!

 

Any help is greatly apprechiated!

 

Adam

 

p.s. my product options are set as --> Download / Yes (with this capitalisation) do they need to be lowercase???

Share this post


Link to post
Share on other sites
1) I am working with a test server at the moment and my transactions are being processed and assigned to 'PayPal IPN Verified' order status. I DO NOT get the download links when I return from paypal, is this the correct behaviour? Does the site admin actually have to go in and manually alter all the orders to 'Download Now Available' for users to get their files? What if the admin goes on holiday for a week? Users won't get their downloads until he / she returns. Is there a security risk (free downloads etc.) with setting the downloads to show when the status = PayPal IPN Verified ??
With PayPal IPN, SDS works automatically. If you get the 'on hold' message every time return from PayPal, probably you didn't implement the modifications in checkout_process.php to the PayPal IPN module. Please search a few pages back in this thread for the 'fix' for osCommerce PayPal IPN module v2.2. If this is not the one you're testing with, please tell which PayPal IPN module it is.

 

2) No matter what I do, my download links simply WILL NOT appear! I have my status set to 'Download Now Available' which is status 12 & my cutoff is 10 - so it should work.

 

Everything else seems to be working (the link section in the account appears and tells me how many DLs & days I have left, just not link!!!

You didn't get the link probably because you failed this code: (it's from the stock osCommerce downloads module)
if ( ($downloads['download_count'] > 0) && (file_exists(DIR_FS_DOWNLOAD . $downloads['orders_products_filename'])) && ( ($downloads['download_maxdays'] == 0) || ($download_timestamp > time())) ) {

the file existence checking file_exists(DIR_FS_DOWNLOAD . $downloads['orders_products_filename']) returned false. Since you got everything else showing but the link, most likely the filename is splet incorrectly. It is case sensitive. If you store download files in subfolders under catalog/downloads/, the subfolder name is also case sensitive.


Super Download Shop, PayPal Express Checkout IPN, Selling Downloads, Visual Validation (preventing robotic flood), phpBB2 Integration

 

Yes, I'm willing to help, but please ask in the right place. Think twice before trying to PM me, it might be ignored.

Share this post


Link to post
Share on other sites
The osCommerce PayPal IPN module bypasses checkout_process.php, there for the modification needs to be manually coded into this payment module.

 

Below is the modification for osCommerce PayPal IPN module v2.2:

 

Find in catalog/includes/modules/payment/paypal_ipn.php line 249-257:

				if ((DOWNLOAD_ENABLED == 'true') && isset($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename'])) {
			  $sql_data_array = array('orders_id' => $insert_id,
									  'orders_products_id' => $order_products_id,
									  'orders_products_filename' => $attributes_values['products_attributes_filename'],
									  'download_maxdays' => $attributes_values['products_attributes_maxdays'],
									  'download_count' => $attributes_values['products_attributes_maxcount']);

			  tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
			}

Replace with:

				if ((DOWNLOAD_ENABLED == 'true') && isset($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename'])) {
// BOF Super Download Shop v1.0 mod
			  if (DOWNLOADS_CONTROLLER_FILEGROUP_STATUS != 'Yes' || !strstr($attributes_values['products_attributes_filename'], 'Group_Files-')) {
				$sql_data_array = array('orders_id' => $insert_id, 
										'orders_products_id' => $order_products_id, 
										'orders_products_filename' => $attributes_values['products_attributes_filename'], 
										'download_maxdays' => $attributes_values['products_attributes_maxdays'], 
										'download_count' => $attributes_values['products_attributes_maxcount']);
				tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
			  } else {
				$filegroup_array = explode('Group_Files-', $attributes_values['products_attributes_filename']);
				$filegroup_id = $filegroup_array[1];
				$groupfiles_query = tep_db_query("select download_group_filename
												  from " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD_GROUPS_FILES . "
												  where download_group_id = '" . (int)$filegroup_id . "'");
				while ($groupfile_array = tep_db_fetch_array($groupfiles_query)) {
				  $sql_data_array = array('orders_id' => $insert_id, 
										  'orders_products_id' => $order_products_id, 
										  'orders_products_filename' => $groupfile_array['download_group_filename'], 
										  'download_maxdays' => $attributes_values['products_attributes_maxdays'], 
										  'download_count' => $attributes_values['products_attributes_maxcount']);
				  tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
				}
			  }
// EOF Super Download Shop v1.0 mod
			}

Find in the same file line 169:

								  'date_purchased' => 'now()',

Add before:

								  'last_modified' => 'now()',

 

My orders_status column is recording the successful purchase as a '1' which is my 'Pending' order status level. Agghhhh!

 

Sorry alex, I know you're trying your best to help everyone! I would really apprechiate it if you could take a look at my paypal_ipn.php file. It looks ok to me.

 

Do I have to modify any other files (different ones to the instructions) to make the paypal mod work? I'm using this paypal mod.

 

Here it is -->

 

<?php
/*
 $Id: paypal_ipn.php,v 2.1.0.0 13/01/2007 16:30:28 Edith Karnitsch Exp $

 Copyright (c) 2004 osCommerce
 Released under the GNU General Public License

 Original Authors: Harald Ponce de Leon, Mark Evans 
 Updates by PandA.nl, Navyhost, Zoeticlight, David, gravyface, AlexStudio, windfjf and Terra

*/

 class paypal_ipn {
var $code, $title, $description, $enabled, $identifier;

// class constructor
function paypal_ipn() {
  global $order;

  $this->code = 'paypal_ipn';
  $this->title = MODULE_PAYMENT_PAYPAL_IPN_TEXT_TITLE;
  $this->description = MODULE_PAYMENT_PAYPAL_IPN_TEXT_DESCRIPTION;
  $this->sort_order = MODULE_PAYMENT_PAYPAL_IPN_SORT_ORDER;
  $this->enabled = ((MODULE_PAYMENT_PAYPAL_IPN_STATUS == 'True') ? true : false);
  $this->email_footer = MODULE_PAYMENT_PAYPAL_IPN_TEXT_EMAIL_FOOTER;
  $this->identifier = 'osCommerce PayPal IPN v2.1';

  if ((int)MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID > 0) {
	$this->order_status = MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID;
  }

  if (is_object($order)) $this->update_status();

  if (MODULE_PAYMENT_PAYPAL_IPN_GATEWAY_SERVER == 'Live') {
	$this->form_action_url = 'https://www.paypal.com/cgi-bin/webscr';
  } else {
	$this->form_action_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
  }
}

// class methods
function update_status() {
  global $order;

  if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_IPN_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_PAYPAL_IPN_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() {
  global $cartID, $cart_PayPal_IPN_ID, $customer_id, $languages_id, $order, $order_total_modules;

 // if (tep_session_is_registered('cartID')) {
 // PandA.nl: register_globals fix
 if (array_key_exists('cartID', $_SESSION)) {
	$insert_order = false;

	if (tep_session_is_registered('cart_PayPal_IPN_ID')) {
	  $order_id = substr($cart_PayPal_IPN_ID, strpos($cart_PayPal_IPN_ID, '-')+1);

	  $curr_check = tep_db_query("select currency from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");
	  $curr = tep_db_fetch_array($curr_check);

	   //if ( ($curr['currency'] != $order->info['currency']) || ($cartID != substr($cart_PayPal_IPN_ID, 0, strlen($cartID))) ) {
		//$check_query = tep_db_query('select orders_id from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '" limit 1'); 
		$check_query = tep_db_query('select orders_id from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '" limit 2');  //1.4

		$update_order = false;//1.4

		//if (tep_db_num_rows($check_query) < 1) {
		  //tep_db_query('delete from ' . TABLE_ORDERS . ' where orders_id = "' . (int)$order_id . '"');
		if (tep_db_num_rows($check_query) == 1) { //1.4
		  $update_order = true; //1.4
		  tep_db_query('delete from ' . TABLE_ORDERS_TOTAL . ' where orders_id = "' . (int)$order_id . '"');
		  tep_db_query('delete from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '"');
		  tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS . ' where orders_id = "' . (int)$order_id . '"');
		  tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . ' where orders_id = "' . (int)$order_id . '"');
		  tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_DOWNLOAD . ' where orders_id = "' . (int)$order_id . '"');
		}

		$insert_order = true;
	  //}	
	} else {
	  $insert_order = true;
	}

	if ($insert_order == true) {
	  $order_totals = array();
	  if (is_array($order_total_modules->modules)) {
		reset($order_total_modules->modules);
		while (list(, $value) = each($order_total_modules->modules)) {
		  $class = substr($value, 0, strrpos($value, '.'));
		  if ($GLOBALS[$class]->enabled) {
			for ($i=0, $n=sizeof($GLOBALS[$class]->output); $i<$n; $i++) {
			  if (tep_not_null($GLOBALS[$class]->output[$i]['title']) && tep_not_null($GLOBALS[$class]->output[$i]['text'])) {
				$order_totals[] = array('code' => $GLOBALS[$class]->code,
										'title' => $GLOBALS[$class]->output[$i]['title'],
										'text' => $GLOBALS[$class]->output[$i]['text'],
										'value' => $GLOBALS[$class]->output[$i]['value'],
										'sort_order' => $GLOBALS[$class]->sort_order);
			  }
			}
		  }
		}
	  }

	  $sql_data_array = array('customers_id' => $customer_id,
							  'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],
							  'customers_company' => $order->customer['company'],
							  'customers_street_address' => $order->customer['street_address'],
							  'customers_suburb' => $order->customer['suburb'],
							  'customers_city' => $order->customer['city'],
							  'customers_postcode' => $order->customer['postcode'],
							  'customers_state' => $order->customer['state'],
							  'customers_country' => $order->customer['country']['title'],
							  'customers_telephone' => $order->customer['telephone'],
							  'customers_email_address' => $order->customer['email_address'],
							  'customers_address_format_id' => $order->customer['format_id'],
							  'delivery_name' => $order->delivery['firstname'] . ' ' . $order->delivery['lastname'],
							  'delivery_company' => $order->delivery['company'],
							  'delivery_street_address' => $order->delivery['street_address'],
							  'delivery_suburb' => $order->delivery['suburb'],
							  'delivery_city' => $order->delivery['city'],
							  'delivery_postcode' => $order->delivery['postcode'],
							  'delivery_state' => $order->delivery['state'],
							  'delivery_country' => $order->delivery['country']['title'],
							  'delivery_address_format_id' => $order->delivery['format_id'],
							  'billing_name' => $order->billing['firstname'] . ' ' . $order->billing['lastname'],
							  'billing_company' => $order->billing['company'],
							  'billing_street_address' => $order->billing['street_address'],
							  'billing_suburb' => $order->billing['suburb'],
							  'billing_city' => $order->billing['city'],
							  'billing_postcode' => $order->billing['postcode'],
							  'billing_state' => $order->billing['state'],
							  'billing_country' => $order->billing['country']['title'],
							  'billing_address_format_id' => $order->billing['format_id'],
							  'payment_method' => $order->info['payment_method'],
							  'cc_type' => $order->info['cc_type'],
							  'cc_owner' => $order->info['cc_owner'],
							  'cc_number' => $order->info['cc_number'],
							  'cc_expires' => $order->info['cc_expires'],
							  'last_modified' => 'now()',
							  'date_purchased' => 'now()',
							  'orders_status' => $order->info['order_status'],
							  'currency' => $order->info['currency'],
							  'currency_value' => $order->info['currency_value']);

	  //+1.4
	  if ( $update_order ){  
		tep_db_perform(TABLE_ORDERS, $sql_data_array, 'update', 'orders_id = "' . (int)$order_id . '"');
		$insert_id = (int)$order_id;
	  } else { 
	  //-1.4
	  tep_db_perform(TABLE_ORDERS, $sql_data_array);

	  $insert_id = tep_db_insert_id();
	  }//1.4

	  for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
		$sql_data_array = array('orders_id' => $insert_id,
								'title' => $order_totals[$i]['title'],
								'text' => $order_totals[$i]['text'],
								'value' => $order_totals[$i]['value'],
								'class' => $order_totals[$i]['code'],
								'sort_order' => $order_totals[$i]['sort_order']);

		tep_db_perform(TABLE_ORDERS_TOTAL, $sql_data_array);
	  }
	  //+1.4
	  $sql_data_array = array('orders_id' => $insert_id, 
								'orders_status_id' => $order->info['order_status'], 
								'date_added' => 'now()', 
					 'customer_notified' => '0', 
								'comments' => $order->info['comments']);
	  tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
	  //-1.4

	  for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
		$sql_data_array = array('orders_id' => $insert_id,
								'products_id' => tep_get_prid($order->products[$i]['id']),
								'products_model' => $order->products[$i]['model'],
								'products_name' => $order->products[$i]['name'],
								'products_price' => $order->products[$i]['price'],
								'final_price' => $order->products[$i]['final_price'],
								'products_tax' => $order->products[$i]['tax'],
								'products_quantity' => $order->products[$i]['qty']);

		tep_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);

		$order_products_id = tep_db_insert_id();

		$attributes_exist = '0';
		if (isset($order->products[$i]['attributes'])) {
		  $attributes_exist = '1';
		  for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
			if (DOWNLOAD_ENABLED == 'true') {
			  $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
								   from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
								   left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
								   on pa.products_attributes_id=pad.products_attributes_id
								   where pa.products_id = '" . $order->products[$i]['id'] . "'
								   and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'
								   and pa.options_id = popt.products_options_id
								   and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'
								   and pa.options_values_id = poval.products_options_values_id
								   and popt.language_id = '" . $languages_id . "'
								   and poval.language_id = '" . $languages_id . "'";
			  $attributes = tep_db_query($attributes_query);
			} else {
			  $attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");
			}
			$attributes_values = tep_db_fetch_array($attributes);

			$sql_data_array = array('orders_id' => $insert_id,
									'orders_products_id' => $order_products_id,
									'products_options' => $attributes_values['products_options_name'],
									'products_options_values' => $attributes_values['products_options_values_name'],
									'options_values_price' => $attributes_values['options_values_price'],
									'price_prefix' => $attributes_values['price_prefix']);

			tep_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES, $sql_data_array);

			if ((DOWNLOAD_ENABLED == 'true') && isset($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename'])) {
// BOF Super Download Shop v1.0 mod
			  if (DOWNLOADS_CONTROLLER_FILEGROUP_STATUS != 'Yes' || !strstr($attributes_values['products_attributes_filename'], 'Group_Files-')) {
				$sql_data_array = array('orders_id' => $insert_id,
										'orders_products_id' => $order_products_id,
										'orders_products_filename' => $attributes_values['products_attributes_filename'],
										'download_maxdays' => $attributes_values['products_attributes_maxdays'],
										'download_count' => $attributes_values['products_attributes_maxcount']);
				tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
			  } else {
				$filegroup_array = explode('Group_Files-', $attributes_values['products_attributes_filename']);
				$filegroup_id = $filegroup_array[1];
				$groupfiles_query = tep_db_query("select download_group_filename
												  from " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD_GROUPS_FILES . "
												  where download_group_id = '" . (int)$filegroup_id . "'");
				while ($groupfile_array = tep_db_fetch_array($groupfiles_query)) {
				  $sql_data_array = array('orders_id' => $insert_id,
										  'orders_products_id' => $order_products_id,
										  'orders_products_filename' => $groupfile_array['download_group_filename'],
										  'download_maxdays' => $attributes_values['products_attributes_maxdays'],
										  'download_count' => $attributes_values['products_attributes_maxcount']);
				  tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
				}
			  }
// EOF Super Download Shop v1.0 mod
			}			  }
		}
	  }

	  tep_session_register('cart_PayPal_IPN_ID');
	  // Terra register globals fix
	  $_SESSION['cart_PayPal_IPN_ID'] = $cartID . '-' . $insert_id;
	}
  }

  return false;
}

function process_button() {
  global $customer_id, $order, $languages_id, $currencies, $currency, $cart_PayPal_IPN_ID, $shipping;

  if (MODULE_PAYMENT_PAYPAL_IPN_CURRENCY == 'Selected Currency') {
	$my_currency = $currency;
  } else {
	$my_currency = substr(MODULE_PAYMENT_PAYPAL_IPN_CURRENCY, 5);
  }

  if (!in_array($my_currency, array('AUD', 'CAD', 'CHF', 'CZK', 'DKK', 'EUR', 'GBP', 'HKD', 'HUF', 'JPY', 'NOK', 'NZD', 'PLN', 'SEK', 'SGD', 'USD'))) {
	$my_currency = 'USD';
  }

  $parameters = array();

  if ( (MODULE_PAYMENT_PAYPAL_IPN_TRANSACTION_TYPE == 'Per Item') && (MODULE_PAYMENT_PAYPAL_IPN_EWP_STATUS == 'False') ) {
	$parameters['cmd'] = '_cart';
	$parameters['upload'] = '1';

	for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
	  $item = $i+1;

	  $tax_value = ($order->products[$i]['tax'] / 100) * $order->products[$i]['final_price'];

	  $parameters['item_name_' . $item] = $order->products[$i]['name'];
	  $parameters['amount_' . $item] = number_format($order->products[$i]['final_price'] * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency));
	  $parameters['tax_' . $item] = number_format($tax_value * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency));
	  $parameters['quantity_' . $item] = $order->products[$i]['qty'];

	  if ($i == 0) {
		if (DISPLAY_PRICE_WITH_TAX == 'true') {
		  $shipping_cost = $order->info['shipping_cost'];
		} else {
		  $module = substr($shipping['id'], 0, strpos($shipping['id'], '_'));
		  $shipping_tax = tep_get_tax_rate($GLOBALS[$module]->tax_class, $order->delivery['country']['id'], $order->delivery['zone_id']);
		  $shipping_cost = $order->info['shipping_cost'] + tep_calculate_tax($order->info['shipping_cost'], $shipping_tax);
		}

		$parameters['shipping_' . $item] = number_format($shipping_cost * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency));
	  }

	  if (isset($order->products[$i]['attributes'])) {
		for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
		  if (DOWNLOAD_ENABLED == 'true') {
			$attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename
								 from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
								 left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
								 on pa.products_attributes_id=pad.products_attributes_id
								 where pa.products_id = '" . $order->products[$i]['id'] . "'
								 and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'
								 and pa.options_id = popt.products_options_id
								 and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'
								 and pa.options_values_id = poval.products_options_values_id
								 and popt.language_id = '" . $languages_id . "'
								 and poval.language_id = '" . $languages_id . "'";
			$attributes = tep_db_query($attributes_query);
		  } else {
			$attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");
		  }
		  $attributes_values = tep_db_fetch_array($attributes);

// Unfortunately PayPal only accepts two attributes per product, so the
// third attribute onwards will not be shown at PayPal
		  $parameters['on' . $j . '_' . $item] = $attributes_values['products_options_name'];
		  $parameters['os' . $j . '_' . $item] = $attributes_values['products_options_values_name'];
		}
	  }
	}

	$parameters['num_cart_items'] = $item;

		  if(MOVE_TAX_TO_TOTAL_AMOUNT == 'True') {
	   // PandA.nl move tax to total amount
	   $parameters['amount'] = number_format(($order->info['total'] - $order->info['shipping_cost']) * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency));
	   } else {
	   // default
	  $parameters['amount'] = number_format(($order->info['total'] - $order->info['shipping_cost'] - $order->info['tax']) * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency));
  }

  } else {
	$parameters['cmd'] = '_ext-enter';
	$parameters['redirect_cmd'] = '_xclick';
	$parameters['item_name'] = STORE_NAME;
	$parameters['shipping'] = '0';
  if(MOVE_TAX_TO_TOTAL_AMOUNT == 'True') {
	   // PandA.nl move tax to total amount
	   $parameters['amount'] = number_format($order->info['total'] * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency));
	   } else {
	   // default
	  $parameters['amount'] = number_format(($order->info['total'] - $order->info['tax']) * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency));
  }
   }

   // billing information fix by gravyface
   // for pre-populating the fiels if customer has no PayPal account
   // only works if force shipping address is set to FALSE
  $state_abbr = tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], $order->delivery['state']);
  $name = $order->delivery['firstname'] . ' ' . $order->delivery['lastname'];

  $parameters['business'] = MODULE_PAYMENT_PAYPAL_IPN_ID;

  // let's check what has been defined in the shop admin for the shipping address
  if (MODULE_PAYMENT_PAYPAL_IPN_SHIPPING == 'True') {
  // all that matters is that we send the variables
  // what they contain is irrelevant as PayPal overwrites it with the customer's confirmed PayPal address
  // so what we send is probably not what we'll get back
  $parameters['no_shipping'] = '2';   
  $parameters['address_name'] 		= $name;
  $parameters['address_street'] 	= $order->delivery['street_address'];
  $parameters['address_city'] 		= $order->delivery['city'];
  $parameters['address_zip'] 		= $order->delivery['postcode'];
  $parameters['address_state'] 		= $state_abbr;
  $parameters['address_country_code']	= $order->delivery['country']['iso_code_2'];
  $parameters['address_country']	= $order->delivery['country']['title'];
  $parameters['payer_email'] 		= $order->customer['email_address'];		  
 } else {	  
  $parameters['no_shipping'] = '1'; 
  $parameters['H_PhoneNumber'] 		  = $order->customer['telephone'];	  
  $parameters['first_name'] 		= $order->delivery['firstname'];
  $parameters['last_name'] 		= $order->delivery['lastname'];		
  $parameters['address1'] 		= $order->delivery['street_address'];
  $parameters['address2'] 		= $order->delivery['suburb'];
  $parameters['city'] 			= $order->delivery['city'];
  $parameters['zip'] 			= $order->delivery['postcode'];
  $parameters['state'] 			= $state_abbr;
  $parameters['country'] 			= $order->delivery['country']['iso_code_2'];
  $parameters['email'] 			= $order->customer['email_address'];   
	  }	  

  $parameters['currency_code'] = $my_currency;
  $parameters['invoice'] = 'K' . substr($cart_PayPal_IPN_ID, strpos($cart_PayPal_IPN_ID, '-')+1);
  $parameters['custom'] = $customer_id;
  $parameters['no_note'] = '1';
  $parameters['notify_url'] = tep_href_link('ext/modules/payment/paypal_ipn/ipn.php', '', 'SSL', false, false);
  $parameters['cbt'] = CONFIRMATION_BUTTON_TEXT;  
  $parameters['return'] = tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL');
  $parameters['cancel_return'] = tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL');
  $parameters['bn'] = $this->identifier;
  $parameters['lc'] = $order->customer['country']['iso_code_2'];


  if (tep_not_null(MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE)) {
	$parameters['page_style'] = MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE;
  }

  if (MODULE_PAYMENT_PAYPAL_IPN_EWP_STATUS == 'True') {
	$parameters['cert_id'] = MODULE_PAYMENT_PAYPAL_IPN_EWP_CERT_ID;

	$random_string = rand(100000, 999999) . '-' . $customer_id . '-';

	$data = '';
	while (list($key, $value) = each($parameters)) {
	  $data .= $key . '=' . $value . "\n";
	}

	$fp = fopen(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt', 'w');
	fwrite($fp, $data);
	fclose($fp);

	unset($data);

	if (function_exists('openssl_pkcs7_sign') && function_exists('openssl_pkcs7_encrypt')) {
	  openssl_pkcs7_sign(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt', MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt', file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_PUBLIC_KEY), file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_PRIVATE_KEY), array('From' => MODULE_PAYMENT_PAYPAL_IPN_ID), PKCS7_BINARY);

	  unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt');

// remove headers from the signature
	  $signed = file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');
	  $signed = explode("\n\n", $signed);
	  $signed = base64_decode($signed[1]);

	  $fp = fopen(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt', 'w');
	  fwrite($fp, $signed);
	  fclose($fp);

	  unset($signed);

	  openssl_pkcs7_encrypt(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt', MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt', file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_PAYPAL_KEY), array('From' => MODULE_PAYMENT_PAYPAL_IPN_ID), PKCS7_BINARY);

	  unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');

// remove headers from the encrypted result
	  $data = file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');
	  $data = explode("\n\n", $data);
	  $data = '-----BEGIN PKCS7-----' . "\n" . $data[1] . "\n" . '-----END PKCS7-----';

	  unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');
	} else {
	  exec(MODULE_PAYMENT_PAYPAL_IPN_EWP_OPENSSL . ' smime -sign -in ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt -signer ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_PUBLIC_KEY . ' -inkey ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_PRIVATE_KEY . ' -outform der -nodetach -binary > ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');
	  unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt');

	  exec(MODULE_PAYMENT_PAYPAL_IPN_EWP_OPENSSL . ' smime -encrypt -des3 -binary -outform pem ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_PAYPAL_KEY . ' < ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt > ' . MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');
	  unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');

	  $fh = fopen(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt', 'rb');
	  $data = fread($fh, filesize(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt'));
	  fclose($fh);

	  unlink(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');
	}

	$process_button_string = tep_draw_hidden_field('cmd', '_s-xclick') .
							 tep_draw_hidden_field('encrypted', $data);

	unset($data);
  } else {
	while (list($key, $value) = each($parameters)) {
	  echo tep_draw_hidden_field($key, $value);
	}
  }

  return $process_button_string;
}

function before_process() {
  global $cart;

  $cart->reset(true);

// unregister session variables used during checkout
  tep_session_unregister('sendto');
  tep_session_unregister('billto');
  tep_session_unregister('shipping');
  tep_session_unregister('payment');
  tep_session_unregister('comments');

  tep_session_unregister('cart_PayPal_IPN_ID');

  tep_redirect(tep_href_link(FILENAME_CHECKOUT_SUCCESS, '', 'SSL'));
}

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_PAYPAL_IPN_STATUS'");
	$this->_check = tep_db_num_rows($check_query);
  }
  return $this->_check;
}

function install() {
  $check_query = tep_db_query("select orders_status_id from " . TABLE_ORDERS_STATUS . " where orders_status_name = 'Preparing [PayPal IPN]' limit 1");

  if (tep_db_num_rows($check_query) < 1) {
	$status_query = tep_db_query("select max(orders_status_id) as status_id from " . TABLE_ORDERS_STATUS);
	$status = tep_db_fetch_array($status_query);

	$status_id = $status['status_id']+1;

	$languages = tep_get_languages();

	foreach ($languages as $lang) {
	  tep_db_query("insert into " . TABLE_ORDERS_STATUS . " (orders_status_id, language_id, orders_status_name) values ('" . $status_id . "', '" . $lang['id'] . "', 'Preparing [PayPal IPN]')");
	}
  } else {
	$check = tep_db_fetch_array($check_query);

	$status_id = $check['orders_status_id'];
  }

  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 PayPal IPN Module', 'MODULE_PAYMENT_PAYPAL_IPN_STATUS', 'False', 'Do you want to accept PayPal IPN payments?', '6', '1', '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, set_function, date_added) values ('Gateway Server', 'MODULE_PAYMENT_PAYPAL_IPN_GATEWAY_SERVER', 'Testing', 'Use the testing (sandbox) or live gateway server for transactions?', '6', '2', 'tep_cfg_select_option(array(\'Testing\',\'Live\'), ', 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_PAYPAL_IPN_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '3', 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 ('Force shipping address?', 'MODULE_PAYMENT_PAYPAL_IPN_SHIPPING', 'False', 'If TRUE the address details for the PayPal Seller Protection Policy are sent but customers without a PayPal account must re-enter their details. If set to FALSE order is not eligible for Seller Protection but customers without acount will have their address fiels pre-populated.', '6', '4', '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 ('E-Mail Address', 'MODULE_PAYMENT_PAYPAL_IPN_ID', '', 'The e-mail address to use for the PayPal IPN service', '6', '5', 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 Currency', 'MODULE_PAYMENT_PAYPAL_IPN_CURRENCY', 'Selected Currency', 'The currency to use for transactions', '6', '10', 'tep_cfg_select_option(array(\'Selected Currency\',\'Only AUD\',\'Only CAD\',\'Only CHF\',\'Only CZK\',\'Only DKK\',\'Only EUR\',\'Only GBP\',\'Only HKD\',\'Only HUF\',\'Only JPY\',\'Only NOK\',\'Only NZD\',\'Only PLN\',\'Only SEK\',\'Only SGD\',\'Only USD\'), ', 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_PAYPAL_IPN_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '11', '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 Preparing Order Status', 'MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID', '" . $status_id . "', 'Set the status of prepared orders made with this payment module to this value', '6', '12', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', 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 PayPal Acknowledged Order Status', 'MODULE_PAYMENT_PAYPAL_IPN_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '13', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', 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 PayPal Completed Order Status', 'MODULE_PAYMENT_PAYPAL_IPN_COMP_ORDER_STATUS_ID', '0', 'Set the status of orders which are confirmed as paid (completed) to this value', '6', '13', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', 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 Type', 'MODULE_PAYMENT_PAYPAL_IPN_TRANSACTION_TYPE', 'Aggregate', 'Send individual items to PayPal or aggregate all as one total item?', '6', '14', 'tep_cfg_select_option(array(\'Per Item\',\'Aggregate\'), ', now())");
  // bof PandA.nl move tax to total amount
  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 ('Move tax to total amount', 'MOVE_TAX_TO_TOTAL_AMOUNT', 'True', 'Do you want to move the tax to the total amount? If true PayPal will allways show the total amount including tax. (needs Aggregate instead of Per Item to function)', '6', '15', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
  // eof PandA.nl move tax to total amount	  
  tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Page Style', 'MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE', '', 'The page style to use for the transaction procedure (defined at your PayPal Profile page)', '6', '20', now())");
  tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Debug E-Mail Address', 'MODULE_PAYMENT_PAYPAL_IPN_DEBUG_EMAIL', '', 'All parameters of an Invalid IPN notification will be sent to this email address if one is entered.', '6', '21', 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 ('Enable Encrypted Web Payments', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_STATUS', 'False', 'Do you want to enable Encrypted Web Payments?', '6', '30', '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 ('Your Private Key', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_PRIVATE_KEY', '', 'The location of your Private Key to use for signing the data. (*.pem)', '6', '31', now())");
  tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your Public Certificate', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_PUBLIC_KEY', '', 'The location of your Public Certificate to use for signing the data. (*.pem)', '6', '32', now())");
  tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('PayPals Public Certificate', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_PAYPAL_KEY', '', 'The location of the PayPal Public Certificate for encrypting the data.', '6', '33', now())");
  tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Your PayPal Public Certificate ID', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_CERT_ID', '', 'The Certificate ID to use from your PayPal Encrypted Payment Settings Profile.', '6', '34', now())");
  tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Working Directory', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY', '', 'The working directory to use for temporary files. (trailing slash needed)', '6', '35', now())");
  tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('OpenSSL Location', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_OPENSSL', '/usr/bin/openssl', 'The location of the openssl binary file.', '6', '36', now())");

}

function remove() {
  tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
}

  function keys() {
// PandA.nl move tax to total amount added: ", 'MOVE_TAX_TO_TOTAL_AMOUNT'"
 return array('MODULE_PAYMENT_PAYPAL_IPN_STATUS', 'MODULE_PAYMENT_PAYPAL_IPN_GATEWAY_SERVER', 'MODULE_PAYMENT_PAYPAL_IPN_ID', 'MODULE_PAYMENT_PAYPAL_IPN_SORT_ORDER', 'MODULE_PAYMENT_PAYPAL_IPN_CURRENCY', 'MODULE_PAYMENT_PAYPAL_IPN_ZONE', 'MODULE_PAYMENT_PAYPAL_IPN_SHIPPING', 'MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_IPN_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_IPN_COMP_ORDER_STATUS_ID', 'MODULE_PAYMENT_PAYPAL_IPN_TRANSACTION_TYPE', 'MOVE_TAX_TO_TOTAL_AMOUNT', 'MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE', 'MODULE_PAYMENT_PAYPAL_IPN_DEBUG_EMAIL',  'MODULE_PAYMENT_PAYPAL_IPN_EWP_STATUS', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_PRIVATE_KEY', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_PUBLIC_KEY', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_PAYPAL_KEY', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_CERT_ID', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY', 'MODULE_PAYMENT_PAYPAL_IPN_EWP_OPENSSL');
  }
 }
?>

 

P.s. I am using the paypal sandbox feature / account - will this make a difference??

Edited by adam_gardner

Share this post


Link to post
Share on other sites

This may now be about this contribution but I just a fast question, is it possible to have dedicated servers for downloads?

Share this post


Link to post
Share on other sites
Do I have to modify any other files (different ones to the instructions) to make the paypal mod work? I'm using this paypal mod.

P.s. I am using the paypal sandbox feature / account - will this make a difference??

Your paypal_ipn.php looks good to me. Testing in sandbox won't make any difference in your case.

 

Please make sure the IPN part (Instant Payment Notification) is working in your site, which means you got the invoice email sent by ipn.php and the orders status got updated after payments completed. If the IPN part is not working, please refer to the Official PayPal IPN Support Thread starting from this post.


Super Download Shop, PayPal Express Checkout IPN, Selling Downloads, Visual Validation (preventing robotic flood), phpBB2 Integration

 

Yes, I'm willing to help, but please ask in the right place. Think twice before trying to PM me, it might be ignored.

Share this post


Link to post
Share on other sites
Guest
This new contribution allows you to store downlad files in sub folders. If you utilize the group files for download feature, you don't need to type-in filenames. It will also check if the file exist or not.

 

The PayPal IPN module is not included in this contribution package.

 

Hello alex, I have tried to install the super module download 1.1. I do not succeed but to resolve some problems. I have installed all correctly. I have inserted in my store a test product in order to only test it that once that happens the payment does not work correctly. My site one of test is www.unime.eu/phpshop/ can control also you. They are new of OsCommerce

Share this post


Link to post
Share on other sites
Guest

you can approach also the area admin. www.unime.eu/phpshop/admin/

 

I do not succeed to understand the operation well. Creed to have correctly made all.

 

 

MSN: ssj5gabry@hotmail.com

Share this post


Link to post
Share on other sites

Gabriele, there is something wrong in your store, but I can't read Italian. The error message

Attenzione: Posso scrivere sul file di configurazione: /home/unime1/public_html/phpshop/includes/configure.php. Questo potrebbe essere un potenziale bug di sicurezza - imposta i permessi giusti per il file.
is showing on every page of your store.

 

I placed an order and took a close look in 'My Account' page, there is no download. It doesn't look like a SDS installation problem, but more like you didn't setup a download file for that product. The download module was not called at all.


Super Download Shop, PayPal Express Checkout IPN, Selling Downloads, Visual Validation (preventing robotic flood), phpBB2 Integration

 

Yes, I'm willing to help, but please ask in the right place. Think twice before trying to PM me, it might be ignored.

Share this post


Link to post
Share on other sites
Guest

I give the accesses to you to the side admin/ and controls same you and you see what can be. I have tried to execute the instructions but without no result.

Share this post


Link to post
Share on other sites
I give the accesses to you to the side admin/ and controls same you and you see what can be. I have tried to execute the instructions but without no result.

Modifying the products attributes won't change the existing orders. I placed another order and now the download link showed up without paying. The file group setup is working, but not the download controller part. You didn't run the SQL script for the download controller, please run that script and setup the orders status ID values as mentioned in the installation guide.


Super Download Shop, PayPal Express Checkout IPN, Selling Downloads, Visual Validation (preventing robotic flood), phpBB2 Integration

 

Yes, I'm willing to help, but please ask in the right place. Think twice before trying to PM me, it might be ignored.

Share this post


Link to post
Share on other sites
Guest

I have executed the rows. They give to this result Rows to me group 0 for lauguage: italian already exists. Don't forget to delete filegroup_db_setup.php from your catalog/admin/directory. I have tried to make an order but the state always remains to pedding. I have controlled also the db but I do not succeed to understand well

Share this post


Link to post
Share on other sites

There are 2 sql scripts came with SDS 1.1 package. You ran the 'group_file_for_download.sql' script so the group files worked, but you didn't run 'downloads_controllers_english.sql', there for the downloads controller part is not working.


Super Download Shop, PayPal Express Checkout IPN, Selling Downloads, Visual Validation (preventing robotic flood), phpBB2 Integration

 

Yes, I'm willing to help, but please ask in the right place. Think twice before trying to PM me, it might be ignored.

Share this post


Link to post
Share on other sites
Guest

ok, I have executed the rows downloads_controllers_english.sql,

I have controlled also the table orders_status and have set up value id 11 of Download now and value 12 of update Avviable.

 

I have tried to make an order and hour exits this:

NOTE: Downloads are not available until payment has been confirmed

 

Therefore now would have to work all true?

Share this post


Link to post
Share on other sites

Hi,

 

After struggling a whole day with the download v5, with the result of a big frustration; I seemed to having installed this super download controller pretty fast thanks to your great tutorial, but I do have a problem with the sql files. the downloads_controller_english integrated without any problems, but when i tried to integrate the group_file_for_download.sql I got following error:

 

SQL query:

 

ALTER TABLE `products_attributes_download` ADD `products_attributes_filegroup_id` INT( 11 ) NULL AFTER `products_attributes_filename`

 

MySQL said: Documentation

#1060 - Duplicate column name 'products_attributes_filegroup_id'

 

I am not very good in mysql and this whole phpmyadmin so I don't know what I have to do in order to fix this problem...

 

Any help is extremely appreciated!

 

Thanks in advance!

 

Karin

Share this post


Link to post
Share on other sites

additional info. the Error message on: catalog/admin/filegroup_db_setup.php

 

Is the following: 1146 - Table 'eq34517.products_attributes_download_groups' doesn't exist

 

select * from products_attributes_download_groups where download_group_id = 0 and language_id = '1'

 

[TEP STOP]

 

I guess that's because the sql file didn't integrate properly, but maybe it helsp to help solve my problem...

 

Karin

Share this post


Link to post
Share on other sites

The new definition TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD_GROUPS in catalog/admin/includes/database_tables.php is not setup correctly.

 

Try removing the 'eq34517.' in front of 'products_attributes_download_groups'.

Edited by AlexStudio

Super Download Shop, PayPal Express Checkout IPN, Selling Downloads, Visual Validation (preventing robotic flood), phpBB2 Integration

 

Yes, I'm willing to help, but please ask in the right place. Think twice before trying to PM me, it might be ignored.

Share this post


Link to post
Share on other sites

Thanks for your fast reply!

sounds good and logic, but how do i do that? i don't want to mess my database up. Could you explain it for a dummy, please?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×