I'm stuck on an OSCommerce coding problem.

  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

Prior I posted a request for help on an install problem and everything is working, and rather nicely I might add. I like this script so far. But, I'm stuck on something at the moment. The client, does not want to (at this point) use a payment gateway, but instead wants the credit card and billing information emailed to them so they can process it manually.

Well the order info is emailed just fine, and includes everything necessary except the credit card type, credit card owner, credit card number, and expiration. I can't seem to write the code correctly to get that information added to the script. The script is in the checkout_process.php file.

The info is stored in the orders table in columns
cc_type
cc_owner
cc_number
cc_expires

orders_id is the primary key and auto increments.

The array appears to already be set up to include these fields and as best as I can tell, all tables involved have already been queried:

Code: [ Select ]
$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']);
  1. $sql_data_array = array('customers_id' => $customer_id,
  2.              'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],
  3.              'customers_company' => $order->customer['company'],
  4.              'customers_street_address' => $order->customer['street_address'],
  5.              'customers_suburb' => $order->customer['suburb'],
  6.              'customers_city' => $order->customer['city'],
  7.              'customers_postcode' => $order->customer['postcode'],
  8.              'customers_state' => $order->customer['state'],
  9.              'customers_country' => $order->customer['country']['title'],
  10.              'customers_telephone' => $order->customer['telephone'],
  11.              'customers_email_address' => $order->customer['email_address'],
  12.              'customers_address_format_id' => $order->customer['format_id'],
  13.              'delivery_name' => $order->delivery['firstname'] . ' ' . $order->delivery['lastname'],
  14.              'delivery_company' => $order->delivery['company'],
  15.              'delivery_street_address' => $order->delivery['street_address'],
  16.              'delivery_suburb' => $order->delivery['suburb'],
  17.              'delivery_city' => $order->delivery['city'],
  18.              'delivery_postcode' => $order->delivery['postcode'],
  19.              'delivery_state' => $order->delivery['state'],
  20.              'delivery_country' => $order->delivery['country']['title'],
  21.              'delivery_address_format_id' => $order->delivery['format_id'],
  22.              'billing_name' => $order->billing['firstname'] . ' ' . $order->billing['lastname'],
  23.              'billing_company' => $order->billing['company'],
  24.              'billing_street_address' => $order->billing['street_address'],
  25.              'billing_suburb' => $order->billing['suburb'],
  26.              'billing_city' => $order->billing['city'],
  27.              'billing_postcode' => $order->billing['postcode'],
  28.              'billing_state' => $order->billing['state'],
  29.              'billing_country' => $order->billing['country']['title'],
  30.              'billing_address_format_id' => $order->billing['format_id'],
  31.              'payment_method' => $order->info['payment_method'],
  32.              'cc_type' => $order->info['cc_type'],
  33.              'cc_owner' => $order->info['cc_owner'],
  34.              'cc_number' => $order->info['cc_number'],
  35.              'cc_expires' => $order->info['cc_expires'],
  36.              'date_purchased' => 'now()',
  37.              'orders_status' => $order->info['order_status'],
  38.              'currency' => $order->info['currency'],
  39.              'currency_value' => $order->info['currency_value']);



Here is where the code needs to be added:

Code: [ Select ]
 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";
  }
 }
  1.  if ($order->content_type != 'virtual') {
  2.   $email_order .= "\n" . EMAIL_TEXT_DELIVERY_ADDRESS . "\n" .
  3.           EMAIL_SEPARATOR . "\n" .
  4.           tep_address_label($customer_id, $sendto, 0, '', "\n") . "\n";
  5.  }
  6.  $email_order .= "\n" . EMAIL_TEXT_BILLING_ADDRESS . "\n" .
  7.          EMAIL_SEPARATOR . "\n" .
  8.          tep_address_label($customer_id, $billto, 0, '', "\n") . "\n\n";
  9.  if (is_object($$payment)) {
  10.   $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
  11.           EMAIL_SEPARATOR . "\n";
  12.   $payment_class = $$payment;
  13.   $email_order .= $payment_class->title . "\n\n";
  14.   if ($payment_class->email_footer) {
  15.    $email_order .= $payment_class->email_footer . "\n\n";
  16.   }
  17.  }


I'd like to add this info after the payment method variable $$payment

Truthfully, I haven't actually tried anything, because I'm at a knowledge level on this that I understand pretty much what code does what, but don't understand the syntax and query methods and what not to get it right. And this code is a bit different than the phpBB code which I'm more familiar with and can manipulate and modify easier.

If need be, I can include the entire code for the page since it's only a couple hundred lines.

Thanks if you can help.
  • Anonymous
  • Bot
  • No Avatar
  • Posts: ?
  • Loc: Ozzuland
  • Status: Online

Post 3+ Months Ago

  • b_heyer
  • Web Master
  • Web Master
  • User avatar
  • Posts: 4581
  • Loc: Maryland

Post 3+ Months Ago

I can understand your clients request, but I would suggest training him how to handle orders on the secure administration panel. For one reason, email isn't secure, that is why osCommerce doesn't send along the information you are missing.

I am not sure what you mean as a payment gateway, but with default settings, if you set up so they enter their ccd information, it then just adds the order as pending to the database, and it needs to be filed manually.

The separate email your getting is just used as a notifying method so they know to check the admin panel for the credit card info. I wouldn't suggest changing that for security reasons.

Finally the code, I don't know object oriented php yet so I can't really help you there :-?
  • b_heyer
  • Web Master
  • Web Master
  • User avatar
  • Posts: 4581
  • Loc: Maryland

Post 3+ Months Ago

Whoa! RichB is on the ball. Yea his example should work great if those variables exist. I wasn't thinking and I just saw "if (is_object())" and just assumed it'd be dealing with object based stuff I don't comprehend. But as RichB has it it should work great!

//erm I am NOT going crazy he DID just have a post here... I saw it! *goes off and cries maniacally*
  • RichB
  • Guru
  • Guru
  • User avatar
  • Posts: 1121
  • Loc: Boston

Post 3+ Months Ago

b_heyer raises a good point. I'm not sure if it would be wise to do so.

If I understand correctly you would need to add that information to the $email_order variable that is a string containing the information with the body of the email. From the code you provided it looks like the information should be in the $sql_data_array variable, so I would try to extract it and concatenate it to the $email_order variable unless it's already been defined as constants as the payment method.
I would try replacing:
Code: [ Select ]
  $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
          EMAIL_SEPARATOR . "\n";
  1.   $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
  2.           EMAIL_SEPARATOR . "\n";

with:
Code: [ Select ]
$email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
    EMAIL_SEPARATOR . "\n" .
    $sql_data_array['cc_type'] . "\n" .
    EMAIL_SEPARATOR . "\n" .
    $sql_data_array['cc_owner'] . "\n" .
    EMAIL_SEPARATOR . "\n" .
    $sql_data_array['cc_number'] . "\n" .
    EMAIL_SEPARATOR . "\n" .
    $sql_data_array['cc_expires'] . "\n" .
    EMAIL_SEPARATOR . "\n";
  1. $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
  2.     EMAIL_SEPARATOR . "\n" .
  3.     $sql_data_array['cc_type'] . "\n" .
  4.     EMAIL_SEPARATOR . "\n" .
  5.     $sql_data_array['cc_owner'] . "\n" .
  6.     EMAIL_SEPARATOR . "\n" .
  7.     $sql_data_array['cc_number'] . "\n" .
  8.     EMAIL_SEPARATOR . "\n" .
  9.     $sql_data_array['cc_expires'] . "\n" .
  10.     EMAIL_SEPARATOR . "\n";
  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

Thanks b_heyer.

I do know the security issues and will make the recommendations (as I'm 3rd party on this and just developing the cart, I have to go through the chain of command) In the end the transactions will be handled via SSL. I'm just experimenting at the moment.

And I'm about where you are with the object stuff, I think, which is why I'm having such a hard time getting this.
  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

RichB I actually was trying not to post the entire code, but if it will help, it sounds to me like you have the right idea, so here's the code for you to confirm your last post:

Code: [ Select ]
<?php
/*
 $Id: checkout_process.php,v 1.128 2003/05/28 18:00:29 hpdl Exp $

 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;

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

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

    $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";
  }
 }
 tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_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, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_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');

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

 require(DIR_WS_INCLUDES . 'application_bottom.php');
?>
  1. <?php
  2. /*
  3.  $Id: checkout_process.php,v 1.128 2003/05/28 18:00:29 hpdl Exp $
  4.  osCommerce, Open Source E-Commerce Solutions
  5.  http://www.oscommerce.com
  6.  Copyright (c) 2003 osCommerce
  7.  Released under the GNU General Public License
  8. */
  9.  include('includes/application_top.php');
  10. // if the customer is not logged on, redirect them to the login page
  11.  if (!tep_session_is_registered('customer_id')) {
  12.   $navigation->set_snapshot(array('mode' => 'SSL', 'page' => FILENAME_CHECKOUT_PAYMENT));
  13.   tep_redirect(tep_href_link(FILENAME_LOGIN, '', 'SSL'));
  14.  }
  15.  
  16.  if (!tep_session_is_registered('sendto')) {
  17.   tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
  18.  }
  19.  if ( (tep_not_null(MODULE_PAYMENT_INSTALLED)) && (!tep_session_is_registered('payment')) ) {
  20.   tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'));
  21. }
  22. // avoid hack attempts during the checkout procedure by checking the internal cartID
  23.  if (isset($cart->cartID) && tep_session_is_registered('cartID')) {
  24.   if ($cart->cartID != $cartID) {
  25.    tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));
  26.   }
  27.  }
  28.  include(DIR_WS_LANGUAGES . $language . '/' . FILENAME_CHECKOUT_PROCESS);
  29. // load selected payment module
  30.  require(DIR_WS_CLASSES . 'payment.php');
  31.  $payment_modules = new payment($payment);
  32. // load the selected shipping module
  33.  require(DIR_WS_CLASSES . 'shipping.php');
  34.  $shipping_modules = new shipping($shipping);
  35.  require(DIR_WS_CLASSES . 'order.php');
  36.  $order = new order;
  37. // load the before_process function from the payment modules
  38.  $payment_modules->before_process();
  39.  require(DIR_WS_CLASSES . 'order_total.php');
  40.  $order_total_modules = new order_total;
  41.  $order_totals = $order_total_modules->process();
  42.  $sql_data_array = array('customers_id' => $customer_id,
  43.              'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],
  44.              'customers_company' => $order->customer['company'],
  45.              'customers_street_address' => $order->customer['street_address'],
  46.              'customers_suburb' => $order->customer['suburb'],
  47.              'customers_city' => $order->customer['city'],
  48.              'customers_postcode' => $order->customer['postcode'],
  49.              'customers_state' => $order->customer['state'],
  50.              'customers_country' => $order->customer['country']['title'],
  51.              'customers_telephone' => $order->customer['telephone'],
  52.              'customers_email_address' => $order->customer['email_address'],
  53.              'customers_address_format_id' => $order->customer['format_id'],
  54.              'delivery_name' => $order->delivery['firstname'] . ' ' . $order->delivery['lastname'],
  55.              'delivery_company' => $order->delivery['company'],
  56.              'delivery_street_address' => $order->delivery['street_address'],
  57.              'delivery_suburb' => $order->delivery['suburb'],
  58.              'delivery_city' => $order->delivery['city'],
  59.              'delivery_postcode' => $order->delivery['postcode'],
  60.              'delivery_state' => $order->delivery['state'],
  61.              'delivery_country' => $order->delivery['country']['title'],
  62.              'delivery_address_format_id' => $order->delivery['format_id'],
  63.              'billing_name' => $order->billing['firstname'] . ' ' . $order->billing['lastname'],
  64.              'billing_company' => $order->billing['company'],
  65.              'billing_street_address' => $order->billing['street_address'],
  66.              'billing_suburb' => $order->billing['suburb'],
  67.              'billing_city' => $order->billing['city'],
  68.              'billing_postcode' => $order->billing['postcode'],
  69.              'billing_state' => $order->billing['state'],
  70.              'billing_country' => $order->billing['country']['title'],
  71.              'billing_address_format_id' => $order->billing['format_id'],
  72.              'payment_method' => $order->info['payment_method'],
  73.              'cc_type' => $order->info['cc_type'],
  74.              'cc_owner' => $order->info['cc_owner'],
  75.              'cc_number' => $order->info['cc_number'],
  76.              'cc_expires' => $order->info['cc_expires'],
  77.              'date_purchased' => 'now()',
  78.              'orders_status' => $order->info['order_status'],
  79.              'currency' => $order->info['currency'],
  80.              'currency_value' => $order->info['currency_value']);
  81.  tep_db_perform(TABLE_ORDERS, $sql_data_array);
  82.  $insert_id = tep_db_insert_id();
  83.  for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
  84.   $sql_data_array = array('orders_id' => $insert_id,
  85.               'title' => $order_totals[$i]['title'],
  86.               'text' => $order_totals[$i]['text'],
  87.               'value' => $order_totals[$i]['value'],
  88.               'class' => $order_totals[$i]['code'],
  89.               'sort_order' => $order_totals[$i]['sort_order']);
  90.   tep_db_perform(TABLE_ORDERS_TOTAL, $sql_data_array);
  91.  }
  92.  $customer_notification = (SEND_EMAILS == 'true') ? '1' : '0';
  93.  $sql_data_array = array('orders_id' => $insert_id,
  94.              'orders_status_id' => $order->info['order_status'],
  95.              'date_added' => 'now()',
  96.              'customer_notified' => $customer_notification,
  97.              'comments' => $order->info['comments']);
  98.  tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);
  99. // initialized for the email confirmation
  100.  $products_ordered = '';
  101.  $subtotal = 0;
  102.  $total_tax = 0;
  103.  for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
  104. // Stock Update - Joao Correia
  105.   if (STOCK_LIMITED == 'true') {
  106.    if (DOWNLOAD_ENABLED == 'true') {
  107.     $stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename
  108.               FROM " . TABLE_PRODUCTS . " p
  109.               LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES . " pa
  110.                ON p.products_id=pa.products_id
  111.               LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
  112.                ON pa.products_attributes_id=pad.products_attributes_id
  113.               WHERE p.products_id = '" . tep_get_prid($order->products[$i]['id']) . "'";
  114. // Will work with only one option for downloadable products
  115. // otherwise, we have to build the query dynamically with a loop
  116.     $products_attributes = $order->products[$i]['attributes'];
  117.     if (is_array($products_attributes)) {
  118.      $stock_query_raw .= " AND pa.options_id = '" . $products_attributes[0]['option_id'] . "' AND pa.options_values_id = '" . $products_attributes[0]['value_id'] . "'";
  119.     }
  120.     $stock_query = tep_db_query($stock_query_raw);
  121.    } else {
  122.     $stock_query = tep_db_query("select products_quantity from " . TABLE_PRODUCTS . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
  123.    }
  124.    if (tep_db_num_rows($stock_query) > 0) {
  125.     $stock_values = tep_db_fetch_array($stock_query);
  126. // do not decrement quantities if products_attributes_filename exists
  127.     if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename'])) {
  128.      $stock_left = $stock_values['products_quantity'] - $order->products[$i]['qty'];
  129.     } else {
  130.      $stock_left = $stock_values['products_quantity'];
  131.     }
  132.     tep_db_query("update " . TABLE_PRODUCTS . " set products_quantity = '" . $stock_left . "' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
  133.     if ( ($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false') ) {
  134.      tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '0' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");
  135.     }
  136.    }
  137.   }
  138. // Update products_ordered (for bestsellers list)
  139.   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']) . "'");
  140.   $sql_data_array = array('orders_id' => $insert_id,
  141.               'products_id' => tep_get_prid($order->products[$i]['id']),
  142.               'products_model' => $order->products[$i]['model'],
  143.               'products_name' => $order->products[$i]['name'],
  144.               'products_price' => $order->products[$i]['price'],
  145.               'final_price' => $order->products[$i]['final_price'],
  146.               'products_tax' => $order->products[$i]['tax'],
  147.               'products_quantity' => $order->products[$i]['qty']);
  148.   tep_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);
  149.   $order_products_id = tep_db_insert_id();
  150. //------insert customer choosen option to order--------
  151.   $attributes_exist = '0';
  152.   $products_ordered_attributes = '';
  153.   if (isset($order->products[$i]['attributes'])) {
  154.    $attributes_exist = '1';
  155.    for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
  156.     if (DOWNLOAD_ENABLED == 'true') {
  157.      $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
  158.                 from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa
  159.                 left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
  160.                 on pa.products_attributes_id=pad.products_attributes_id
  161.                 where pa.products_id = '" . $order->products[$i]['id'] . "'
  162.                 and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'
  163.                 and pa.options_id = popt.products_options_id
  164.                 and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'
  165.                 and pa.options_values_id = poval.products_options_values_id
  166.                 and popt.language_id = '" . $languages_id . "'
  167.                 and poval.language_id = '" . $languages_id . "'";
  168.      $attributes = tep_db_query($attributes_query);
  169.     } else {
  170.      $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 . "'");
  171.     }
  172.     $attributes_values = tep_db_fetch_array($attributes);
  173.     $sql_data_array = array('orders_id' => $insert_id,
  174.                 'orders_products_id' => $order_products_id,
  175.                 'products_options' => $attributes_values['products_options_name'],
  176.                 'products_options_values' => $attributes_values['products_options_values_name'],
  177.                 'options_values_price' => $attributes_values['options_values_price'],
  178.                 'price_prefix' => $attributes_values['price_prefix']);
  179.     tep_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES, $sql_data_array);
  180.     if ((DOWNLOAD_ENABLED == 'true') && isset($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename'])) {
  181.      $sql_data_array = array('orders_id' => $insert_id,
  182.                  'orders_products_id' => $order_products_id,
  183.                  'orders_products_filename' => $attributes_values['products_attributes_filename'],
  184.                  'download_maxdays' => $attributes_values['products_attributes_maxdays'],
  185.                  'download_count' => $attributes_values['products_attributes_maxcount']);
  186.      tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);
  187.     }
  188.     $products_ordered_attributes .= "\n\t" . $attributes_values['products_options_name'] . ' ' . $attributes_values['products_options_values_name'];
  189.    }
  190.   }
  191. //------insert customer choosen option eof ----
  192.   $total_weight += ($order->products[$i]['qty'] * $order->products[$i]['weight']);
  193.   $total_tax += tep_calculate_tax($total_products_price, $products_tax) * $order->products[$i]['qty'];
  194.   $total_cost += $total_products_price;
  195.   $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";
  196.  }
  197. // lets start with the email confirmation
  198.  $email_order = STORE_NAME . "\n" .
  199.          EMAIL_SEPARATOR . "\n" .
  200.          EMAIL_TEXT_ORDER_NUMBER . ' ' . $insert_id . "\n" .
  201.          EMAIL_TEXT_INVOICE_URL . ' ' . tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id=' . $insert_id, 'SSL', false) . "\n" .
  202.          EMAIL_TEXT_DATE_ORDERED . ' ' . strftime(DATE_FORMAT_LONG) . "\n\n";
  203.  if ($order->info['comments']) {
  204.   $email_order .= tep_db_output($order->info['comments']) . "\n\n";
  205.  }
  206.  $email_order .= EMAIL_TEXT_PRODUCTS . "\n" .
  207.          EMAIL_SEPARATOR . "\n" .
  208.          $products_ordered .
  209.          EMAIL_SEPARATOR . "\n";
  210.  for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
  211.   $email_order .= strip_tags($order_totals[$i]['title']) . ' ' . strip_tags($order_totals[$i]['text']) . "\n";
  212.  }
  213.  if ($order->content_type != 'virtual') {
  214.   $email_order .= "\n" . EMAIL_TEXT_DELIVERY_ADDRESS . "\n" .
  215.           EMAIL_SEPARATOR . "\n" .
  216.           tep_address_label($customer_id, $sendto, 0, '', "\n") . "\n";
  217.  }
  218.  $email_order .= "\n" . EMAIL_TEXT_BILLING_ADDRESS . "\n" .
  219.          EMAIL_SEPARATOR . "\n" .
  220.          tep_address_label($customer_id, $billto, 0, '', "\n") . "\n\n";
  221.  if (is_object($$payment)) {
  222.   $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
  223.           EMAIL_SEPARATOR . "\n";
  224.   $payment_class = $$payment;
  225.   $email_order .= $payment_class->title . "\n\n";
  226.   if ($payment_class->email_footer) {
  227.    $email_order .= $payment_class->email_footer . "\n\n";
  228.   }
  229.  }
  230.  tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
  231. // send emails to other people
  232.  if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
  233.   tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
  234.  }
  235. // load the after_process function from the payment modules
  236.  $payment_modules->after_process();
  237.  $cart->reset(true);
  238. // unregister session variables used during checkout
  239.  tep_session_unregister('sendto');
  240.  tep_session_unregister('billto');
  241.  tep_session_unregister('shipping');
  242.  tep_session_unregister('payment');
  243.  tep_session_unregister('comments');
  244.  tep_redirect(tep_href_link(FILENAME_CHECKOUT_SUCCESS, '', 'SSL'));
  245.  require(DIR_WS_INCLUDES . 'application_bottom.php');
  246. ?>
  • RichB
  • Guru
  • Guru
  • User avatar
  • Posts: 1121
  • Loc: Boston

Post 3+ Months Ago

It looks like that array is used and then recreated with new values, so that won't work. I'll keep looking at it to see if I can come up with something. I've copied the code, so you can edit it out from your post if you don't want to leave it up there.
  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

Thanks. I was concerned about the size, but the page still slams open for me. I'll leave it. Thanks for looking into it.
  • RichB
  • Guru
  • Guru
  • User avatar
  • Posts: 1121
  • Loc: Boston

Post 3+ Months Ago

Ok, I'm pretty certain this will work. The information should still be available in the order object because it is still being accessed by the script after the email confirmation code begins, so it should still be available and contain the data you are looking to extract (I see no evidence that it is unset or destroyed).

You're probably already aware of this but if I'm reading this correctly, the script is set up to send a confirmation email to the customer and a copy of the email to emails defined in SEND_EXTRA_ORDER_EMAILS_TO. I'm assuming that is the copy that will go to the store staff and be used to manually process the order. However, the same information is being sent to the customer, and I'm not sure how happy they will be to see their cc number. You could create a separate email with the extra information just for the store owner, but that would be a pretty major modification and I have no way to test it.

To add the info to the existing email I would try replacing:
Code: [ Select ]
  $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
          EMAIL_SEPARATOR . "\n";
  1.   $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
  2.           EMAIL_SEPARATOR . "\n";

with:
Code: [ Select ]
$email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
    EMAIL_SEPARATOR . "\n" .
    $order->info['cc_type'] . "\n" .
    EMAIL_SEPARATOR . "\n" .
    $order->info['cc_owner'] . "\n" .
    EMAIL_SEPARATOR . "\n" .
    $order->info['cc_number'] . "\n" .
    EMAIL_SEPARATOR . "\n" .
    $order->info['cc_expires'] . "\n" .
    EMAIL_SEPARATOR . "\n";
  1. $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
  2.     EMAIL_SEPARATOR . "\n" .
  3.     $order->info['cc_type'] . "\n" .
  4.     EMAIL_SEPARATOR . "\n" .
  5.     $order->info['cc_owner'] . "\n" .
  6.     EMAIL_SEPARATOR . "\n" .
  7.     $order->info['cc_number'] . "\n" .
  8.     EMAIL_SEPARATOR . "\n" .
  9.     $order->info['cc_expires'] . "\n" .
  10.     EMAIL_SEPARATOR . "\n";


To create a second email for the store owner only I would leave the existing confirmation email code alone, copy and paste it a second time after the script sends the first email and before the additional emails are sent. I would modify the copied section with the new code.
  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

Quote:
You're probably already aware of this but if I'm reading this correctly, the script is set up to send a confirmation email to the customer and a copy of the email to emails defined in SEND_EXTRA_ORDER_EMAILS_TO. I'm assuming that is the copy that will go to the store staff and be used to manually process the order. However, the same information is being sent to the customer, and I'm not sure how happy they will be to see their cc number.


Yep -- completely aware of that as currently I have defined for all emails to go to my address and understand your point fully. I have been thinking hard about a work-a-round for that. (*grins -- that will probably be one of my next questions!)

I will try your suggestion over the weekend when I have more time.

Thanks.
  • b_heyer
  • Web Master
  • Web Master
  • User avatar
  • Posts: 4581
  • Loc: Maryland

Post 3+ Months Ago

you could probably copy and paste and hardcode your email into there... that way it'd send two one without cc to the person and another with to you.
  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

I think I understand that b_heyer. I'll take a look at it.

In the meantime, should I also assume that I'll have to define additional variables in this include file for the additions I need?

Code: [ Select ]
<?php
/*
 $Id: checkout_process.php,v 1.26 2002/11/01 04:22:05 hpdl Exp $

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

 Copyright (c) 2002 osCommerce

 Released under the GNU General Public License
*/

define('EMAIL_TEXT_SUBJECT', 'Order Process');
define('EMAIL_TEXT_ORDER_NUMBER', 'Order Number:');
define('EMAIL_TEXT_INVOICE_URL', 'Detailed Invoice:');
define('EMAIL_TEXT_DATE_ORDERED', 'Date Ordered:');
define('EMAIL_TEXT_PRODUCTS', 'Products');
define('EMAIL_TEXT_SUBTOTAL', 'Sub-Total:');
define('EMAIL_TEXT_TAX', 'Tax:    ');
define('EMAIL_TEXT_SHIPPING', 'Shipping: ');
define('EMAIL_TEXT_TOTAL', 'Total:  ');
define('EMAIL_TEXT_DELIVERY_ADDRESS', 'Delivery Address');
define('EMAIL_TEXT_BILLING_ADDRESS', 'Billing Address');
define('EMAIL_TEXT_PAYMENT_METHOD', 'Payment Method');

define('EMAIL_SEPARATOR', '------------------------------------------------------');
define('TEXT_EMAIL_VIA', 'via');
?>
  1. <?php
  2. /*
  3.  $Id: checkout_process.php,v 1.26 2002/11/01 04:22:05 hpdl Exp $
  4.  osCommerce, Open Source E-Commerce Solutions
  5.  http://www.oscommerce.com
  6.  Copyright (c) 2002 osCommerce
  7.  Released under the GNU General Public License
  8. */
  9. define('EMAIL_TEXT_SUBJECT', 'Order Process');
  10. define('EMAIL_TEXT_ORDER_NUMBER', 'Order Number:');
  11. define('EMAIL_TEXT_INVOICE_URL', 'Detailed Invoice:');
  12. define('EMAIL_TEXT_DATE_ORDERED', 'Date Ordered:');
  13. define('EMAIL_TEXT_PRODUCTS', 'Products');
  14. define('EMAIL_TEXT_SUBTOTAL', 'Sub-Total:');
  15. define('EMAIL_TEXT_TAX', 'Tax:    ');
  16. define('EMAIL_TEXT_SHIPPING', 'Shipping: ');
  17. define('EMAIL_TEXT_TOTAL', 'Total:  ');
  18. define('EMAIL_TEXT_DELIVERY_ADDRESS', 'Delivery Address');
  19. define('EMAIL_TEXT_BILLING_ADDRESS', 'Billing Address');
  20. define('EMAIL_TEXT_PAYMENT_METHOD', 'Payment Method');
  21. define('EMAIL_SEPARATOR', '------------------------------------------------------');
  22. define('TEXT_EMAIL_VIA', 'via');
  23. ?>
  • b_heyer
  • Web Master
  • Web Master
  • User avatar
  • Posts: 4581
  • Loc: Maryland

Post 3+ Months Ago

well you could add
Code: [ Select ]
define('EMAIL_TEXT_CC_NUM', 'Credit Card Number:');


and such but that would just be used for adding to the looks of the email like this:

Code: [ Select ]
$email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
  EMAIL_SEPARATOR . "\n" .
  EMAIL_TEXT_CC_NUM . "\n" .
  $order->info['cc_number'] . "\n" .
  1. $email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
  2.   EMAIL_SEPARATOR . "\n" .
  3.   EMAIL_TEXT_CC_NUM . "\n" .
  4.   $order->info['cc_number'] . "\n" .


Also you could try writing up a bidirectional encoding script for the credit card number. I'd be willing to do that just because it sounds fun! :-P :-D
  • RichB
  • Guru
  • Guru
  • User avatar
  • Posts: 1121
  • Loc: Boston

Post 3+ Months Ago

Ok, I just ran a test with a modified checkout_process.php and it sent the correct emails to customer and store with the store having the credit card information appended to the bottom of a copy of the customer email.

To test it insert the following code on line 259 of checkout_process.php:

Code: [ Select ]
//-------------------------------------------
 $email_order2 = 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_order2 .= tep_db_output($order->info['comments']) . "\n\n";
 }
 $email_order2 .= EMAIL_TEXT_PRODUCTS . "\n" .
         EMAIL_SEPARATOR . "\n" .
         $products_ordered .
         EMAIL_SEPARATOR . "\n";

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

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

 $email_order2 .= "\n" . EMAIL_TEXT_BILLING_ADDRESS . "\n" .
         EMAIL_SEPARATOR . "\n" .
         tep_address_label($customer_id, $billto, 0, '', "\n") . "\n\n";
 if (is_object($$payment)) {
$email_order2 .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
  EMAIL_SEPARATOR . "\n" .
  $order->info['cc_type'] . "\n" .
  EMAIL_SEPARATOR . "\n" .
  $order->info['cc_owner'] . "\n" .
  EMAIL_SEPARATOR . "\n" .
  $order->info['cc_number'] . "\n" .
  EMAIL_SEPARATOR . "\n" .
  $order->info['cc_expires'] . "\n" .
  EMAIL_SEPARATOR . "\n"; ;
  $payment_class = $$payment;
  $email_order2 .= $payment_class->title . "\n\n";
  if ($payment_class->email_footer) {
   $email_order2 .= $payment_class->email_footer . "\n\n";
  }
 }

//-------------------------------------------
  1. //-------------------------------------------
  2.  $email_order2 = STORE_NAME . "\n" .
  3.          EMAIL_SEPARATOR . "\n" .
  4.          EMAIL_TEXT_ORDER_NUMBER . ' ' . $insert_id . "\n" .
  5.          EMAIL_TEXT_INVOICE_URL . ' ' . tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id=' . $insert_id, 'SSL', false) . "\n" .
  6.          EMAIL_TEXT_DATE_ORDERED . ' ' . strftime(DATE_FORMAT_LONG) . "\n\n";
  7.  if ($order->info['comments']) {
  8.   $email_order2 .= tep_db_output($order->info['comments']) . "\n\n";
  9.  }
  10.  $email_order2 .= EMAIL_TEXT_PRODUCTS . "\n" .
  11.          EMAIL_SEPARATOR . "\n" .
  12.          $products_ordered .
  13.          EMAIL_SEPARATOR . "\n";
  14.  for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {
  15.   $email_order2 .= strip_tags($order_totals[$i]['title']) . ' ' . strip_tags($order_totals[$i]['text']) . "\n";
  16.  }
  17.  if ($order->content_type != 'virtual') {
  18.   $email_order2 .= "\n" . EMAIL_TEXT_DELIVERY_ADDRESS . "\n" .
  19.           EMAIL_SEPARATOR . "\n" .
  20.           tep_address_label($customer_id, $sendto, 0, '', "\n") . "\n";
  21.  }
  22.  $email_order2 .= "\n" . EMAIL_TEXT_BILLING_ADDRESS . "\n" .
  23.          EMAIL_SEPARATOR . "\n" .
  24.          tep_address_label($customer_id, $billto, 0, '', "\n") . "\n\n";
  25.  if (is_object($$payment)) {
  26. $email_order2 .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .
  27.   EMAIL_SEPARATOR . "\n" .
  28.   $order->info['cc_type'] . "\n" .
  29.   EMAIL_SEPARATOR . "\n" .
  30.   $order->info['cc_owner'] . "\n" .
  31.   EMAIL_SEPARATOR . "\n" .
  32.   $order->info['cc_number'] . "\n" .
  33.   EMAIL_SEPARATOR . "\n" .
  34.   $order->info['cc_expires'] . "\n" .
  35.   EMAIL_SEPARATOR . "\n"; ;
  36.   $payment_class = $$payment;
  37.   $email_order2 .= $payment_class->title . "\n\n";
  38.   if ($payment_class->email_footer) {
  39.    $email_order2 .= $payment_class->email_footer . "\n\n";
  40.   }
  41.  }
  42. //-------------------------------------------


and then change the variable $email_order to $email_order2 in:

Code: [ Select ]
// send emails to other people
 if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
  tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
 }
  1. // send emails to other people
  2.  if (SEND_EXTRA_ORDER_EMAILS_TO != '') {
  3.   tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);
  4.  }


Just in case you have a different copy of checkout_process.php you want to insert the new code just after:

Code: [ Select ]
 tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);


the added code just creates an identical email between the first and second sendings with the extra credit info.
  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

Wow...I actually understand that! *lol

For what it's worth, I spoke with RichB briefly about it in PM and he thinks he has the solution so I'll wait for his post and go from there. Thanks so much.

It would have been much easier, if they had a payment gateway they wanted to use, but I'm stuck doing it this way for the moment.
  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

Thanks RichB, I will work on that tonight and continue tomorrow if needed. I think I can get it with that info. I owe ya one.
  • RichB
  • Guru
  • Guru
  • User avatar
  • Posts: 1121
  • Loc: Boston

Post 3+ Months Ago

No problem. Let me know if you want the whole modified file.
  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

Thanks for the offer RichB. Let me try to get it like you posted it first. I learn better that way. If I can't I'll ask. I'm running out of time on this. I'll update you all soon. Thanks.
  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

RichB - just wanted to update you and let you know it worked perfectly, and the results were exactly what I wanted. Thank you. I am in your debt.

Count on the fact that I'll study what you did to understand it.
  • RichB
  • Guru
  • Guru
  • User avatar
  • Posts: 1121
  • Loc: Boston

Post 3+ Months Ago

You're welcome. I've been meaning to look into online commerce applications, and this encouraged me to download and start examining one in some detail. I find it much easier to learn when I have a specific problem to solve rather than just aimlessly poking around.
  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

Yep - Right there with ya on that one. You hit that one right on the head.
  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

After I speant close to 50 hours researching, testing and experimenting with multiple ASP carts that never worked right (only 30 hours of which I'm getting paid for since I'm a subcontractor on this one and that was the agreed upon number), and then getting everything together with OSCommerce, bugging you guys and wasting your time --- I get an email from the client today asking if there's a way to do it so the customer doesn't have to set up an account or log in! *lol Then he tells me what he really wants.

To make a long story short he doesn't need a cart, he needs a form!


--------------------------------------------
The redeeming part is I still get paid in spite of his non-ability to communicate what he wants, I learned some great code stuff here and elsewhere from all this, I know to skip asp carts in the future, and I should be getting another contract job out of the deal. Overall I did OK.
  • b_heyer
  • Web Master
  • Web Master
  • User avatar
  • Posts: 4581
  • Loc: Maryland

Post 3+ Months Ago

well if you need inventory the cart will still work and may just be easier. I am not sure if there is a way to turn off logging in, but I'd imagine there should be.

Bummer regardless, but kudos to the wasted money on you! :-P (you benefited by learning and getting the dough for it! whoo! my kinda job... ;))
  • ATNO/TW
  • Super Moderator
  • Super Moderator
  • User avatar
  • Posts: 23456
  • Loc: Woodbridge VA

Post 3+ Months Ago

Yep! I'll take it. But no sense in pursuing server-side programming further. (He only has 4 items that can be handled with a form - not worth the effort anymore) A simple form will do what he wants, and the kicker is I could have done it in about 3 hours if he'd have told me that 3 or 4 weeks ago.

Post Information

  • Total Posts in this topic: 24 posts
  • Users browsing this forum: No registered users and 139 guests
  • You cannot post new topics in this forum
  • You cannot reply to topics in this forum
  • You cannot edit your posts in this forum
  • You cannot delete your posts in this forum
  • You cannot post attachments in this forum
 
 

© 1998-2014. Ozzu® is a registered trademark of Unmelted, LLC.