Pagina 6 di 8

Inviato: 03/07/2005, 13:19
da max8
un errore che penso di aver trovato all'interno del fine Bankpass_ms.php
si riferisce al calcolo del MAC di ritorno :

Codice: Seleziona tutto

'ESITO=' . $_GET['ESITO'] . '&' .
$this->chiave_esito;
quando la pagina viene richiamata da bankpass $this->chiave_esito non ha valore e questo comparta l'inevitabile errore per il calcolo del valore MD5 della stringa di ritorno impedendo cosi il proseguimento delle procedure legare all' if MAC di ritorno = al MAC esito.

sostituendo la variabile $this-chiave_esito con il suo valore che per la fase di test è EAAYYXC3LcEj8D3uq7kREiAE9vxgFaCbpSLZqjAzA8Dx7iJrVP
il probelma si risolve ed il MAC di ritorno viene calcolato correttamente.
e la tabella Order_Bankpass viene aggiornata correttamente.

Beh.. torno a lavorarci su.

e se...

Inviato: 03/07/2005, 13:59
da nickk67
max8 ha scritto: .....
Il problema è che questa contrib indirizza il ritorno automatico al file Bankpass_ms.php che non inserisce i dati ordine all'interno della tabella orders ma si limita a confermare il pagamento all'interno della tabella bankpass_orders.

L'inserimento dei dati dell'ordine viene effettuate solo alla fine del processo di pagamento, quando l'utente preme OK e viene reindirizzato alla pagina checkout_process.php che si occupa dell'inserimento.
Ma allora, se invece di ritornare sul file Bankpass_ms.php diciamo a Bankpass di tornare su checkout_process.php, non risolviamo il problema? Chi se ne frega di aggiornare la tabella Bankpass Orders (tanto Bankpass mette a disposizione un ambiente di Backoffice per le transazioni eseguite, e basta e avanza)... quello che conta e che venga chiuso l'ordine, come avviene con le altre modalità di pagamento...

Ho scoperto l'acqua calda o ho detto una stronzata?

Inviato: 03/07/2005, 18:00
da max8
Si... ma bisogna apportare delle modifiche al file Bankpass.php che si trova nella cartella modules...

o quasi pronta una versione di prova... la pulisco e tra poco la inserisco qui sul forum...

Inviato: 03/07/2005, 18:52
da max8
Come promesso ecco il codice...

Codice: Seleziona tutto

<?php
/*

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

  Copyright (c) 2003 osCommerce

  Released under the GNU General Public License
  Credits to:
  Marco Spizzichino
  Starfarm Internet Communications srl
  <marco@starfarm.it>
  
  Modificato da Massimo Ottolini Otz
  ufotto@tin.it
  Max8 membro di www.oscommerceitalia.com
  Versione BETA 0.1
  
*/

  class bankpass {
    var $code, $title, $description, $enabled;

// class constructor
    function bankpass() {
      global $order;
      
      $this->code = 'bankpass';
      $this->title = MODULE_PAYMENT_BANKPASS_TEXT_TITLE;
      $this->description = MODULE_PAYMENT_BANKPASS_TEXT_DESCRIPTION;
      $this->sort_order = MODULE_PAYMENT_BANKPASS_SORT_ORDER;
      $this->enabled = ((MODULE_PAYMENT_BANKPASS_STATUS == 'Si') ? true : false);
      $this->production = ((MODULE_PAYMENT_BANKPASS_PRODUCTION == 'Si') ? true : false);
	  $this->crn = MODULE_PAYMENT_BANKPASS_ID;
      $this->tcontab = ((MODULE_PAYMENT_BANKPASS_TCONTAB == 'Immediata') ? 'I' : 'D');
      $this->tautor = ((MODULE_PAYMENT_BANKPASS_TAUTOR == 'Immediata') ? 'I' : 'D');
	  $this->chiave_avvio = MODULE_PAYMENT_BANKPASS_AVVIO;
	  $this->chiave_esito = MODULE_PAYMENT_BANKPASS_ESITO;
	  
      if ((int)MODULE_PAYMENT_BANKPASS_ORDER_STATUS_ID > 0) {
        $this->order_status = MODULE_PAYMENT_BANKPASS_ORDER_STATUS_ID;
      }

      if (is_object($order)) $this->update_status();
	  
	  if($this->production) {
		$this->form_action_url = 'https://sis-bankpass.ssb.it/bankpass/master/main?PAGE=MASTER';
	  } else {
	  	$this->crn = '010500000000001';
	  	$this->chiave_avvio = 'rAPu5Nto2kv76B2cPJjWhADuwjACYLELtAo3AEAYUymbkqADjA';
		$this->chiave_esito = 'EAAYYXC3LcEj8D3uq7kREiAE9vxgFaCbpSLZqjAzA8Dx7iJrVP';
	  	$this->form_action_url = 'http://sis-test-bankpass.ssb.it/bankpass/master/main?PAGE=MASTER';
	  }
    }

// class methods
    function update_status() {
      global $order, $shipping ; //modifica

      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_BANKPASS_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_BANKPASS_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() {
	/*modifica OTZ
	Aggiunge l'ordine nella tabella ORDERS prima di passarlo a BANKPASS
	Per il suo funzionamento AGGIUNGETE all'interno della Tabella  orders_status del vostro DATABASE
	una voce per specificare lo stato n4  naturalmente per tutte le lingue 
	Potrebbe essere AttesaBankPass o simile.
	Se è già presente una voce 4 e non volete usare quella create una nuova voce sempre per tutte le lingue
	e modificate 
	la riga 190 da 'orders_status' => '4' in 'orders_status' => 'numero nuova voce'
	
	*/
	   global $cartID, $Bankpass_TEMP, $customer_id, $languages_id, $order, $order_total_modules;
      $myshoptransactionID =  $customer_id . '-' . date("YmdHis"); //nomesito . '-' . tolto
      if (tep_session_is_registered('cartID')) {
        $insert_order = false;

        if (tep_session_is_registered('Bankpass_TEMP')) {
          $order_id = substr($Bankpass_TEMP, strpos($Bankpass_TEMP, '-')+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($Bankpass_TEMP, 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' => '4',
                                  '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);
          $totaleordine=$order_totals[$i]['value'];
		  }

          for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
            $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();

            $attributes_exist = '0';
            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);
                }
              }
            }
          }

          tep_session_register('Bankpass_TEMP');
          $Bankpass_TEMP = $cartID . '-' . $insert_id;
        }
      }
	//fine modifica OTZ
      return false;
    }

    function process_button() {
      global $order, $currencies, $currency, $customer_id, $languages_id;
      
      // Definizione dei campi per il form di Bankpass
      $myshoplogin = $this->crn;
      
      if (MODULE_PAYMENT_BANKPASS_CURRENCY == 'Valuta Selezionata') {
        $osc_currency = $currency;
      } else {
        $osc_currency = substr(MODULE_PAYMENT_BANKPASS_CURRENCY, 5);
      }
      if (!in_array($osc_currency, array('EUR', 'GBP', 'USD'))) {
        $osc_currency = 'EUR';
      }
      
      // Conversion of currencies in ISO codes
      // EUR -> 978, GBP -> 2, USD -> 1
      
      switch ($osc_currency) {
	case 'EUR':
	  $mycurrency =  '978';
	break;
	case 'GBP':
	  $mycurrency =  '2';
	break;
	case 'USD':
	  $mycurrency =  '1';
	break;
	default:
	  $mycurrency =  '978';
	}
      
      // verificare che la valuta predefinita siano euro		
      $myamount = round($order->info['total'] * $currencies->get_value($osc_currency) * 100);

      //id da dare alla transazione... serve per tenere traccia della transazione e verrà scritto sul db	
      $myshoptransactionID =  $customer_id . '-' . date("YmdHis"); //nomesito . '-' . tolto
	  //$myshoptransactionID = $customer_id . '-' . time();      
		          
      // Dati utente
      $mybuyername = $order->customer['firstname'] . ' ' . $order->customer['lastname'];
      $mybuyeremail = trim($order->customer['email_address']);
     
      // Lingua di risposta del gateway 
      
      if(isset($languages_id) && !empty($languages_id))
      {
        $lang_query = tep_db_query("SELECT code FROM " . TABLE_LANGUAGES . " WHERE languages_id = " . $languages_id);
        $lang = tep_db_fetch_array($lang_query);
      
        switch ($lang['code']) {
	  case "it":
	    $mylanguage= "ITA";
	  break;
	  case "en":
	    $mylanguage= "EN";
	  break;
	  default:
	    $mylanguage= "ITA";
        }
      }
      else
      {
        $mylanguage= "ITA";
      }
      
      // viene passata l'id di sessione che consente poi di recuperare i valori sotto:	
      $mycustominfo = '?' . tep_session_name() . '=' . tep_session_id();
	
	// Calcola il MAC per i dati che saranno spediti
  	  $str = 'NUMORD=' . $myshoptransactionID . '&' .
			 'IDNEGOZIO=' . $myshoplogin . '&' .
			 'IMPORTO=' . $myamount . '&' .
			 'VALUTA=' . $mycurrency . '&' .
			 'TCONTAB=' . $this->tcontab . '&' .
			 'TAUTOR=' . $this->tautor . '&' .
			 $this->chiave_avvio;
	  $MAC = md5($str);
	
      $process_button_string = 
	  	tep_draw_hidden_field('IMPORTO', $myamount) .
		tep_draw_hidden_field('VALUTA', $mycurrency) .
		tep_draw_hidden_field('NUMORD', $myshoptransactionID) .
		tep_draw_hidden_field('IDNEGOZIO', $myshoplogin) .
		tep_draw_hidden_field('URLBACK', HTTP_SERVER . DIR_WS_HTTP_CATALOG . 'checkout_process.php' . $mycustominfo) . 
		tep_draw_hidden_field('URLDONE', HTTP_SERVER . DIR_WS_HTTP_CATALOG . 'checkout_success.php' . $mycustominfo) .
		tep_draw_hidden_field('URLMS', HTTP_SERVER . DIR_WS_HTTP_CATALOG . 'checkout_process.php'. $mycustominfo) .
		tep_draw_hidden_field('TCONTAB', $this->tcontab) .
		tep_draw_hidden_field('TAUTOR', $this->tautor) .
		tep_draw_hidden_field('MAC', $MAC) .
		tep_draw_hidden_field('LINGUA', $mylanguage) .
		tep_draw_hidden_field('EMAIL', $mybuyeremail);
/*
righe 361 e 362 ora puntano a file diversi  :
esito positivo (premendo il famoso bottone OK) ora punta checkout_success.php
Esito transazione positiva ora punta a checkout_process.php e non più a Bankpass_ms.php
*/
      return $process_button_string;
    }

    function before_process() {
	/*
	Inserisco l'esito della transazione di bankPass all'interno della tabella Orders_bankpass,
	modifico lo stato dell'ordine dal precedente 4 (da AttesaBankPass) a quello specificato
	nel modulo Bankpass nel pannello amminstrativo del sito
	*/
	// Controlla che il MAC per i dati ricevuti sia corretto
		$str = 'NUMORD=' . $_GET['NUMORD'] . '&' .
			'IDNEGOZIO=' . $_GET['IDNEGOZIO'] . '&' .
			'AUT=' . $_GET['AUT'] . '&' .
			'IMPORTO=' . $_GET['IMPORTO'] . '&' .
			'VALUTA=' . $_GET['VALUTA'] . '&' .
			'IDTRANS=' . $_GET['IDTRANS'] . '&' .
			'TCONTAB=' . $_GET['TCONTAB'] . '&' .
			'TAUTOR=' . $_GET['TAUTOR'] . '&' .
			'ESITO=' . $_GET['ESITO'] . '&' .
			$this->chiave_esito;
		$checkMAC = md5($str);
		// Il MAC non e' corretto. Torniamo alla pagina per il pagamento
		if(strtolower($_GET['MAC']) != strtolower($checkMAC)) {
			Header('Location: checkout_payment.php');
			tep_exit();
		}
	
	  global $customer_id, $order, $sendto, $billto, $payment, $currencies, $cart, $Bankpass_TEMP;
      global $$payment;
		

      include(DIR_WS_CLASSES . 'order_total.php');
      $order_total_modules = new order_total;

      $order_totals = $order_total_modules->process();

      $order_id = substr($Bankpass_TEMP, strpos($Bankpass_TEMP, '-')+1);
     //modifico lo stato dell'ordine
	 tep_db_query("UPDATE orders SET orders_status  = ".$this->sort_order." WHERE orders_id  = '" . $order_id . "'");
     //aggiorno la tabella orders_bankpass
	 		$check_query = tep_db_query("select * FROM orders_bankpass WHERE shop_transaction_id= '" . $myshoptransactionID . "'");
		$check = tep_db_num_rows($check_query);
		if($check > 0) {
			tep_db_query("UPDATE orders_bankpass SET client_status = 1, customer_id = " . $customer_id . ", orders_id = " . $insert_id . " WHERE shop_transaction_id = '" . $myshoptransactionID ."'");
		} else {
			tep_db_query("INSERT INTO orders_bankpass (bank_transaction_id, shop_transaction_id, authorization_code, customer_id, orders_id, amount, client_status, date) VALUES ('" . $_GET['IDTRANS'] . "', '" .  $_GET['NUMORD'] . "','" . $_GET['AUT'] . "', " . $customer_id . "," .  $order_id . ", " . $_GET['IMPORTO']/100  . ",1," . time() . ")");
			                                                                                                                                                            //VALUES ('" . $_GET['IDTRANS'] . "', '" . $_GET['NUMORD'] . "','" . $_GET['AUT'] . "', " . $_GET['IMPORTO']/100 . ",1," . time() . ")");
		}
	 //otz

      $sql_data_array = array('orders_id' => $order_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
        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']) . "'");

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

            $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 . ' ' . $order_id . "\n" .
                     EMAIL_TEXT_INVOICE_URL . ' ' . tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id=' . $order_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
      $this->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_session_unregister('Bankpass_TEMP');

      tep_redirect(tep_href_link(FILENAME_CHECKOUT_SUCCESS, '', 'SSL'));
	//fine modifica OTZ
    }

    function after_process() {
		/* modifica OTZ non serve più perchè già fatto
		global $order, $insert_id, $customer_id;   
		// Salvo nel database i parametri della transazione
		$check_query = tep_db_query("select * FROM orders_bankpass WHERE bank_transaction_id = '" . $_GET['IDTRANS'] . "'");
		$check = tep_db_num_rows($check_query);
		if($check > 0) {
			tep_db_query("UPDATE orders_bankpass SET client_status = 1, customer_id = " . $customer_id . ", orders_id = " . $insert_id . " WHERE bank_transaction_id = '" . $_GET['IDTRANS'] ."'");
		} else {
			tep_db_query("INSERT INTO orders_bankpass (bank_transaction_id, shop_transaction_id, authorization_code, customer_id, orders_id, amount, client_status, date) VALUES ('" . $_GET['IDTRANS'] . "', '" . $_GET['NUMORD'] . "','" . $_GET['AUT'] . "', " . $customer_id . "," . $insert_id . ", " . $_GET['IMPORTO']/100 . ",1," . time() . ")");
		}
		*/
		return false;
   }

    function output_error() {
      return false;
    }

    function check() {
      if (!isset($this->_check)) {
        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_BANKPASS_STATUS'");
        $this->_check = tep_db_num_rows($check_query);
      }
      return $this->_check;
    }

    function install() {
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Valid Shipping Methods', 'MODULE_PAYMENT_BANKPASS_SHIPPING_METHODS', '', 'Select valid shipping methods for this payment module.', '6', '0', 'tep_get_shipping_modules_title', 'tep_cfg_valid_shipping_modules(', now())");    
      tep_db_query("CREATE TABLE IF NOT EXISTS orders_bankpass (
	  		bank_transaction_id varchar(50) NOT NULL default '', 
			shop_transaction_id varchar(50) NOT NULL default '', 
			authorization_code varchar(6) NOT NULL default '', 
			customer_id int(9) NOT NULL default '0', 
			orders_id int(9) NOT NULL default '0', 
			amount decimal(15,4) NOT NULL default '0.0000', 
			server_status int(1) NOT NULL default '0', 
			client_status int(1) NOT NULL default '0', 
			date int(12) NOT NULL default '0', 
			PRIMARY KEY (bank_transaction_id))");
			
       
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Abilita Modulo Bankpass', 'MODULE_PAYMENT_BANKPASS_STATUS', 'Si', 'Attivare il sistema di pagamento tramite il gateway bancario di Bankpass?', '6', '1', 'tep_cfg_select_option(array(\'Si\', \'No\'), ', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Modalita\' Produzione', 'MODULE_PAYMENT_BANKPASS_PRODUCTION', 'No', 'Attivare la modalita\' Produzione (Si) o Test (No)? In modalita\' Test il sistema utilizzera\' un CRN e delle chiavi di prova, le informazioni salvate nella configurazione del negozio non verranno utilizzate', '6', '2', 'tep_cfg_select_option(array(\'Si\', \'No\'), ', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Codice Riconoscimento Negozio (CRN)', 'MODULE_PAYMENT_BANKPASS_ID', '010500000000001', 'Identificatore del negozio del merchant assegnato dalla BANCA', '6', '3', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Chiave segreta Avvio', 'MODULE_PAYMENT_BANKPASS_AVVIO', 'rAPu5Nto2kv76B2cPJjWhADuwjACYLELtAo3AEAYUymbkqADjA', 'Chiave segreta Avvio per calcolo MAC', '6', '4', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Chiave segreta Esito', 'MODULE_PAYMENT_BANKPASS_ESITO', 'EAAYYXC3LcEj8D3uq7kREiAE9vxgFaCbpSLZqjAzA8Dx7iJrVP', 'Chiave segreta Esito per calcolo MAC', '6', '5', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Tipo di contabilizzazione', 'MODULE_PAYMENT_BANKPASS_TCONTAB', 'Immediata', 'Tipo di contabilizzazione da utilizzare per questo ordine: Differita o Immediata?', '6', '6', 'tep_cfg_select_option(array(\'Immediata\', \'Differita\'), ', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Tipo di autorizzazione', 'MODULE_PAYMENT_BANKPASS_TAUTOR', 'Immediata', 'Tipo di autorizzazione da utilizzare per questo ordine: Differita o Immediata?', '6', '7', 'tep_cfg_select_option(array(\'Immediata\', \'Differita\'), ', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Valuta transazione', 'MODULE_PAYMENT_BANKPASS_CURRENCY', 'Solo EUR', 'La valuta da utilizzare nella transazione. E\' possibile forzare l\'uso della valuta base EUR.', '6', '8', 'tep_cfg_select_option(array(\'Valuta Selezionata\',\'Solo EUR\',\'Solo USD\',\'Solo GBP\'), ', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Ordine visualizzazione.', 'MODULE_PAYMENT_BANKPASS_SORT_ORDER', '0', 'Indicare l\'ordine con il quale questa modalità di pagamento viene proposta all\'utente. 0 è il valore visualizzato per primo.', '6', '9', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Stato ordine dopo pagamento', 'MODULE_PAYMENT_BANKPASS_ORDER_STATUS_ID', '0', 'Definisce quale stato ordine attribuire all\'ordine una volta completato il pagamento.', '6', '10', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
    }

    function remove() {
      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
    }

    function keys() {
      return array(
	  	'MODULE_PAYMENT_BANKPASS_STATUS', 
		'MODULE_PAYMENT_BANKPASS_ID',
		'MODULE_PAYMENT_BANKPASS_AVVIO',
		'MODULE_PAYMENT_BANKPASS_ESITO',
		'MODULE_PAYMENT_BANKPASS_PRODUCTION', 
		'MODULE_PAYMENT_BANKPASS_CURRENCY', 
		'MODULE_PAYMENT_BANKPASS_TCONTAB', 
		'MODULE_PAYMENT_BANKPASS_TAUTOR',
		'MODULE_PAYMENT_BANKPASS_ORDER_STATUS_ID',
		'MODULE_PAYMENT_YOURPAYMENTMODULE_SHIPPING_METHODS',
		'MODULE_PAYMENT_BANKPASS_SORT_ORDER'
	  );
    }
	
	// Questa funzione calcola il MAC per la procedura di invio
	function AvvioMAC() {
	}
  }
?>

Inviato: 03/07/2005, 19:12
da max8
Inutile dire PROVIAMOLO PRIMA !!!!
ah.. se lo si prova su Localhost non funziona perchè naturalmente la
conferma di avvenuto pagamento che invia BankPass non ci arriverà mai..
Quindi fate i test direttamente OnLINE.

Molto del codice utilizzato è stato preso dal modulo PayPal_IPN
che ho installato in precedenza e non ricordo se per funzionare correttamente necessità di specifice modifiche al DB, sarebbe quindi opportuno Testare questo modulo anche su una versione Pulita.

Funzianmento :
Prima di Inoltrare l'ordine di pagamento a BankPass i "i dati Ordine" vengono inseriti nel DB tabella orders, e contrassegnati dallo stato ordine 4 (io ho utilizzato quello attesa conferma di PayPal_ipn) verificate quindi se all'interno del DB tabella Orders_status esiste la voce 4 per tutte le lingue. Se esiste lo script utilizza quella altrimenti o modificare la riga dello script come indicato.

Quando BankPass conferma il pagamento con esito positivo richiama la pagina checkout_process.php e non più Bankpass_ms che non serve più,
qui dopo aver verificato il MAC di ritorno inserisco tutti i dati BankPass nella cartella orders_bankpass e campio lo stato dell'ordine da 4 a quello definito dal pannello di controllo del modulo bankpass presente in amministrazione.

Premendo il famoso OK si ritorna alla pagina checkout_success.php,
se l'utente dovesse chiudere l'ordine risulta comunque correttamente inserito e confermato.

l'ho provato e per le prove che ho fatto funziona correttamente, sicuramente potrebbero esserci problemi nascosti Quindi vi chiedo gentilmente di collaborare al suo test.

OpenSource GNU significa libero da brevetti e liberamente utilizzabile,
Si una critica a chi vende il proprio codice che magari per gran parte si basa su opere GNU.

Bene!!!

Inviato: 04/07/2005, 9:34
da nickk67
:D

Grande MAX!!!

Appena ho un secondo, faccio anch'io qualche prova...

Inviato: 04/07/2005, 10:58
da pippo010
ok Max, ora lo provo anche io.

Grazie!!!

Inviato: 04/07/2005, 19:36
da max8
piccola modifica sul ritorno pagina :

Se il cliente cambia idea e preme il bottone torna al negozio
attualmente l'utente si vede reindirizzato alla pagina di Login!!
l'errore è dovuto alla mancanza dell osCsid dopo checkout_payment.php
nella riga 396 dove viene fatto il controllo sul MAC di ritorno

Codice: Seleziona tutto

Header('Location: checkout_payment.php');
Modificandola come segue il problema si risolve

Codice: Seleziona tutto

Header('Location: checkout_payment.php?osCsid='.$_GET['osCsid']);
Attualmente il modulo manda alla pagina di selezione BankPass dove si sceglie se pagare da conto bancario o da carta di credito.

Per passarlo direttamente al pagamento con carta di credito disogna insereire i Parametri Opzione adeguata sia nel calcolo deu Mac che nella stringa che poi verrà passata a BankPass.

Avete testato il modulo?? trovati errori ? o qualche suggerimento ??

Inviato: 07/07/2005, 13:02
da Fabione
Eccomi :D

Non ho avuto alcuna risposta da Bankpass ... :evil:

... ma ringrazio max8 per aver condiviso la nuova contri per BPW ...

... fremo per testarla a dovere ...

Grazie e a prestooooo

Inviato: 08/07/2005, 12:19
da Fabione
Ecco l'ultima risposta di BPW:

In merito alla sua richiesta desideriamo informarla che da quanto si vede sulla pagine dovrebbe funzionare, dovreste controllare cosa succede nel momento in cui ricevete la chiamata in cui si blocca l'applicazione, potrebbe essere un problema nel calcolo del MAC, se inserite qualche log potete monitorare e risalire al problema.
Nella esito del pagamento sono in corso delle modifiche e verrà modificato il pulsante "ok" con un'indicazione più chiara.

Cordiali saluti.

Servizio Clienti
BANKPASS WEB
Si Servizi S.p.A. – Gruppo Cartasi


Mi sa che la cosa positiva è che hanno capito che quel pulsante "OK" può essere ignorato ... stiamo a vedere l'evoluzione ...

... ancora non ho potuto provare la mod di max8 perchè sul sito sono già in produzione e a quanto ho letto non funziona in locale ...

... qualcuno che l'ha provata ?

Inviato: 08/07/2005, 14:32
da max8
Io per ora posso eseguire solo prove in modalità test con HTTP perchè non mi sono ancora arrivati i codici BankPass.
Per Ora non ho incontrato nessun problema, ma non ho nemmeno ricevuto nessun riscontro.

E' vero che molti sono già in produzione, ma per testarlo basta sostituire temporaneamente il modulo Bankpass.php ed effettuare il test in modalità test. Magari in un orario poco visitato.

Inviato: 10/07/2005, 16:12
da manetta
Ciao Max8,
Testerò la tua contrib oggi, ho il solo problema che, siccome ho fatto la pazzia di mettere on line una versione modificata del MS3-CVS, ne devo fare prima il porting su tale versione. L'idea mi piace anche se mi rimane il dubbio: con la tua versione si perde una funzionalità interessante di Bankpass, cioè il doppio controllo del MAC, prima da parte del cliente e poi da parte di bankpass. Leggendo il codice mi sembra di capire che perdiamo quantomeno la conferma da parte del cliente. Non sarebbe più utile continuare ad utilizzare bankpass_ms.php, ma per la funzionalità inversa, ridirezionando alla fine del file su checkout_success?
Inoltre quando arriva la conferma di bankpass su checkout_process non viene inserito nuovamente l'ordine dal modulo checkout?

Spero di riuscire a farti sapere qualcosa al più presto sulle mie prove.
Grazie per l'ottimo lavoro.
manetta.

Inviato: 10/07/2005, 19:29
da manetta
manetta ha scritto:
Inoltre quando arriva la conferma di bankpass su check_process non viene inserito nuovamente l'ordine dal modulo checkout?
Ok ho visto il redirect...a questa domanda mi rispondo da solo.

Ma me ne viene un'altra:
se hai il check dell' User Agent e/o dell'indirizzo ip abilitati la tua contrib non dovrebbe funzionare: quando Bankpass si presenta con l'id di sessione del cliente viene rimbalzato.....ancor peggio se forzi l'utilizzo dei cookie. Sbaglio?

Inviato: 12/07/2005, 10:13
da max8
Il controllo del MAC sul riotorno di Bankpass viene effettuato correttamente.
Guardando il Codice bankpass.php nella funzione beforeProcess esegue il controllo del Mac di ritorno ed in caso positivo procede altrimenti vieni reindirizzato alla pagina del pagamento.

Inviato: 18/07/2005, 15:57
da ivanb
ciao ragazzi, non so se capita solo a me o se ho sbagliato qualcosa.

ho installato il modulo per il bankpass, solo che quando dal mio sito passo su bankpass per finalizzare l'acquisto, mi danno questo errore

Errore di validazione parametri. Parametri errati o mancanti...
Result verifyMessage.
Message:213.255.61.250 - POST http://sis-test-bankpass.ssb.it/bankpas ... 5f5db228cc
Diagnosi: - Manca IMPORTO,

in pratica la variabile $myamount in bankpass.php non prende alcun valore.

chi mi consiglia sul da farsi?

ciao