Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

Recommended Posts

Posted

Thius looks like exactly what I need. Just a couple of questions.

 

1. I am using worldpay as a payment option as well as paypal. At the moment I am in the process of getting recurring billing billing working with worldpay (thanks so much to daren!!) and would like to have the option with paypal as well. Can you make these changes for paypal if there is another poayment option available? I am assuming the answer is yes since they are in separate files in the modules folder but just thought I would check.

 

2. I see in the script going through how to install the changes it mentions paypal ipn. Does this have to be installed as well? I took a look at the latest paypal ipn and it looked really comp[licated - there were a load of folders that i could not even find in my installation of osc so wondering how I even start this???? Any help and advice appreciated!

 

BTW, I already have a paypal business account and can accept recurring payments - I have been doing this before OSC with a recuring button.

 

Thanks,

 

Nikki

  • 2 weeks later...
Posted

this below is the url that shows up to connect to paypal.

 

https://www.paypal.com/cgi-bin/webscr?cmd=_...ypal_notify.php

 

 

Error Detected

The link you have used to enter the PayPal system is invalid. Please review the link and try again

 

 

]this is my checkout_paypalipn.php (thank you for any help)

 

 

<?php

/*

$Id: paypal_notify.php,v 0.981 2003-16-07 10:57:31 pablo_pasqualino Exp pablo_pasqualino $

osCommerce, Open Source E-Commerce Solutions

http://www.oscommerce.com

 

Paypal IPN v0.981 for Milestone 2

Copyright © 2003 Pablo Pasqualino

[email protected]

http://www.osmosisdc.com

 

Released under the GNU General Public License

*/

 

include('includes/application_top.php');

 

// if the customer is not logged on, redirect them to the login page

if (!tep_session_is_registered('customer_id')) {

$navigation->set_snapshot(array('mode' => 'SSL', 'page' => FILENAME_CHECKOUT_PAYMENT));

tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));

}

 

if (!tep_session_is_registered('sendto')) {

tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));

}

 

if ( (tep_not_null(MODULE_PAYMENT_INSTALLED)) && (!tep_session_is_registered('payment')) ) {

tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));

}

 

// avoid hack attempts during the checkout procedure by checking the internal cartID

if (isset($cart->cartID) && tep_session_is_registered('cartID')) {

if ($cart->cartID != $cartID) {

tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));

}

}

 

include(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CHECKOUT_PROCESS);

 

// load selected payment module

require(DIR_WS_CLASSES . 'payment.php');

$payment_modules = new payment($payment);

 

// load the selected shipping module

require(DIR_WS_CLASSES . 'shipping.php');

$shipping_modules = new shipping($shipping);

 

require(DIR_WS_CLASSES . 'order.php');

$order = new order;

 

// load the before_process function from the payment modules

$payment_modules->before_process();

 

require(DIR_WS_CLASSES . 'order_total.php');

$order_total_modules = new order_total;

 

$order_totals = $order_total_modules->process();

 

$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'],

'date_purchased' => 'now()',

'orders_status' => 99999,

'currency' => $order->info['currency'],

'currency_value' => $order->info['currency_value']);

tep_db_perform(TABLE_ORDERS, $sql_data_array);

$insert_id = tep_db_insert_id();

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

}

 

$customer_notification = (SEND_EMAILS == 'true') ? '1' : '0';

$sql_data_array = array('orders_id' => $insert_id,

'orders_status_id' => '99999',

'date_added' => 'now()',

'customer_notified' => $customer_notification,

'comments' => $order->info['comments']);

tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);

 

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

// Stock Update - Joao Correia

if (STOCK_LIMITED == 'true' && MODULE_PAYMENT_PAYPALIPN_UPDATE_STOCK_BEFORE_PAYMENT=='True') {

if (DOWNLOAD_ENABLED == 'true') {

$stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename

FROM " . TABLE_PRODUCTS . " p

LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES . " pa

ON p.products_id=pa.products_id

LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad

ON pa.products_attributes_id=pad.products_attributes_id

WHERE p.products_id = '" . tep_get_prid($order->products[$i]['id']) . "'";

// Will work with only one option for downloadable products

// otherwise, we have to build the query dynamically with a loop

$products_attributes = $order->products[$i]['attributes'];

if (is_array($products_attributes)) {

$stock_query_raw .= " AND pa.options_id = '" . $products_attributes[0]['option_id'] . "' AND pa.options_values_id = '" . $products_attributes[0]['value_id'] . "'";

}

$stock_query = tep_db_query($stock_query_raw);

} else {

$stock_query = tep_db_query("select products_quantity from " . TABLE_PRODUCTS . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

}

if (tep_db_num_rows($stock_query) > 0) {

$stock_values = tep_db_fetch_array($stock_query);

// do not decrement quantities if products_attributes_filename exists

if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename'])) {

$stock_left = $stock_values['products_quantity'] - $order->products[$i]['qty'];

} else {

$stock_left = $stock_values['products_quantity'];

}

tep_db_query("update " . TABLE_PRODUCTS . " set products_quantity = '" . $stock_left . "' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

if ( ($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false') ) {

tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '0' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

}

}

}

 

// Update products_ordered (for bestsellers list)

tep_db_query("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%d', $order->products[$i]['qty']) . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

 

$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();

 

//------insert customer choosen option to order--------

$attributes_exist = '0';

$products_ordered_attributes = '';

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'])) {

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

}

$products_ordered_attributes .= "\n\t" . $attributes_values['products_options_name'] . ' ' . $attributes_values['products_options_values_name'];

 

$paypal_period = $attributes_values['products_options_values_name'];

}

}

//------insert customer choosen option eof ----

$total_weight += ($order->products[$i]['qty'] * $order->products[$i]['weight']);

$total_tax += tep_calculate_tax($total_products_price, $products_tax) * $order->products[$i]['qty'];

$total_cost += $total_products_price;

 

$products_ordered .= $order->products[$i]['qty'] . ' x ' . $order->products[$i]['name'] . ' (' . $order->products[$i]['model'] . ') = ' . $currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']) . $products_ordered_attributes . "\n";

}

 

// load the after_process function from the payment modules

$payment_modules->after_process();

 

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

 

if (ereg($order->info['currency'],MODULE_PAYMENT_PAYPALIPN_ALLOWED_CURRENCIES)) {

$paypal_ipn_currency = $order->info['currency'];

} else {

$paypal_ipn_currency = MODULE_PAYMENT_PAYPALIPN_DEFAULT_CURRENCY;

};

 

$paypal_ipn_order_amount = $order->info['total'];

 

if (MODULE_PAYMENT_PAYPALIPN_ADD_SHIPPING_TO_AMOUNT=='True') {

$paypal_ipn_shipping_amount = 0.00;

} else {

$paypal_ipn_order_amount -= $order->info['shipping_cost'];

$paypal_ipn_shipping_amount = number_format($order->info['shipping_cost'] * $currencies->get_value($paypal_ipn_currency), 2);

};

 

if (MODULE_PAYMENT_PAYPALIPN_ADD_TAX_TO_AMOUNT=='True') {

$paypal_ipn_tax_amount = 0.00;

} else {

$paypal_ipn_order_amount -= $order->info['tax'];

$paypal_ipn_tax_amount = number_format($order->info['tax'] * $currencies->get_value($paypal_ipn_currency), 2);

};

 

$paypal_ipn_order_amount = number_format($paypal_ipn_order_amount * $currencies->get_value($paypal_ipn_currency), 2);

 

tep_redirect("https://www.paypal.com/cgi-bin/webscr?cmd=_xclick-subscriptions&business=".MODULE_PAYMENT_PAYPALIPN_ID."&item_name=".urlencode(STORE_NAME)."&item_number=".$insert_id."&no_note=1"."&currency_code=".$paypal_ipn_currency."&a3=".$paypal_ipn_order_amount."&p3=1"."&t3=".$paypal_period."&src=1"."&sra=1"."&usr_manage=0"."&shipping=".$paypal_ipn_shipping_amount."&tax=".$paypal_ipn_tax_amount."&first_name=".urlencode($order->customer['firstname'])."&last_name=".urlencode($order->customer['lastname'])."&address1=".urlencode($order->customer['street_address'])."&city=".urlencode($order->customer['city'])."&state=".urlencode($order->customer['state'])."&zip=".urlencode($order->customer['postcode'])."&email=".$order->customer['email_address']."&bn=oscommerce-osmosis-0.971m1&return=".tep_href_link(FILENAME_CHECKOUT_SUCCESS, '', 'SSL')."&cancel_return=".tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL')."&notify_url=".MODULE_PAYMENT_PAYPALIPN_NOTIFY_URL);

 

require(DIR_WS_INCLUDES . 'application_bottom.php');

?>

*****************end*************************

  • 4 months later...
Posted

I'm having the same error as noppie, my cart can be found at http://headshotservers.com/cart/ if you want to see it for yourself, I have a test account setup if you'd like to use it UN is: [email protected] PW is: tested

 

I would like very much to switch to osCommerce so that I can get away from using phpnuke for my site, so any help here would be greatly appreciated.

 

Here's the link from OSC to paypal:

https://www.paypal.com/cgi-bin/webscr?cmd=_xclick-subscriptions&[email protected]&item_name=HeadshotServers.com&no_note=1?cy_code=USD&a3=24.00&p3=1&t3=12&src=1&sra=1&usr_manage=0&first_name=test&last_name=testt&[email protected]&return=http://headshotservers.com/cart/checkout_success.php&cancel_return=http://headshotservers.com/cart/checkout_payment.php?ify_url=http://headshotservers.com/cart/paypal_notify.php

 

And here's the code from checkout_paypalipn.php:

tep_redirect("https://www.paypal.com/cgi-bin/webscr?cmd=_xclick-subscriptions&business=".MODULE_PAYMENT_PAYPALIPN_ID."&item_name=".urlencode(STORE_NAME)."&no_note=1"."?cy_code=".$paypal_ipn_currency."&a3=".$paypal_ipn_order_amount."&p3=1"."&t3=".$paypal_period."&src=1"."&sra=1"."&usr_manage=0"."&first_name=".urlencode($order->customer['firstname'])."&last_name=".urlencode($order->customer['lastname'])."&email=".$order->customer['email_address']."&return=".tep_href_link(FILENAME_CHECKOUT_SUCCESS, '', 'SSL')."&cancel_return=".tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL')."?ify_url=".MODULE_PAYMENT_PAYPALIPN_NOTIFY_URL);

 

Has paypal simply changed their address string variables? My installation of OSC is a base MS2 setup. The only changes I have made are those from the IPN contrib, the Family products contrib (1.1) and this contrib. Also, do I need to setup IPN through paypal.com? I have already got it setup, but it's directed toward the ipn module of my current shopping cart (I'm in the process of trying to switch to OSC from Calloway's Cart which I use with phpnuke). The whole reason that I'm switching to OSC is that I can use this contrib for my subscription items, but it seems that it isn't working with the latest MS release...

 

If someone could come up with an answer, that would be great. In the meantime, I'll be looking through paypal's API information trying to figure out what's causing the error. If I do figure it out, I'll post here and add my findings to the contrib section.

  • 2 weeks later...
Posted

Ok, well this is a subscription button that I generated with paypal.com's WPP and it gives a little insite into how the command should be formulated:

 

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-but20.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
<input type="hidden" name="cmd" value="_xclick-subscriptions">
<input type="hidden" name="business" value="[email protected]">
<input type="hidden" name="item_name" value="test">
<input type="hidden" name="item_number" value="test01">
<input type="hidden" name="no_shipping" value="1">
<input type="hidden" name="no_note" value="1">
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="bn" value="PP-SubscriptionsBF">
<input type="hidden" name="a3" value="20.00">
<input type="hidden" name="p3" value="1">
<input type="hidden" name="t3" value="M">
<input type="hidden" name="src" value="1">
<input type="hidden" name="sra" value="1">

 

I have gone through and edited it up so that it loads through a php parser as an echo, simply running the form. Now how do I make tep_redirect point to it? Because I can't have it pointing to an echo.

 

Here's the code for the echoed form:

 

echo "<form action=\"https://www.paypal.com/cgi-bin/webscr\" method=\"post\">
<input type=\"hidden\" name=\"cmd\" value=\"_xclick-subscriptions\">
<input type=\"hidden\" name=\"business\" value=\".MODULE_PAYMENT_PAYPALIPN_ID.\">
<input type=\"hidden\" name=\"item_name\" value=\".urlencode(STORE_NAME).\">
<input type=\"hidden\" name=\"no_shipping\" value=\"1\">
<input type=\"hidden\" name=\"no_note\" value=\"1\">
<input type=\"hidden\" name=\"currency_code\" value=\"USD\">
<input type=\"hidden\" name=\"bn\" value=\"PP-SubscriptionsBF\">
<input type=\"hidden\" name=\"a3\" value=\".$paypal_ipn_order_amount.\">
<input type=\"hidden\" name=\"p3\" value=\"1\">
<input type=\"hidden\" name=\"t3\" value=\"M\">
<input type=\"hidden\" name=\"src\" value=\"1\">
<input type=\"hidden\" name=\"sra\" value=\"1\">
<input type=\"hidden\" name=\"email\" value=\".$order->customer['email_address'].\">
<input type=\"hidden\" name=\"return\" value=\".tep_href_link FILENAME_CHECKOUT_SUCCESS, '', 'SSL').\">
<input type=\"hidden\" name=\"cancel_return\" value=\".tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', SSL').\">
<input type=\"hidden\" name=\"notify_url\" value=\".MODULE_PAYMENT_PAYPALIPN_NOTIFY_URL);\">"

 

Now I'm fully aware that this is probably the worst code on the entire site, but that's because I'm not a php coder. In fact, I don't know shit about php. But at lest I'm trying to fix this broken contrib.

 

What are you doing?

  • 4 weeks later...
Posted (edited)

Well, I've figured out what the problem is, but not how to fix it.

 

When the link is passed into paypal.com from tep_redirect, it's sent in standard text as such:

https://www.paypal.com/cgi-bin/webscr?cmd=_xclick-subscriptions&[email protected]&item_name=12 slot HL1 based server&page_style=Primary&no_shipping=1&return=http://headshotservers.com/successpp.htm&cancel_return=http://headshotservers.com/cancelpp.htm&no_note=1&currency_code=USD&bn=PP-SubscriptionsBF&charset=UTF-8&a3=24.00&p3=1&t3=M&src=1&sra=1

 

But it should be passed as "coded" text like this:

https://www.paypal.com/cgi-bin/webscr?cmd=_xclick-subscriptions&business=sales%40headshotservers%2ecom&item_name=12 slot HL1 based server&page_style=Primary&no_shipping=1&return=http%3a%2f%2fheadshotservers%2ecom%2fsuccesspp%2ehtm&cancel_return=http%3a%2f%2fheadshotservers%2ecom%2fcancelpp%2ehtm&no_note=1&currency_code=USD&bn=PP%2dSubscriptionsBF&charset=UTF%2d8&a3=24%2e00&p3=1&t3=M&src=1&sra=1

 

Notice that :// is replaced by %3a%2f%2f and . is replaced by %2e etc. I'm not sure if there's an easy way to tell the php parser to pass the link in the "coded" style, but if there is, that's all that needs to be changed.

Edited by techieVLAD
  • 4 weeks later...
Posted

Help me, I am using the script you give to the forum,but I have one question,I want to creat a subscription which collect money every 2 months,is it possible to do?I have tried many times,but fail!HELP

  • 4 years later...
Posted (edited)

I'm not sure what the other progammer did, but I only have this checkout_paypalipn.php file.

Had searched the net and this module seems to be the one that's using this file. (PayPal IPN v0.981 for Milestone 2)

 

I wish to modify the way this script works by updating the products_ordered DB only when the order status has been set to Delivered.

Any off hand solutions out there?

Edited by resting

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

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...