Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

Shopping cart keeps items after attempting to purchase


cmxsevenfoldxmc

Recommended Posts

Hello there,

 

Some of my customers try to go through the checkout process, but end up being returned to the main page, and the shopping cart still has the items they attempted to buy in the first place.

 

Any idea why this is happening?

 

I checked around but couldn't find an answer.

 

Here's my checkout process just in case:

 

Thanks in advance!

 

<?php
/*
 $Id: checkout_process.php,v 1.128 2003/05/28 18:00:29 hpdl Exp $
 adapted for Separate Pricing Per Customer 2006/09/09 (attribute prices for groups, hide attributes from groups)

 osCommerce, Open Source E-Commerce Solutions
 http://www.oscommerce.com

 Copyright (c) 2003 osCommerce

 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;

// check order total minimum
 if ($order->info['subtotal'] < MIN_ORDER_AMOUNT) {
       tep_redirect(tep_href_link(FILENAME_SHOPPING_CART, '', 'NONSSL'));
 }

// 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' => $order->info['order_status'],
                                                 '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' => $order->info['order_status'],
                                                 'date_added' => 'now()',
                                                 'customer_notified' => $customer_notification,
                                                 'comments' => $order->info['comments']);
 tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);

 //kgt - discount coupons
 if( tep_session_is_registered( 'coupon' ) && is_object( $order->coupon ) ) {
         $sql_data_array = array( 'coupons_id' => $order->coupon->coupon['coupons_id'],
                                                        'orders_id' => $insert_id );
         tep_db_perform( TABLE_DISCOUNT_COUPONS_TO_ORDERS, $sql_data_array );
 }
 //end kgt - discount coupons

// initialized for the email confirmation
 $products_ordered = '';
 $subtotal = 0;
 $total_tax = 0;

 for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
// Stock Update - Joao Correia
       if (STOCK_LIMITED == '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);
// BOF Separate Pricing Per Customer attribute_groups mod
 if (isset($_SESSION['sppc_customer_group_id']) && $_SESSION['sppc_customer_group_id'] != '0') {
          $attributes_group_query = tep_db_query("select pag.options_values_price, pag.price_prefix from " . TABLE_PRODUCTS_ATTRIBUTES . " pa left join " . TABLE_PRODUCTS_ATTRIBUTES_GROUPS . " pag using(products_attributes_id) where pa.products_id = '" . tep_get_prid($order->products[$i]['id']) . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pag.customers_group_id = '" . (int)$_SESSION['sppc_customer_group_id'] . "'");
                if ($attributes_group = tep_db_fetch_array($attributes_group_query)) {
                        $attributes_values['options_values_price'] = $attributes_group['options_values_price'];
                        $attributes_values['price_prefix'] = $attributes_group['price_prefix'];
                }
 }
// EOF Separate Pricing Per Customer attribute_groups mod


               $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'];
         }
       }
//------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";
 }

// lets start with the email confirmation
 $email_order = STORE_NAME . "\n" .
                                EMAIL_SEPARATOR . "\n" .
                                EMAIL_TEXT_ORDER_NUMBER . ' ' . $insert_id . "\n" .
                                EMAIL_TEXT_INVOICE_URL . ' ' . tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id=' . $insert_id, 'SSL', false) . "\n" .
                                EMAIL_TEXT_DATE_ORDERED . ' ' . strftime(DATE_FORMAT_LONG) . "\n\n";
 if ($order->info['comments']) {
       $email_order .= tep_db_output($order->info['comments']) . "\n\n";
 }
 $email_order .= EMAIL_TEXT_PRODUCTS . "\n" .
                                 EMAIL_SEPARATOR . "\n" .
                                 $products_ordered .
                                 EMAIL_SEPARATOR . "\n";

 for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
       $email_order .= strip_tags($order_totals[$i]['title']) . ' ' . strip_tags($order_totals[$i]['text']) . "\n";
 }

 if ($order->content_type != 'virtual') {
       $email_order .= "\n" . EMAIL_TEXT_DELIVERY_ADDRESS . "\n" .
                                       EMAIL_SEPARATOR . "\n" .
                                       tep_address_label($customer_id, $sendto, 0, '', "\n") . "\n";
 }

 $email_order .= "\n" . EMAIL_TEXT_BILLING_ADDRESS . "\n" .
                                 EMAIL_SEPARATOR . "\n" .
                                 tep_address_label($customer_id, $billto, 0, '', "\n") . "\n\n";
 if (is_object($$payment)) {
       $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
                                       EMAIL_SEPARATOR . "\n";
       $payment_class = $$payment;
       $email_order .= $payment_class->title . "\n\n";
       if ($payment_class->email_footer) {
         $email_order .= $payment_class->email_footer . "\n\n";
       }
 }
 $new_mail_subject = EMAIL_TEXT_SUBJECT . ' - ' . EMAIL_TEXT_ORDER_NUMBER . ' ' . $insert_id;
tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], $new_mail_subject, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);

// send emails to other people
 if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
       tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, $new_mail_subject, $email_order, $order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address']);
 }

// load the after_process function from the payment modules
 $payment_modules->after_process();

 $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');
 //kgt - discount coupons
 tep_session_unregister('coupon');
 //end kgt - discount coupons

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

 require(DIR_WS_INCLUDES . 'application_bottom.php');
?>

Link to comment
Share on other sites

Did you install any new modules? I see you have SPPC and Coupons.

 

What payment type are they using when this happens (if you have more then 1 option, PayPal, Google Checkout, COD, ect.)

 

Have you been able to duplicate the problem with a test order?

 

Are the orders showing up in the admin panel?

 

When they try and place the order again does it then work, or is it always an endless loop for that customer?

Link to comment
Share on other sites

Did you install any new modules? I see you have SPPC and Coupons.

 

What payment type are they using when this happens (if you have more then 1 option, PayPal, Google Checkout, COD, ect.)

 

Have you been able to duplicate the problem with a test order?

 

Are the orders showing up in the admin panel?

 

When they try and place the order again does it then work, or is it always an endless loop for that customer?

 

Hi NodsDorf,

 

Did you install any new modules? I see you have SPPC and Coupons.

I had installed new modules but attempted to go back to previous versions of the online store since these modules were either not working properly / not needed anymore.

 

What payment type are they using when this happens (if you have more then 1 option, PayPal, Google Checkout, COD, ect.)

This usually happens with paypal and Credit Card orders. I have PayPal and Elavon Credit Card Module enabled.

 

Have you been able to duplicate the problem with a test order?

When I try to duplicate this problem with either the test credit card my credit card module brings, or with my actual American Express card, the order goes through without a problem. It only happens to some customers, not all. I get an Order Process email through every once in a while... But unfortunately, I get 3 or 4 orders afterwards that do not go through.

 

On this note: The reason why I know these orders happen but don't get placed on the site is because I see them in my credit card transactions (through my online banking) and also on my paypal statements as being processed. So the payment is processed, but I often don't receive the Order Process.

 

 

Are the orders showing up in the admin panel?

No orders show up in the Admin Panel, except for those that actually pull through and send out an Order Process email.

 

When they try and place the order again does it then work, or is it always an endless loop for that customer?

It is an endless loop for the customers that get this error.

Link to comment
Share on other sites

I have had the same problem in the past.

 

That is the customer places the order but the store doesn't recognize the order as placed (but the payments are charged to the customers).

 

On your end you don't see the order in the admin panel, and you're not even aware of a problem until you match monthly transactions to the orders or a customer emails / calls complaining you stole money from them. Often times they attempt the purchase multiple times and you wind up having to dig through tons of transactions to refund them. VERY FRUSTRATING!

 

This happened to me when I installed / uninstalled Payment modules. And when I added payment modifying modules such as BuySafe, Shipping, Tax etc.

 

How I fixed it.

 

Went back to stock oscommerce payment modules and re-installed everything that I wanted to use.

 

Before you do that, check your Admin > Modules

Uninstall every module you're not using. Do not just disable them. If you have any diabled modules that aren't uninstalled do it first, then watch your processors daily to see if it is fixed. If all fails you may need to drop in stock oscommerce payment modules and re-install them.

 

I hope this helps and if anybody else has other solutions or ideas please feel free to share.

 

I sometimes over-kill things when trying to fix problems!

Link to comment
Share on other sites

NodsDorf

 

Thank you very much for your kind help.

 

As frustrating as it has been to go through this hassle almost on a weekly basis, it has also been frustrating trying to figure out the source of the problem.

 

I am in the process of doing what you've suggested.

 

I'm crossing my fingers and hoping for the best in the next couple of days to see if my online store comes back to full health.

 

Thanks again for your help. I will try to write back when I see the results.

 

Cheers

Link to comment
Share on other sites

Thought of sharing this with you.. !! Take a look it might help you..!!

 

It seems that nowadays credit cards are an established part of everyday life - indeed, it's very hard to think of living without one in these days of online shopping and bill payment. There is a dark side to credit cards though, and not just the fact that it's a simple matter to run up huge debts with them if not used responsibly. Credit card crime has been soaring over recent years, despite the best efforts of card issuers and banks to crack down on it.

 

In theory, if your credit card account is compromised you should be protected from any financial loss as the card company has an obligation to shoulder the burden unless it can be shown that you acted irresponsibly. In practice, however, if you're a victim of credit card fraud then the mess that will be made will take months if not years to clean up completely, and is something you'd really rather avoid. So how can you use your card safely?

 

The first thing to note is that you should never give out your PIN to anyone, apart from keying it into the payment points when shopping. Never give out your PIN online as it's not needed, and never give it out over the telephone. Likewise, never respond to emails asking you for information about your card or bank account - they are always bogus as banks will never ask for sensitive details via email.

 

You should never let your card out of your sight when paying in a shop or restaurant. The days where you handed over your card and it was taken out back for processing are over - it's too easy for a card to be 'cloned' in this way. Nowadays, almost every merchant will have a portable payment device where you can key in your PIN without ever losing sight of your card.

 

Finally, be aware that your card statements contain valuable information about your account and you should either keep them filed safely, or should dispose of them properly by shredding or burning them. Putting them in the trash is all but an invitation to have your account broken into and emptied by an identity fraudster.

 

 

Hope this might help you..!!

 

 

.

.

 

major company credit report

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...