Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

paypal trouble, please melp!


cxixer

Recommended Posts

I just opened the store to the public, and got an order. The only payment I'm accepting is paypal, so I get a payment through paypal with the subject "Able Audio Online Retail Store", and nothing else. There's no description of the products he ordered, and under the admin page, under "orders" it does not say there were any orders. Why is this, and how do I make sure this does not happen again?

Link to comment
Share on other sites

The customer did not fully complete the order process after visiting Paypal. It's a common occurrence, the best solution is to install the paypal IPN contribution. In the mean time, to get your order from the customer, you could install a master password, login as the customer, and see what's in the cart. Ideally you could push the order through with a payment method that doesn't require instant payment, like cheque/money order. If you were really on the ball, you'd edit the language file so it shows up as Paid by Paypal on the invoice and confirmation emal, rather than cheque.

 

Jeremy

Link to comment
Share on other sites

I just had the same problem. I then logged in and made a purchase from myself using a second paypal account. I went all the way through the process and PayPal said it was paid. I cannot see what elese a customer could do to complete the order. Any advice on what instructins to give the customer?

 

Thanks,

Link to comment
Share on other sites

If they click "return to merchant", the order processes and goes through. Other than that, it wont as far as I can tell. Anyone have more info on this paypal IPN thing? I downloaded and installed the one I found to be newest, but it doesn't seem to change anything. Any info on this subject is appreciated.

Link to comment
Share on other sites

If they click "return to merchant", the order processes and goes through. Other than that, it wont as far as I can tell. Anyone have more info on this paypal IPN thing? I downloaded and installed the one I found to be newest, but it doesn't seem to change anything. Any info on this subject is appreciated.

 

 

Yes I have paypal IPN up and working fine. It will in the current version enter all database info, so you can see after a paypal payment what the customer has ordered. If the customer doesn't click on finish, there will be no email though, but you can see the order in admin. I modded this so the email is sent before the payment is made, specifying it is only valid after payment. For this, you have to move the email to the function confirmation.

 

I enclose my file in case you would like to use it. If you want to add text that this is only a pro forma confirmation, do so at the end of the email specification.

 

this is my paypal_ipn file in the modules folder:

 

<?php

/*

 $Id: paypal_ipn.php,v 1.1.2.11 2004/12/05 19:14:35 hpdl Exp $

 

 osCommerce, Open Source E-Commerce Solutions

 http://www.oscommerce.com

 

 Copyright (c) 2004 osCommerce

 

 Released under the GNU General Public License

*/

 

 class paypal_ipn {

   var $code, $title, $description, $enabled, $identifier;

 

// class constructor

   function paypal_ipn() {

     global $order;

 

     $this->code = 'paypal_ipn';

     $this->title = MODULE_PAYMENT_PAYPAL_IPN_TEXT_TITLE;

     $this->description = MODULE_PAYMENT_PAYPAL_IPN_TEXT_DESCRIPTION;

     $this->sort_order = MODULE_PAYMENT_PAYPAL_IPN_SORT_ORDER;

     $this->enabled = ((MODULE_PAYMENT_PAYPAL_IPN_STATUS == 'True') ? true : false);

     $this->identifier = 'osCommerce PayPal IPN v1.0';

 

     if ((int)MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID > 0) {

       $this->order_status = MODULE_PAYMENT_PAYPAL_IPN_PREPARE_ORDER_STATUS_ID;

     }

 

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

 

     $this->email_footer = MODULE_PAYMENT_PAYPAL_IPN_TEXT_EMAIL_FOOTER;

 

     if (MODULE_PAYMENT_PAYPAL_IPN_GATEWAY_SERVER == 'Live') {

       $this->form_action_url = 'https://www.paypal.com/cgi-bin/webscr';

     } else {

       $this->form_action_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';

     }

   }

 

// class methods

   function update_status() {

     global $order;

 

// disable the module if the order only contains virtual products

     if ($this->enabled == true) {

       global $cart;

       if ($cart->show_total() == 0.00) {

         $this->enabled = false;

       }

     }

 

     if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_IPN_ZONE > 0) ) {

       $check_flag = false;

       $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_IPN_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");

       while ($check = tep_db_fetch_array($check_query)) {

         if ($check['zone_id'] < 1) {

           $check_flag = true;

           break;

         } elseif ($check['zone_id'] == $order->billing['zone_id']) {

           $check_flag = true;

           break;

         }

       }

 

       if ($check_flag == false) {

         $this->enabled = false;

       }

     }

   }

 

   function javascript_validation() {

     return false;

   }

 

   function selection() {

     return array('id' => $this->code,

                  'module' => $this->title);

   }

 

   function pre_confirmation_check() {

     return false;

   }

 

   function confirmation() {

     global $cartID, $cart_PayPal_IPN_ID, $customer_id, $languages_id, $order, $order_total_modules, $sendto, $billto, $payment, $currencies, $cart, $language;

     global $$payment;

 

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

 

     if (tep_session_is_registered('cartID')) {

       $insert_order = false;

 

       if (tep_session_is_registered('cart_PayPal_IPN_ID')) {

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

 

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

         $curr = tep_db_fetch_array($curr_check);

 

         if ( ($curr['currency'] != $order->info['currency']) || ($cartID != substr($cart_PayPal_IPN_ID, 0, strlen($cartID))) ) {

           $check_query = tep_db_query('select orders_id from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '" limit 1');

 

           if (tep_db_num_rows($check_query) < 1) {

             tep_db_query('delete from ' . TABLE_ORDERS . ' where orders_id = "' . (int)$order_id . '"');

             tep_db_query('delete from ' . TABLE_ORDERS_TOTAL . ' where orders_id = "' . (int)$order_id . '"');

             tep_db_query('delete from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '"');

             tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS . ' where orders_id = "' . (int)$order_id . '"');

             tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . ' where orders_id = "' . (int)$order_id . '"');

             tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_DOWNLOAD . ' where orders_id = "' . (int)$order_id . '"');

           }

 

           $insert_order = true;

         }

       } else {

         $insert_order = true;

       }

 

       if ($insert_order == true) {

    $order_totals = array();

         if (is_array($order_total_modules->modules)) {

           reset($order_total_modules->modules);

           while (list(, $value) = each($order_total_modules->modules)) {

             $class = substr($value, 0, strrpos($value, '.'));

             if ($GLOBALS[$class]->enabled) {

               for ($i=0, $n=sizeof($GLOBALS[$class]->output); $i<$n; $i++) {

                 if (tep_not_null($GLOBALS[$class]->output[$i]['title']) && tep_not_null($GLOBALS[$class]->output[$i]['text'])) {

                   $order_totals[] = array('code' => $GLOBALS[$class]->code,

                                           'title' => $GLOBALS[$class]->output[$i]['title'],

                                           'text' => $GLOBALS[$class]->output[$i]['text'],

                                           'value' => $GLOBALS[$class]->output[$i]['value'],

                                           'sort_order' => $GLOBALS[$class]->sort_order);

                 }

               }

             }

           }

         }

 

         $sql_data_array = array('customers_id' => $customer_id,

                                 'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],

                                 'customers_company' => $order->customer['company'],

                                 'customers_street_address' => $order->customer['street_address'],

                                 'customers_suburb' => $order->customer['suburb'],

                                 'customers_city' => $order->customer['city'],

                                 'customers_postcode' => $order->customer['postcode'],

                                 'customers_state' => $order->customer['state'],

                                 'customers_country' => $order->customer['country']['title'],

                                 'customers_telephone' => $order->customer['telephone'],

                                 'customers_email_address' => $order->customer['email_address'],

                                 'customers_address_format_id' => $order->customer['format_id'],

                                 'delivery_name' => $order->delivery['firstname'] . ' ' . $order->delivery['lastname'],

                                 'delivery_company' => $order->delivery['company'],

                                 'delivery_street_address' => $order->delivery['street_address'],

                                 'delivery_suburb' => $order->delivery['suburb'],

                                 'delivery_city' => $order->delivery['city'],

                                 'delivery_postcode' => $order->delivery['postcode'],

                                 'delivery_state' => $order->delivery['state'],

                                 'delivery_country' => $order->delivery['country']['title'],

                                 'delivery_address_format_id' => $order->delivery['format_id'],

                                 'billing_name' => $order->billing['firstname'] . ' ' . $order->billing['lastname'],

                                 'billing_company' => $order->billing['company'],

                                 'billing_street_address' => $order->billing['street_address'],

                                 'billing_suburb' => $order->billing['suburb'],

                                 'billing_city' => $order->billing['city'],

                                 'billing_postcode' => $order->billing['postcode'],

                                 'billing_state' => $order->billing['state'],

                                 'billing_country' => $order->billing['country']['title'],

                                 'billing_address_format_id' => $order->billing['format_id'],

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

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

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

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

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

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

         }

 

    //change from here on for stock management

    //include(DIR_WS_CLASSES . 'order_total.php');

    //$order_total_modules = new order_total;

    //$order_totals = $order_total_modules->process();

 

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

 

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

                'orders_status_id' => $order->info['order_status'],

                'date_added' => 'now()',

                'customer_notified' => (SEND_EMAILS == 'true') ? '1' : '0',

                '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

 //++++ QT Pro: Begin Changed code

   $products_stock_attributes=null;

   if (STOCK_LIMITED == 'true') {

 

 

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

 //      if (DOWNLOAD_ENABLED == 'true') {

 //++++ QT Pro: End Changed Code

     $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

 //++++ QT Pro: Begin Changed code

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

 //++++ QT Pro: End Changed Code

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

    if (tep_db_num_rows($stock_query) > 0) {

     $stock_values = tep_db_fetch_array($stock_query);

 //++++ QT Pro: Begin Changed code

     $actual_stock_bought = $order->products[$i]['qty'];

     $download_selected = false;

     if ((DOWNLOAD_ENABLED == 'true') && isset($stock_values['products_attributes_filename']) && tep_not_null($stock_values['products_attributes_filename'])) {

      $download_selected = true;

      $products_stock_attributes='$$DOWNLOAD$$';

     }

 //      If not downloadable and attributes present, adjust attribute stock

     if (!$download_selected && is_array($products_attributes)) {

      $all_nonstocked = true;

      $products_stock_attributes_array = array();

      foreach ($products_attributes as $attribute) {

       if ($attribute['track_stock'] == 1) {

        $products_stock_attributes_array[] = $attribute['option_id'] . "-" . $attribute['value_id'];

        $all_nonstocked = false;

       }

      }

      if ($all_nonstocked) {

       $actual_stock_bought = $order->products[$i]['qty'];

      }  else {

       asort($products_stock_attributes_array, SORT_NUMERIC);

       $products_stock_attributes = implode(",", $products_stock_attributes_array);

       $attributes_stock_query = tep_db_query("select products_stock_quantity from " . TABLE_PRODUCTS_STOCK . " where products_stock_attributes = '$products_stock_attributes' AND products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

       if (tep_db_num_rows($attributes_stock_query) > 0) {

        $attributes_stock_values = tep_db_fetch_array($attributes_stock_query);

        $attributes_stock_left = $attributes_stock_values['products_stock_quantity'] - $order->products[$i]['qty'];

        tep_db_query("update " . TABLE_PRODUCTS_STOCK . " set products_stock_quantity = '" . $attributes_stock_left . "' where products_stock_attributes = '" . $products_stock_attributes . "' AND products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

        $actual_stock_bought = ($attributes_stock_left < 1) ? $attributes_stock_values['products_stock_quantity'] : $order->products[$i]['qty'];

       } else {

        $attributes_stock_left = 0 - $order->products[$i]['qty'];

        tep_db_query("insert into " . TABLE_PRODUCTS_STOCK . " (products_id, products_stock_attributes, products_stock_quantity) values ('" . tep_get_prid($order->products[$i]['id']) . "', '" . $products_stock_attributes . "', '" . $attributes_stock_left . "')");

        $actual_stock_bought = 0;

       }

      }

     }

 //        $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_selected) {

      $stock_left = $stock_values['products_quantity'] - $actual_stock_bought;

      tep_db_query("UPDATE " . TABLE_PRODUCTS . "

             SET products_quantity = products_quantity - '" . $actual_stock_bought . "'

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

 //++++ QT Pro: End Changed Code

      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']) . "'");

      }

     }

    }

 //++++ QT Pro: Begin Changed code

   }

 //++++ QT Pro: End Changed Code

 

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

 

 //++++ QT Pro: Begin Changed code

   if (!isset($products_stock_attributes)) $products_stock_attributes=null;

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

               'products_stock_attributes' => $products_stock_attributes);

 //++++ QT Pro: End Changed Code

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

 

   $manufacturers_query = tep_db_query("select manufacturers_name from " . TABLE_MANUFACTURERS . " where manufacturers_id = (select manufacturers_id from " . TABLE_PRODUCTS . " where products_id = " . tep_get_prid($order->products[$i]['id']) . ")");

   $manufacturers = tep_db_fetch_array($manufacturers_query);

 

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

   $color = tep_db_fetch_array($color_query);

 

   $products_ordered .= $order->products[$i]['qty'] . ' x ' . $manufacturers['manufacturers_name'] . ' ' . $order->products[$i]['name'] . ', ';

   if (tep_not_null($color['products_color'])) {

    $products_ordered .= $color['products_color'] . ' ';

   }

   $products_ordered .= '(' . $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" .

         $order->customer['telephone'] . "\n" .

         $order->customer['email_address'] . "\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) {

   if ($payment_class->code == 'moneyorder') {

    $email_order .= sprintf($payment_class->email_footer, $order->customer['firstname'], $order->customer['lastname'], $insert_id) . "\n\n";    

   } else {

    $email_order .= $payment_class->email_footer . "\n\n";

   }

  }

 }

 $email_order .= EMAIL_TEXT_STATUS_UPDATE;

 

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

  }

   

 

         tep_session_register('cart_PayPal_IPN_ID');

         $cart_PayPal_IPN_ID = $cartID . '-' . $insert_id;

       }

     }

 

     return false;

   }

 

   function process_button() {

     global $customer_id, $order, $languages_id, $currencies, $currency, $cart_PayPal_IPN_ID, $shipping;

 

     if (MODULE_PAYMENT_PAYPAL_IPN_CURRENCY == 'Selected Currency') {

       $my_currency = $currency;

     } else {

       $my_currency = substr(MODULE_PAYMENT_PAYPAL_IPN_CURRENCY, 5);

     }

     if (!in_array($my_currency, array('CAD', 'EUR', 'GBP', 'JPY', 'USD'))) {

       $my_currency = 'USD';

     }

 

     $parameters = array();

 

     if ( (MODULE_PAYMENT_PAYPAL_IPN_TRANSACTION_TYPE == 'Per Item') && (MODULE_PAYMENT_PAYPAL_IPN_EWP_STATUS == 'False') ) {

       $parameters['cmd'] = '_cart';

       $parameters['upload'] = '1';

 

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

         $item = $i+1;

 

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

 

         $parameters['item_name_' . $item] = $order->products[$i]['name'];

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

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

         $parameters['quantity_' . $item] = $order->products[$i]['qty'];

 

         if ($i == 0) {

           if (DISPLAY_PRICE_WITH_TAX == 'true') {

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

           } else {

             $module = substr($shipping['id'], 0, strpos($shipping['id'], '_'));

             $shipping_tax = tep_get_tax_rate($GLOBALS[$module]->tax_class, $order->delivery['country']['id'], $order->delivery['zone_id']);

             $shipping_cost = $order->info['shipping_cost'] + tep_calculate_tax($order->info['shipping_cost'], $shipping_tax);

           }

 

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

         }

 

         if (isset($order->products[$i]['attributes'])) {

           for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {

             if (DOWNLOAD_ENABLED == 'true') {

               $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename

                                    from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa

                                    left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad

                                    on pa.products_attributes_id=pad.products_attributes_id

                                    where pa.products_id = '" . tep_get_prid($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 = '" . tep_get_prid($order->products[$i]['id']) . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");

             }

             $attributes_values = tep_db_fetch_array($attributes);

 

// Unfortunately PayPal only accepts two attributes per product, so the

// third attribute onwards will not be shown at PayPal

             $parameters['on' . $j . '_' . $item] = $attributes_values['products_options_name'];

             $parameters['os' . $j . '_' . $item] = $attributes_values['products_options_values_name'];

           }

         }

       }

 

       $parameters['num_cart_items'] = $item;

     } else {

       $parameters['cmd'] = '_xclick';

       $parameters['item_name'] = STORE_NAME;

       $parameters['shipping'] = number_format($order->info['shipping_cost'] * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency));

   if(MOVE_TAX_TO_TOTAL_AMOUNT == 'True') {

    // PandA.nl move tax to total amount

     $parameters['tax'] = 0;

    } else {

    // default

     $parameters['tax'] = number_format($order->info['tax'] * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency));

    }  

     }

 

     $parameters['business'] = MODULE_PAYMENT_PAYPAL_IPN_ID;

   if(MOVE_TAX_TO_TOTAL_AMOUNT == 'True') {

   // PandA.nl move tax to total amount

   $parameters['amount'] = number_format(($order->info['total'] - $order->info['shipping_cost']) * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency));

   } else {

   // default

    $parameters['amount'] = number_format(($order->info['total'] - $order->info['shipping_cost'] - $order->info['tax']) * $currencies->get_value($my_currency), $currencies->get_decimal_places($my_currency));

   }

     $parameters['currency_code'] = $my_currency;

     $parameters['invoice'] = substr($cart_PayPal_IPN_ID, strpos($cart_PayPal_IPN_ID, '-')+1);

     $parameters['custom'] = $customer_id;

     $parameters['no_shipping'] = '1';

     $parameters['no_note'] = '1';

     $parameters['notify_url'] = tep_href_link('ext/modules/payment/paypal_ipn/ipn.php', '', 'SSL', false, false);

     $parameters['return'] = tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL');

     $parameters['cancel_return'] = tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL');

     $parameters['bn'] = $this->identifier;

 

 // Add missing variables to prepopulate PayPal form.

 

  $parameters['first_name'] = $order->billing['firstname'];

  $parameters['last_name'] = $order->billing['lastname'];

  $parameters['address1'] = $order->billing['street_address'];

  $parameters['address2'] = $order->billing['suburb'];

  $parameters['city'] = $order->billing['city'];

   if ($order->billing['country']['iso_code_2']=='US') {

    $order->billing['state'] = tep_get_zone_code($order->billing['country_id'], $order->billing['zone_id'], $order->billing['state']);

   }

  $parameters['state'] = $order->billing['state'];

  $parameters['zip'] = $order->billing['postcode'];

  $parameters['country'] = $order->billing['country']['iso_code_2'];

  $parameters['email'] = $order->customer['email_address'];

  $parameters['cbt'] = 'Bestellung abschlie?en';

 

  //  End missing variable contribution.

 

     if (tep_not_null(MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE)) {

       $parameters['page_style'] = MODULE_PAYMENT_PAYPAL_IPN_PAGE_STYLE;

     }

 

     if (MODULE_PAYMENT_PAYPAL_IPN_EWP_STATUS == 'True') {

       $parameters['cert_id'] = MODULE_PAYMENT_PAYPAL_IPN_EWP_CERT_ID;

 

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

 

       $data = '';

       while (list($key, $value) = each($parameters)) {

         $data .= $key . '=' . $value . "\n";

       }

 

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

       fwrite($fp, $data);

       fclose($fp);

 

       unset($data);

 

       if (function_exists('openssl_pkcs7_sign') && function_exists('openssl_pkcs7_encrypt')) {

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

 

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

 

// remove headers from the signature

         $signed = file_get_contents(MODULE_PAYMENT_PAYPAL_IPN_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');

         $signed = explode("\n\n", $signed);

         $signed = base64_decode($signed[1]);

 

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

         fwrite($fp, $signed);

         fclose($fp);

 

   

:-)

Monika

 

addicted to writing code ... can't get enough of databases either, LOL!

 

my toolbox: Textpad - Compare and Merge - phpMyAdmin - WS_FTP - Photoshop - How to search the forum

 

Interactive Media Award July 2007 ~ category E-Commerce

my advice on the forum is for free, PMs where you send me work are considered consultation which I charge for ...

Link to comment
Share on other sites

I just opened the store to the public, and got an order. The only payment I'm accepting is paypal, so I get a payment through paypal with the subject "Able Audio Online Retail Store", and nothing else. There's no description of the products he ordered, and under the admin page, under "orders" it does not say there were any orders. Why is this, and how do I make sure this does not happen again?

Put your site in test mode.Placeit in sandbox nd do test by logging all the dat either in IPN or at success page.

 

This should help you in making sure if a customer does go thru the proper cycle are his details coming in or not

 

 

Satish Mantri

Ask/Skype for Free osCommerce value addon/SEO suggestion tips for your site.

 

Check My About US For who am I and what My company does.

Link to comment
Share on other sites

This is the very reason I signed up for this forum. :blink:

I would get P/P pmts and no orders showing up. I ended up closing the store until I could figure it out.

 

I'm completely clueless to php also and that doesn't help. Would I be able to copy the code posted above, inserting my own P/P IPN info and be good to go?

 

Could someone help a dummy out by listing the steps necessary on which files to modify to correct the PayPal issue?

 

Hugs and cookies for all. :blush:

Link to comment
Share on other sites

This is the very reason I signed up for this forum.  :blink:

I would get P/P pmts and no orders showing up. I ended up closing the store until I could figure it out.

 

I'm completely clueless to php also and that doesn't help. Would I be able to copy the code posted above, inserting my own P/P IPN info and be good to go?

 

Could someone help a dummy out by listing the steps necessary on which files to modify to correct the PayPal issue?

 

Hugs and cookies for all.  :blush:

 

 

well if you install the latest osC team Paypal IPN mod, and then move the email part to where I did in the paypal_ipn file, you should be set. You cannot copy my file as my email is heavily modded ... not only in the text part, but also as I added QTYPro.

:-)

Monika

 

addicted to writing code ... can't get enough of databases either, LOL!

 

my toolbox: Textpad - Compare and Merge - phpMyAdmin - WS_FTP - Photoshop - How to search the forum

 

Interactive Media Award July 2007 ~ category E-Commerce

my advice on the forum is for free, PMs where you send me work are considered consultation which I charge for ...

Link to comment
Share on other sites

Thank you Monika. Would it be alright to email you with some questions I have?

 

Hi Vinny, sure if it's not something you can ask here, email me :-)

:-)

Monika

 

addicted to writing code ... can't get enough of databases either, LOL!

 

my toolbox: Textpad - Compare and Merge - phpMyAdmin - WS_FTP - Photoshop - How to search the forum

 

Interactive Media Award July 2007 ~ category E-Commerce

my advice on the forum is for free, PMs where you send me work are considered consultation which I charge for ...

Link to comment
Share on other sites

The customer did not fully complete the order process after visiting Paypal.  It's a common occurrence, the best solution is to install the paypal IPN contribution.  In the mean time, to get your order from the customer, you could install a master password, login as the customer, and see what's in the cart.  Ideally you could push the order through with a payment method that doesn't require instant payment, like cheque/money order.  If you were really on the ball, you'd edit the language file so it shows up as Paid by Paypal on the invoice and confirmation emal, rather than cheque.

 

Jeremy

 

Hello Jeremy,

 

Could you please tell me which version of Paypal IPN contribution have to be installed.

 

I don't know how to create master password . I will be grateful if you could tell me how to do this.

 

Regards,

Shahin

Link to comment
Share on other sites

Archived

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

×
×
  • Create New...