Jump to content

Archived

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

lane

Ramifications of this AuthorizeNet mod?

Recommended Posts

Recently I noticed that all my Visa charges were no longer qualified, meaning I was paying 1.5% higher processing fee and loosing hundreds of dollars a month. After lots of phone calls between various entities (authnet was clueless, btw) my processor finally determined that this was because I did not have an invoice # in my authorizenet submissions. This is the standard mehod of operation for the MS2.2 ADC mod. Turns out Visa started requiring an invoice # in November of '03 but didn't notifiy everyone (big surprise, 1.5% extra during the holidays ... rrrr).

 

I tracked down the problem to being related to another problem; there are no orders created unless an order is actually accepted by the payment method. I'm not sure of the reasons behind the decision to do this, but it causes me lots of problems (which could be because all my previous cards created orders at time of payment submission, so I'm used to that method and it really helps in completing orders for customers, figuring out order problems, etc.)

 

Anyway, I think I've fixed both probems with one mod; I now get the invoice (order) # in the authorizenet submission and orders are created at time of submission instead of later. (At least for authorizenet, not sure about any other processor).

 

However, since I don't know the reasons behind why orders are only created after payment acceptance, my question is: What are the ramifications of this mod?

 

Here is the code; my mods are marked and I've included lines before and after to help place them. If you have questions let me know, be glad to help. We have a lot of mods we are trying to ready for the community, so if our marking system should be changed, now would be a good time to let us know. B)

 

in "checkout_process.php":

  require(DIR_WS_CLASSES . 'order.php');
 $order = new order;

// IFD_MOD_AUTHORIZENET 02/20/04 : BEGIN
// -- moved below --
 //if(MODULE_PAYMENT_AUTHORIZENET_STATUS == "True") {
 // include(DIR_WS_MODULES . 'authorizenet_direct.php');
 //}
// IFD_MOD_AUTHORIZENET : END

// BOF: WebMakers.com Added: Downloads Controller
 $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()', 
                         'last_modified' => 'now()',
                         'orders_status' => $order->info['order_status'], 
                         'currency' => $order->info['currency'], 
                         'currency_value' => $order->info['currency_value']);
// EOF: WebMakers.com Added: Downloads Controller

 tep_db_perform(TABLE_ORDERS, $sql_data_array);
 $insert_id = tep_db_insert_id();

// IFD -- We want to fix the authnet problem of no invoice #, this does it. (moved from just below $order = new order;
//    NOTE: side effect is that declined orders end up in the DB; which we want but might be objectionable to others

// IFD_MOD_AUTHORIZENET 02/20/04 : BEGIN
 //************************************************************
 // Authorizenet ADC Direct Connection
 // Make sure the /catalog/includes/class/order.php is included
 // and $order object is created before this!!!
 if(MODULE_PAYMENT_AUTHORIZENET_STATUS == "True") {
  include(DIR_WS_MODULES . 'authorizenet_direct.php');
 }
 //************************************************************

// 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();
// IFD_MOD_AUTHORIZENET : END

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

 

in "modules/authorizenet.php":

 

	x_Cust_ID => "$customer_id",
// IFD_MOD_AUTHORIZENET 02/20/04 : BEGIN
x_Invoice_Num => "$insert_id",
// IFD_MOD_AUTHORIZENET : END
x_First_Name => "{$order->customer['firstname']}",

Share this post


Link to post
Share on other sites

Hrm...interesting. That could explain a lot.

 

Just an FYI for you - there is a small bug in that contribution. If you use any order_total modules aside from standard shipping and totals, the amount sent to authorize.net will not include those amounts. Examples of such modules would be discounts, minimum order fees, etc. To fix that, simply look in checkout_process.php for this:

 //************************************************************
// Authorizenet ADC Direct Connection
// Make sure the /catalog/includes/class/order.php is included
// and $order object is created before this!!!
if(MODULE_PAYMENT_AUTHORIZENET_STATUS == "True") {
 include(DIR_WS_MODULES . 'authorizenet_direct.php');
}
//************************************************************

cut it and paste it down a few lines, just after this:

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


Chris Dunning

osCommerce, Contributions Moderator Team

 

Please do not send me PM! I do not read or answer these often. Use the email button instead!

 

I do NOT support contributions other than my own. Emails asking for support on other people's contributions will be ignored. Ask in the forum or contact the contribution author directly.

Share this post


Link to post
Share on other sites

Lane

 

I am having some difficulty in understanding exactly what part of the code to use and where to put it. In our checkout_process it looks a lot different. Would it be possible for me to post our file some where and have you look at it and let me know where the actual code should be put in the file?

 

Thanks

 

Mike

Share this post


Link to post
Share on other sites

Mike,

 

I could not tell from your post if it was understood, so I just want to make clear; this is not a mod ready for prime time; there is a fundamental change to when orders are posted to the DB, and I am not familiar enought with how OSC works to say that it's not going to cause a major problem somewhere.

 

That said, I'd be happy to look at your code and see how this mod would go in :)

 

Also, this mod is running on our live store and everything seems to be fine...since we do not mind that declined orders end up in the order DB. (We were surprised to note that the orders do not show up in the orders list in admin, we have to use phpMyAdmin to see them.)

Share this post


Link to post
Share on other sites
Hrm...interesting.  That could explain a lot.

 

Just an FYI for you - there is a small bug in that contribution.  If you use any order_total modules aside from standard shipping and totals, the amount sent to authorize.net will not include those amounts.  Examples of such modules would be discounts, minimum order fees, etc.  To fix that, simply look in checkout_process.php for this:

 //************************************************************
// Authorizenet ADC Direct Connection
// Make sure the /catalog/includes/class/order.php is included
// and $order object is created before this!!!
if(MODULE_PAYMENT_AUTHORIZENET_STATUS == "True") {
 include(DIR_WS_MODULES . 'authorizenet_direct.php');
}
//************************************************************

cut it and paste it down a few lines, just after this:

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

Blue,

 

Thanks for the post; I would note:

 

i. please don't consider this a contribution! (not yet; that's why it's posted here instead of under contributions). I'd like to make sure that it all works before contributing it :)

 

ii. the ADC mod is from the Authorizenet direct contribution; and the latest release (december it seemed) instructed the mod to this file be installed just after "$order = new order; which is way up above the $payment_modules->before_process(); line. (And it is a problem, I had just noticed it due to a gift voucher not working right!)

 

I've modified my code per your suggestion and it seems to work, thanks! (ie, I can now use a gift voucher and the correct amount is charged on Authorizenet). I'm also going to post this information over in the Authorizenet direct contribution support forum asap.

 

PS: Important note!

You can not move just the ADC code in your post, you must also move the " $payment_modules->before_process();" line or the page errors out incorrectly. Here is my new code:

 

  tep_db_perform(TABLE_ORDERS, $sql_data_array);
 $insert_id = tep_db_insert_id();

// IFD.COM -- We want to fix the authnet problem of no invoice #, this does it. (moved from just below $order = new order;
//   	 NOTE: side effect is that bad orders end up in the DB; which we want but might be objectionable to others

// IFD.COM_MOD_AUTHORIZENET 02/20/04 : BEGIN
 require(DIR_WS_CLASSES . 'order_total.php');
 $order_total_modules = new order_total;

 $order_totals = $order_total_modules->process();
 //************************************************************
 // Authorizenet ADC Direct Connection
 // Make sure the /catalog/includes/class/order.php is included
 // and $order object is created before this!!!
 // IFD.COM - Moved below $order_total_modules->process(); so submission has correct order total!
 //  (thanks to BlueNoteMKVI for pointing this out)
 if(MODULE_PAYMENT_AUTHORIZENET_STATUS == "True") {
  include(DIR_WS_MODULES . 'authorizenet_direct.php');
 }
 //************************************************************

// load the before_process function from the payment modules
 $payment_modules->before_process();
// IFD.COM_MOD_AUTHORIZENET : END

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

Share this post


Link to post
Share on other sites
(We were surprised to note that the orders do not show up in the orders list in admin, we have to use phpMyAdmin to see them.)

Ooops; noticed this after it was too late to edit the message to Mike; what I meant to say above was that declined orders are in the DB but do not show up in the admin orders list. So, in the admin pages the system appears to be just like before our mod; you only notice the extra orders in the DB when using phpMyAdmin or similar to look at the data.

 

Again, for us this is not a problem, and is actually the way we expected OSC to work in the first place, so yea :) Still waiting for anyone to tell me what I've mucked up...

Share this post


Link to post
Share on other sites
(We were surprised to note that the orders do not show up in the orders list in admin, we have to use phpMyAdmin to see them.)

Ooops; noticed this after it was too late to edit the message to Mike; what I meant to say above was that declined orders are in the DB but do not show up in the admin orders list. So, in the admin pages the system appears to be just like before our mod; you only notice the extra orders in the DB when using phpMyAdmin or similar to look at the data.

 

Again, for us this is not a problem, and is actually the way we expected OSC to work in the first place, so yea :) Still waiting for anyone to tell me what I've mucked up...

Thanks for the update on this. The only thing I different that I did was to only move the payment part after the DB update and it works great!

 

Thanks!

 

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

 

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

'payment_info' => $GLOBALS['payment_info'],

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

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

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

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

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

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

 

//************************************************************

// Authorizenet ADC Direct Connection

// Make sure the /catalog/includes/class/order.php is included

// and $order object is created before this!!!

if(MODULE_PAYMENT_AUTHORIZENET_STATUS) {

include(DIR_WS_MODULES . 'authorizenet_direct.php');

}

//************************************************************

 

// load the before_process function from the payment modules

$payment_modules->before_process();

 

for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {

Share this post


Link to post
Share on other sites

Anyone know why this mod prevents PayPal IPN payments from generating an "Order Process" email? These were working fine before my mod :(

 

It's even harder to track down because results are inconsistent, for instance:

 

Order #4376 pays via paypal; her paypal receipt correctly shows up as "Item #4376 - Notification of Payment" but there is no "Order Process" email generated, as there used to (and should) be.

 

Order #4377 pays via paypal; her paypal receipt only says "Notification of Payment", but the paypal payment details (in said email) show the Item # as 4377. Again, no "Order Process" email generated.

 

Anyone with a clue as to where to look at fixing the paypal issue please let me know, I really need the authorizenet fix (due to the Visa surcharge if the fix is not in place), but not having our sales people get the order process email is going to cause problems as well :(

 

In case it's not obvious, without an order proces email the sales person doesn't know what the customer ordered without going and looking in the cart admin at the order, which our sales people don't have access to. Would be nice if the PayPal "Item Title" was done the same as the Authorizenet module, so what the customer orderd could be seen in the payement email...but that's another mod for another day!

Share this post


Link to post
Share on other sites

Update on the PayPal IPN issue; i just got the emails for orders 4376 and 4377; 24 hours after the order (that's based on the send date/time, it wasn't held up in a mail queue or something). Both order emails were sent 24 hours plus 2 minutes from the order date/time.

 

Any idea why a paypal order process email would be held up like this?

 

Good news; I don't see anything out of the ordinary after using this mod for a few days, so it's looking good. If I could just figure out this remaining paypal issue I'd know if it was safe to release the mod as a contribution.

Share this post


Link to post
Share on other sites

I can't figure out where to put this code could someone help me. Here is my checkout_process file

 

<?php

/*

$Id: checkout_process.php,v 1.125 2003/02/16 13:21:43 thomasamoulton Exp $

 

osCommerce, Open Source E-Commerce Solutions

http://www.oscommerce.com

 

Copyright © 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.php, '', '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;

 

require(DIR_WS_CLASSES . 'order_total.php');

$order_total_modules = new order_total;

 

$order_totals = $order_total_modules->process();

 

//************************************************************

// Authorizenet ADC Direct Connection

// Make sure the /catalog/includes/class/order.php is included

// and $order object is created before this!!!

if(MODULE_PAYMENT_AUTHORIZENET_STATUS) {

include(DIR_WS_MODULES . 'authorizenet_direct.php');

}

//************************************************************

 

// load the before_process function from the payment modules

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

'payment_info' => $GLOBALS['payment_info'],

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

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

$order_total_modules->update_credit_account($i);//ICW ADDED FOR CREDIT CLASS SYSTEM

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

}

$order_total_modules->apply_credit();//ICW ADDED FOR CREDIT CLASS SYSTEM

// lets start with the email confirmation

if (!tep_session_is_registered('noaccount')) {

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

} else {

$email_order = STORE_NAME . "\n" .

EMAIL_SEPARATOR . "\n" .

EMAIL_TEXT_ORDER_NUMBER . ' ' . $insert_id . "\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'], 'HARBOR SALES ONLINE ORDER RECEIPT'.$INSERT_ID, nl2br($email_order),$customer['customers_id'], STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS, '');

 

// BOF: WebMakers.com Added: Include Order # in Subject and name, phone and email in body to extra emails

 

// send emails to other people

 

if (SEND_EXTRA_ORDER_EMAILS_TO != '') {

 

$email_order = $order->customer['firstname'] . ' ' . $order->customer['lastname'] . "\n" . 'Telephone: ' . $order->customer['telephone'] . "\n" . $order->customer['email_address'] . "\n\n" . $email_order;

 

 

 

tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, 'NEW - ' . EMAIL_TEXT_SUBJECT . ' #' . $insert_id, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);

 

}

 

// Include OSC-AFFILIATE

require(DIR_WS_INCLUDES . 'affiliate_checkout_process.php');

 

// load the after_process function from the payment modules

$payment_modules->after_process();

 

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

$order_total_modules->clear_posts();//ICW ADDED FOR CREDIT CLASS SYSTEM

 

tep_redirect(tep_href_link(FILENAME_CHECKOUT_SUCCESS, 'order_id='. $insert_id, 'SSL'));

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

 

require(DIR_WS_INCLUDES . 'application_bottom.php');

?>

 

Thanks

 

Mike

Share this post


Link to post
Share on other sites

Mike,

 

Your code is pretty much same as mine minus a few seperating empty lines. All you need to do is look for this line (near the top)

 

 $order_totals = $order_total_modules->process();

 

Below that you will see this code

 

 //************************************************************
// Authorizenet ADC Direct Connection
// Make sure the /catalog/includes/class/order.php is included
// and $order object is created before this!!!
if(MODULE_PAYMENT_AUTHORIZENET_STATUS) {
include(DIR_WS_MODULES . 'authorizenet_direct.php');
}
//************************************************************

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

 

Move those lines here

 

 tep_db_perform(TABLE_ORDERS, $sql_data_array);
$insert_id = tep_db_insert_id();

// THIS IS WHERE TO MOVE THE ABOVE "ADC" LINES TO

for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {

 

Note, this just moves code around so there is an order # to send, in order to get the invoice # for authorizenet to reflect this order # (and thus avoid the extra surcharge for non-qualified items) you also need to edit "modules/authorizenet.php":

 

x_Cust_ID => "$customer_id",

x_Invoice_Num => "$insert_id",    // THIS IS THE LINE TO ADD

x_First_Name => "{$order->customer['firstname']}",

 

The line

 

x_Invoice_Num => "$insert_id",

 

is the addition, and uses the ID created when the order is added to the database, which is why you have to move the ADC lines in checkout_process.php below the db add code.

 

Hope that helps!

Share this post


Link to post
Share on other sites

lane:

What do you mean exactly? You mean the database being updated with an order before the payment is confirmed with Authorize.net?

 

Austin519

Share this post


Link to post
Share on other sites

NOTE: To anyone who has added this mod and is using PayPal IPN 2.x or 3.x there is a fix you need or your PayPal orders can get confused internally. This is because that PayPal contribution (unlike the 0.98x I was using when I wrote this) creates it's own order entry in the before_process function!

 

My fix was to wrap the DB insertion code like so:

 if( $order->info['payment_method'] != 'PayPal' )
{
// BOF: WebMakers.com Added: Downloads Controller
$sql_data_array = array('customers_id' => $customer_id,
... );

tep_db_perform(TABLE_ORDERS, $sql_data_array);
$insert_id = tep_db_insert_id();
}

This update may also apply to Austin519's of AIM Consolidated contribution (not sure, I'm no longer using AuthorizeNet, switched to PayMeNow).

Share this post


Link to post
Share on other sites

×