Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    problema con carrello e transazione carta di credito

    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

  2. #2
    Com'è fatta la URLDONE?

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    intanto aggiungerei un bel

    Codice PHP:
    error_reporting(E_ALL); 
    all'inizio dello script. Se ricevi warning o messaggi di errore inattesi hai già una traccia di cosa potrebbe essere andato storto.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    URLDONE la faccio puntare allo step 3 dello script
    http://www.sito.it/front-end/home.ph...heckout&step=3
    la funzione non viene eseguita, non so perchè.
    i warning e i notice sono abilitati

  5. #5
    Originariamente inviato da blur
    URLDONE la faccio puntare allo step 3 dello script
    http://www.sito.it/front-end/home.ph...heckout&step=3
    la funzione non viene eseguita, non so perchè.
    i warning e i notice sono abilitati
    Si ma secondo me il problema sta sulle funzioni saveOrder

    In saveOrder2 non capisco come prendi l'id dell'ordine o meglio, lo capisco ma è sbagliato prenderlo in quel modo...
    poi credo non vada bene inserire l'id in sessione (perchè se scade la sessione e il cliente non ha ancora finito la procedura di pagamento?) ma piuttosto lo passerei nella URLDONE per recuperarlo in step 4.
    Comunque mi sembra decisamente incasinato il codice, dovresti cercare di circoscrivere il problema....

    Comunque ne approfitto per uscire un secondo dal tuo problema:
    Anche io sto implementando una cosa di questo tipo con bankpass ma senza carrello e ho problemi con le carte di credito di test che stanno sulla documentazione...te come li fai i test?

  6. #6
    Originariamente inviato da V1RuZ
    Si ma secondo me il problema sta sulle funzioni saveOrder

    In saveOrder2 non capisco come prendi l'id dell'ordine o meglio, lo capisco ma è sbagliato prenderlo in quel modo...
    si hai ragione, è che non saprei come fare per recuperarlo

    Comunque mi sembra decisamente incasinato il codice, dovresti cercare di circoscrivere il problema....
    non mi sembra poi così incasinato il codice, però il problema è tutto lì.
    hai capito anche tu cmq qual'è il problema
    ho problemi con le carte di credito di test che stanno sulla documentazione...te come li fai i test?
    beh, esattamente come c'è scritto nella documentazione.
    hai provato tutti i numeri? perchè ho notato anch'io che i primi 2 non funzionano.

  7. #7
    Originariamente inviato da blur
    si hai ragione, è che non saprei come fare per recuperarlo


    posso capire il codice incasinato, però il problema è tutto lì.
    hai capito anche tu cmq qual'è il problema

    beh, esattamente come c'è scritto nella documentazione.
    hai provato tutti i numeri? perchè ho notato anch'io che i primi 2 non funzionano.
    Per recuperare l'ultimo id inserito vedi: http://it.php.net/manual/it/function...-insert-id.php

    comunque io i numeri di carta li ho provati tutti ma non funzionano....

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ma in questo modo che succede se quasi contemporaneamente due utenti acquistano qualcosa? Secondo me, non va tanto bene quella query in saveOrder2. Ossia puoi sì recuperare l'id dell'ultimo ordine effettuato... ma dev'essere stato effettuato da quell'utente particolare che sta effettuando quella particolare transazione... o magari mi sono perso qualcosa (eh... il weekend...)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  9. #9
    Comunque io vedo che in step 4 recuperi l'id dell'ordine e lo metti in sessione
    $_SESSION['orderId'] = $orderId;
    ma poi non lo usi in step 3 anzi saveOrder ti restituisce un altro id. Cioè tu cerchi l'ultimo id inserito (ed è sbagliato come fai perchè se qualcuno inserisce un ordine contemporaneamente tu prendi il suo id) lo metti in sessione e dovresti andare ad inserire in tbl_order un ordine con l'id recuperato ma questo equivale a fare un update e non un insert...
    c'è qualcosa che non riesco a capire nel funzionamento...non ti pare?

  10. #10
    si lo so, quella è la funzione per recuperare l'ultimo id, ma io ho bisogno di un altra cosa...
    cmq a parte questo, fammi venire un idea del perchè non riesco a far funzionare sto benedetto step 3 proveniendo da URLDONE!!




    ps se vuoi ti passo i numeri di test che a me funzionano

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.