ciao,

sono alle prese con un problema che mi sta facendo impazzire
vi illustro brevemente la situazione.
ho un carrello in cui il cliente al momento del checkout, deve scegliere la modalità di pagamento.
Per il contrassegno/bonifico/bollettino al submit del checkout faccio eseguire una funzione in cui svuoto il carrello e inserisco l'ordine nel DB. e fin qua tutto bene.
il problema arriva con il pagamento tramite carta di credito.
mi spiego.
al submit del checkout passo tutti dati necessari al sito della banca ( uso bankpass), ma non posso far eseguire la funzione al submit del checkout perchè nel caso in cui il cliente decide di cambiare il metodo di pagamento, ritornando nella pagina del carrello, si troverebbe il carrello vuoto.
allora ho modificato la funzione in modo che se il cliente paga con carta di credito, finchè non è avvenuta la transazione il carrello non viene svuotato.
Dal sito di bankpass a transazione avvenuta, devo specificare un "URLDONE" cioè un url di ritorno al sito.
è a questo punto che, specificato un url di ritorno che punta ad una pagina, ho pensato di utilizzare quella funzione per svuotare il carrello e inserire l'ordine, ma qui avviene il problema, perchè non fa assolutamente nulla, cioè non salva il contenuto del carrello nella tabella ordini e non lo svuota!!
Codice PHP:
<?php
require_once 'library/config.php';
require_once 
'library/cart-functions.php';
require_once 
'library/checkout-functions.php';

if (
isCartEmpty()) {
    
// the shopping cart is still empty
    // so checkout is not allowed
    
header('Location: home.php?page=cart');
} else if (isset(
$_GET['step']) && (int)$_GET['step'] > && (int)$_GET['step'] <= 4) {
    
$step = (int)$_GET['step'];

    
$includeFile '';
    if (
$step == 1) {
        
$includeFile 'shippingAndPaymentInfo.php';
        
$pageTitle   'Checkout - Step 1 of 2';
    } else if (
$step == 2) {
        
$includeFile 'checkoutConfirmation.php';
        
$pageTitle   'Checkout - Step 2 of 2';
    } else if (
$step == 3) {

     
$orderId  saveOrder();
               
$orderAmount getOrderAmount($orderId);
                 
$_SESSION['orderId'] = $orderId;
                 echo  
$_SESSION['orderId'];

                 
// echo"<meta http-equiv=\"Refresh\" content=\"0;url=home.php?page=success\">";
exit;

} else if (
$step == 4) {

  
$orderId saveOrder2();
     
$orderAmount getOrderAmount($orderId);
        
$_SESSION['orderId'] = $orderId;
              
$includeFile 'bankpass.php';

}
}
else {
    
// missing or invalid step number, just redirect
     //echo"<meta http-equiv=\"Refresh\" content=\"0;url=home.php?page=cart\">";
}

?>
<script type="text/javascript" src="library/checkout.js"></script>
<?php
require_once "../include/$includeFile";

?>
come si vede dal codice, lo step 3 è quello che richiama la funzione saveOrder().
che cosa fa saveOrder()?
prende i dati dalla tabella "cart", gli inserisce nella tabella "ordini", crea l'id ordine --> $orderId = mysql_insert_id();, svuota il carrello.
e questo va bene per tutti i tipi di pagamento tranne che per la carta di credito.

io ho creato uno step 4 proprio per bypassare lo step 3, per impedire lo svuotamento del carrello prima dell'avvenuta transazione. poi dall URLDONE della banca reindirizzo il browser allo step 3 in modo fare quello che dovrebbe...che invece non fa perchè non lo so...

la funzione:
Codice PHP:
function saveOrder()
{

$cartContent getCartContent();

$numItem  count($cartContent);

   
$subTotal 0;
       for (
$i 0$i $numItem$i++) {
           
extract($cartContent[$i]);
    
$orderId        0;
   
$shippingCost $shipping;

}
    
$requiredField = array('hidShippingFirstName''hidShippingLastName''hidShippingAddress1''hidShippingCity''hidShippingState',
                                  
'hidShippingPostalCode''hidShippingPhone''hidShippingEmail');


    if (
checkRequiredPost($requiredField)) {
        
extract($_POST);

        
// make sure the first character in the
        // customer and city name are properly upper cased
        
$hidShippingFirstName ucwords($hidShippingFirstName);
        
$hidShippingLastName  ucwords($hidShippingLastName);
        
$hidShippingCity      ucwords($hidShippingCity);


        
//$cartContent = getCartContent();
        //$numItem     = count($cartContent);

        
if (!empty($_SESSION['comunicati'])) {
            
$press 'S';
        } else {
$press 'N'; }

         
$query mysql_query("SELECT id_pag, pagamento FROM tbl_pagamento WHERE id_pag = {$_SESSION['id_pag']}") or die(mysql_error());
               
$row dbFetchAssoc($query);
                 
extract($row);


        
// save order & get order id
        
$sql "INSERT INTO tbl_order(od_date, od_last_update, od_shipping_first_name, od_shipping_last_name, od_shipping_address1,
                                      od_shipping_phone, od_shipping_state, od_shipping_city, od_shipping_postal_code, od_shipping_cost, od_shipping_email, od_payment, od_press )
                VALUES (NOW(), NOW(), '
$hidShippingFirstName', '$hidShippingLastName', '$hidShippingAddress1',
                         '
$hidShippingPhone', '$hidShippingState', '$hidShippingCity', '$hidShippingPostalCode', '$shippingCost', '$hidShippingEmail', '$pagamento', '$press')";

        
$result dbQuery($sql)or die(mysql_error());

        
// get the order id
        
$orderId dbInsertId();

        if (
$orderId) {
            
// save order items
            
for ($i 0$i $numItem$i++) {
                
$sql "INSERT INTO tbl_order_item(od_id, pd_id, od_qty, od_lang_name)
                        VALUES (
$orderId{$cartContent[$i]['pd_id']}{$cartContent[$i]['ct_qty']}, '{$cartContent[$i]['lang_name']}' )";
                
$result dbQuery($sql)or die(mysql_error());
            }


                
// then remove the ordered items from cart
            
for ($i 0$i $numItem$i++) {
                
$sql "DELETE FROM tbl_cart
                        WHERE ct_id = 
{$cartContent[$i]['ct_id']}";
                
$result dbQuery($sql);
            }
        }
    }

    return 
$orderId;
}


function 
saveOrder2()
{

         
$query mysql_query("SELECT od_id FROM tbl_order ORDER BY od_id DESC LIMIT 0, 1")or die(mysql_error());
              
$row dbFetchAssoc($query);
                 
extract($row);

        
$orderId $od_id +1;

    return 
$orderId;

scusate il post kilometrico... ma dovevo scriverlo per essere il più chiaro possibile.
Spero in qualche buon anima..perchè non so dove sbattere la testa.
Grazie mille